From c917bfc09b4f905093ef3764af782276b53f5100 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 7 Dec 2011 16:36:31 +0100 Subject: [PATCH] IDEA-77008 (warn about generics in qualifier reference inside type cast) --- .../compiler/JavacQuirksInspection.java | 37 +---------- .../JavacQuirksInspectionVisitor.java | 64 +++++++++++++++++++ .../compiler/RemoveElementQuickFix.java | 51 +++++++++++++++ .../advHighlighting7/JavacQuirks.java | 30 +++++++++ .../src/messages/InspectionsBundle.properties | 2 + 5 files changed, 148 insertions(+), 36 deletions(-) create mode 100644 java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java create mode 100644 java/java-impl/src/com/intellij/codeInspection/compiler/RemoveElementQuickFix.java diff --git a/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspection.java b/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspection.java index ac16e6282bf6..e3f611351f47 100644 --- a/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspection.java @@ -17,14 +17,9 @@ package com.intellij.codeInspection.compiler; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.codeInspection.InspectionsBundle; -import com.intellij.codeInspection.LocalQuickFix; -import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.codeInspection.ex.BaseLocalInspectionTool; -import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -50,36 +45,6 @@ public class JavacQuirksInspection extends BaseLocalInspectionTool { @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { - return new JavaElementVisitor() { - @Override - public void visitAnnotationArrayInitializer(final PsiArrayInitializerMemberValue initializer) { - final PsiElement lastElement = PsiTreeUtil.skipSiblingsBackward(initializer.getLastChild(), PsiWhiteSpace.class, PsiComment.class); - if (lastElement != null && PsiUtil.isJavaToken(lastElement, JavaTokenType.COMMA)) { - holder.registerProblem(lastElement, InspectionsBundle.message("inspection.compiler.javac.quirks.anno.array.comma.problem"), new RemoveCommaQuickFix()); - } - } - }; - } - - private static class RemoveCommaQuickFix implements LocalQuickFix { - @NotNull - @Override - public String getName() { - return InspectionsBundle.message("inspection.compiler.javac.quirks.anno.array.comma.fix"); - } - - @NotNull - @Override - public String getFamilyName() { - return getName(); - } - - @Override - public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { - final PsiElement psiElement = descriptor.getPsiElement(); - if (PsiUtil.isJavaToken(psiElement, JavaTokenType.COMMA)) { - psiElement.delete(); - } - } + return new JavacQuirksInspectionVisitor(holder); } } diff --git a/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java b/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java new file mode 100644 index 000000000000..947e082d844f --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java @@ -0,0 +1,64 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInspection.compiler; + +import com.intellij.codeInspection.InspectionsBundle; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.patterns.ElementPattern; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; + +import static com.intellij.patterns.PsiJavaPatterns.psiElement; + +public class JavacQuirksInspectionVisitor extends JavaElementVisitor { + private static final ElementPattern QUALIFIER_REFERENCE = + psiElement().withParent(PsiJavaCodeReferenceElement.class).withSuperParent(2, PsiJavaCodeReferenceElement.class); + + private final ProblemsHolder myHolder; + + public JavacQuirksInspectionVisitor(ProblemsHolder holder) { + myHolder = holder; + } + + @Override + public void visitAnnotationArrayInitializer(final PsiArrayInitializerMemberValue initializer) { + final PsiElement lastElement = PsiTreeUtil.skipSiblingsBackward(initializer.getLastChild(), PsiWhiteSpace.class, PsiComment.class); + if (lastElement != null && PsiUtil.isJavaToken(lastElement, JavaTokenType.COMMA)) { + final String message = InspectionsBundle.message("inspection.compiler.javac.quirks.anno.array.comma.problem"); + final String fixName = InspectionsBundle.message("inspection.compiler.javac.quirks.anno.array.comma.fix"); + myHolder.registerProblem(lastElement, message, new RemoveElementQuickFix(fixName)); + } + } + + @Override + public void visitTypeCastExpression(final PsiTypeCastExpression expression) { + final PsiTypeElement type = expression.getCastType(); + if (type != null) { + type.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitReferenceParameterList(final PsiReferenceParameterList list) { + super.visitReferenceParameterList(list); + if (QUALIFIER_REFERENCE.accepts(list)) { + final String message = InspectionsBundle.message("inspection.compiler.javac.quirks.qualifier.type.args.problem"); + final String fixName = InspectionsBundle.message("inspection.compiler.javac.quirks.qualifier.type.args.fix"); + myHolder.registerProblem(list, message, new RemoveElementQuickFix(fixName)); + } + } + }); + } + } +} diff --git a/java/java-impl/src/com/intellij/codeInspection/compiler/RemoveElementQuickFix.java b/java/java-impl/src/com/intellij/codeInspection/compiler/RemoveElementQuickFix.java new file mode 100644 index 000000000000..b514c53cf3a7 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInspection/compiler/RemoveElementQuickFix.java @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInspection.compiler; + +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +public class RemoveElementQuickFix implements LocalQuickFix { + private final String myName; + + public RemoveElementQuickFix(@NotNull @Nls final String name) { + myName = name; + } + + @NotNull + @Override + public String getName() { + return myName; + } + + @NotNull + @Override + public String getFamilyName() { + return myName; + } + + @Override + public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { + final PsiElement element = descriptor.getPsiElement(); + if (element != null) { + element.delete(); + } + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/JavacQuirks.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/JavacQuirks.java index e4fc9920ba79..e95529cd16c1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/JavacQuirks.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/JavacQuirks.java @@ -1,3 +1,20 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.lang.Object; + class C { @interface TestAnnotation { int[] value(); @@ -5,4 +22,17 @@ class C { @TestAnnotation({0, 1,}) void m() { } + + class A { + class B { + void m(T t, V v) { System.out.println(t + ", " + v); } + } + } + + void m(Object o) { + if (o instanceof A.B) { + final A.B b = (A.B)o; + b.m(null, null); + } + } } \ No newline at end of file diff --git a/platform/platform-resources-en/src/messages/InspectionsBundle.properties b/platform/platform-resources-en/src/messages/InspectionsBundle.properties index cccbbfecb224..e4e44f3db953 100644 --- a/platform/platform-resources-en/src/messages/InspectionsBundle.properties +++ b/platform/platform-resources-en/src/messages/InspectionsBundle.properties @@ -422,6 +422,8 @@ inspection.duplicates.message=Duplicate string literal found in
{ inspection.compiler.javac.quirks.name=Javac quirks inspection.compiler.javac.quirks.anno.array.comma.problem=Trailing comma in annotation array initializer may cause compilation error in some Javac versions (e.g. JDK 5 and JDK 6). inspection.compiler.javac.quirks.anno.array.comma.fix=Remove trailing comma +inspection.compiler.javac.quirks.qualifier.type.args.problem=Generics in qualifier reference may cause compilation error in some Javac versions (e.g. JDK 5 and JDK 6). +inspection.compiler.javac.quirks.qualifier.type.args.fix=Remove generic parameter inspection.root.node.title=Inspections