@Override
  public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
    registrar.registerReferenceProvider(Holder.PATTERN, new JavaReflectionReferenceProvider() {
      @Override
      protected PsiReference @Nullable [] getReferencesByMethod(@NotNull PsiLiteralExpression literalArgument,
                                                                @NotNull PsiReferenceExpression methodReference,
                                                                @NotNull ProcessingContext context) {

        final PsiExpression qualifier = methodReference.getQualifierExpression();
        return qualifier != null ? new PsiReference[]{new JavaLangClassMemberReference(literalArgument, qualifier)} : null;
      }
    });

    registrar.registerReferenceProvider(Holder.CLASS_PATTERN, new ReflectionClassNameReferenceProvider());

    registrar.registerReferenceProvider(Holder.METHOD_HANDLE_PATTERN, new JavaLangInvokeHandleReference.JavaLangInvokeHandleReferenceProvider());

    JavaReflectionReferenceProvider atomicProvider = new JavaReflectionReferenceProvider() {
      @Override
      protected PsiReference[] getReferencesByMethod(@NotNull PsiLiteralExpression literalArgument,
                                                     @NotNull PsiReferenceExpression methodReference,
                                                     @NotNull ProcessingContext context) {
        PsiElement parent = literalArgument.getParent();
        if (parent instanceof PsiExpressionList) {
          PsiExpression[] arguments = ((PsiExpressionList)parent).getExpressions();
          return new PsiReference[]{new JavaLangClassMemberReference(literalArgument, arguments[0])};
        }
        return PsiReference.EMPTY_ARRAY;
      }
    };
    registrar.registerReferenceProvider(Holder.ATOMIC_NUMERIC_PATTERN, atomicProvider);
    registrar.registerReferenceProvider(Holder.ATOMIC_REFERENCE_PATTERN, atomicProvider);
  }
@Override
  public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar)