From 2dd4d855fb0a6d09efec2fcccbbdce982280b768 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 3 Jan 2018 20:54:16 +0100 Subject: [PATCH] compilation error fix: transform getClass()->.class (IDEA-117106) --- .../impl/analysis/HighlightFixUtil.java | 4 ++ .../ReplaceGetClassWithClassLiteralFix.java | 70 +++++++++++++++++++ .../getClass2ClassLiteral/after1.java | 7 ++ .../getClass2ClassLiteral/before1.java | 7 ++ .../ReplaceGetClassWithClassLiteralTest.java | 16 +++++ 5 files changed, 104 insertions(+) create mode 100644 java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceGetClassWithClassLiteralFix.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/after1.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/before1.java create mode 100644 java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ReplaceGetClassWithClassLiteralTest.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java index fe837a9adefc..197598d00824 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.daemon.impl.analysis; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; import com.intellij.codeInsight.daemon.impl.quickfix.ReplaceAssignmentFromVoidWithStatementIntentionAction; +import com.intellij.codeInsight.daemon.impl.quickfix.ReplaceGetClassWithClassLiteralFix; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.QuickFixFactory; import com.intellij.codeInsight.intention.impl.PriorityActionWrapper; @@ -211,6 +212,9 @@ public class HighlightFixUtil { if (place instanceof PsiReferenceExpression && refElement instanceof PsiField) { QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createCreateFieldFromUsageFix((PsiReferenceExpression)place)); } + if (place instanceof PsiReferenceExpression && place.getParent() instanceof PsiMethodCallExpression) { + ReplaceGetClassWithClassLiteralFix.registerFix((PsiMethodCallExpression)place.getParent(), errorResult); + } } private static boolean isInstanceReference(@NotNull PsiJavaCodeReferenceElement place) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceGetClassWithClassLiteralFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceGetClassWithClassLiteralFix.java new file mode 100644 index 000000000000..aa821e95f82e --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceGetClassWithClassLiteralFix.java @@ -0,0 +1,70 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ +package com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.intention.HighPriorityAction; +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.siyeh.ig.callMatcher.CallMatcher; +import com.siyeh.ig.psiutils.CommentTracker; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ReplaceGetClassWithClassLiteralFix extends LocalQuickFixAndIntentionActionOnPsiElement implements HighPriorityAction { + private String myText; + + public ReplaceGetClassWithClassLiteralFix(PsiMethodCallExpression expression) { + super(expression); + } + + @Override + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @Nullable Editor editor, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + PsiClass aClass = PsiTreeUtil.getParentOfType(startElement, PsiClass.class); + assert aClass != null; + PsiExpression classLiteral = JavaPsiFacade.getElementFactory(project).createExpressionFromText(aClass.getName() + ".class", startElement); + new CommentTracker().replaceAndRestoreComments(startElement, classLiteral); + } + + @Override + public boolean isAvailable(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + PsiClass aClass = PsiTreeUtil.getParentOfType(startElement, PsiClass.class); + if (aClass == null) return false; + String className = aClass.getName(); + if (className == null) return false; + myText = "Replace with " + className + ".class"; + return super.isAvailable(project, file, startElement, endElement); + } + + @NotNull + @Override + public String getText() { + return myText; + } + + @Nls + @NotNull + @Override + public String getFamilyName() { + return "Replace getClass() with .class literal"; + } + + public static void registerFix(PsiMethodCallExpression callExpression, HighlightInfo errorResult) { + if (callExpression.getMethodExpression().getQualifierExpression() == null && + CallMatcher.instanceCall(CommonClassNames.JAVA_LANG_OBJECT, "getClass").test(callExpression)) { + QuickFixAction.registerQuickFixAction(errorResult, new ReplaceGetClassWithClassLiteralFix(callExpression)); + } + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/after1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/after1.java new file mode 100644 index 000000000000..876e2dbf27eb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/after1.java @@ -0,0 +1,7 @@ +// "Replace with Test.class" "true" + +class Test { + static void foo() { + System.out.println(Test.class); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/before1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/before1.java new file mode 100644 index 000000000000..76bfc0f80629 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral/before1.java @@ -0,0 +1,7 @@ +// "Replace with Test.class" "true" + +class Test { + static void foo() { + System.out.println(getClass()); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ReplaceGetClassWithClassLiteralTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ReplaceGetClassWithClassLiteralTest.java new file mode 100644 index 000000000000..b47bf4e24e0d --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ReplaceGetClassWithClassLiteralTest.java @@ -0,0 +1,16 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ +package com.intellij.java.codeInsight.daemon.quickFix; + +import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase; + + +public class ReplaceGetClassWithClassLiteralTest extends LightQuickFixParameterizedTestCase { + public void test() { doAllTests(); } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/getClass2ClassLiteral"; + } +}