diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java index f980b7e3e172..9cf235c20dfe 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java @@ -640,7 +640,8 @@ public class HighlightClassUtil { } - public static HighlightInfo checkQualifiedNewOfStaticClass(PsiNewExpression expression) { + @Nullable + public static HighlightInfo checkQualifiedNew(PsiNewExpression expression) { PsiExpression qualifier = expression.getQualifier(); if (qualifier == null) return null; PsiType type = expression.getType(); @@ -652,18 +653,28 @@ public class HighlightClassUtil { return info; } PsiClass aClass = PsiUtil.resolveClassInType(type); - if (aClass != null && aClass.hasModifierProperty(PsiModifier.STATIC)) { - HighlightInfo info = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, - expression, - JavaErrorMessages.message("qualified.new.of.static.class")); - if (!aClass.isEnum()) { - IntentionAction fix = QUICK_FIX_FACTORY.createModifierListFix(aClass, PsiModifier.STATIC, false, false); - QuickFixAction.registerQuickFixAction(info, fix); + HighlightInfo info = null; + if (aClass != null) { + if (aClass.hasModifierProperty(PsiModifier.STATIC)) { + info = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, + expression, + JavaErrorMessages.message("qualified.new.of.static.class")); + if (!aClass.isEnum()) { + IntentionAction fix = QUICK_FIX_FACTORY.createModifierListFix(aClass, PsiModifier.STATIC, false, false); + QuickFixAction.registerQuickFixAction(info, fix); + } + + } else if (aClass instanceof PsiAnonymousClass) { + final PsiClass baseClass = PsiUtil.resolveClassInType(((PsiAnonymousClass)aClass).getBaseClassType()); + if (baseClass != null && baseClass.isInterface()) { + info = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, + expression, + "Anonymous class implements interface; cannot have qualifier for new"); + } } QuickFixAction.registerQuickFixAction(info, new RemoveNewQualifierFix(expression, aClass)); - return info; } - return null; + return info; } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index dbe30be7f944..4de3dad216db 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -698,7 +698,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitNewExpression(PsiNewExpression expression) { myHolder.add(HighlightUtil.checkUnhandledExceptions(expression, null)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkAnonymousInheritFinal(expression)); - if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkQualifiedNewOfStaticClass(expression)); + if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkQualifiedNew(expression)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkCreateInnerClassFromStaticContext(expression)); if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkTypeParameterInstantiation(expression)); try { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedNew.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedNew.java index 28ed2c23d5e9..b832b91dd747 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedNew.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedNew.java @@ -17,3 +17,16 @@ class b extends A { static class c {} } + +class WithAnonym { + interface I { + } + class Inner{} +} + +class WithAnonymInheritor extends WithAnonym { + { + this.new I() {}; + this.new Inner() {}; + } +} \ No newline at end of file