diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 30897a12a7dc..cfe6b25c0646 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1238,6 +1238,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } } + + if (!myHolder.hasErrorResults()) { + myHolder.add(PsiMethodReferenceHighlightingUtil.checkRawConstructorReference(expression)); + } if (!myHolder.hasErrorResults()) { myHolder.add(HighlightUtil.checkUnhandledExceptions(expression, expression.getTextRange())); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PsiMethodReferenceHighlightingUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PsiMethodReferenceHighlightingUtil.java new file mode 100644 index 000000000000..d96a9868810e --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PsiMethodReferenceHighlightingUtil.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2013 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.codeInsight.daemon.impl.analysis; + +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.HighlightInfoType; +import com.intellij.psi.*; + +public class PsiMethodReferenceHighlightingUtil { + public static HighlightInfo checkRawConstructorReference(PsiMethodReferenceExpression expression) { + if (expression.isConstructor()) { + PsiType[] typeParameters = expression.getTypeParameters(); + if (typeParameters.length > 0) { + PsiElement qualifier = expression.getQualifier(); + if (qualifier instanceof PsiReferenceExpression) { + PsiElement resolve = ((PsiReferenceExpression)qualifier).resolve(); + if (resolve instanceof PsiClass && ((PsiClass)resolve).hasTypeParameters()) { + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression) + .descriptionAndTooltip("Raw constructor reference with explicit type parameters for constructor").create(); + } + } + } + } + return null; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawConstructorReferenceWithTypeParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawConstructorReferenceWithTypeParams.java new file mode 100644 index 000000000000..bd1577dfefa2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawConstructorReferenceWithTypeParams.java @@ -0,0 +1,13 @@ +class Test { + interface I { + Object _(); + } + static class Foo {} + static class Foo1 {} + void testAssign() { + I o = Foo::new; + I o1 = Foo1::new; + + } +} + diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index 87d8813e8f86..8eef8ab842fb 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -92,6 +92,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testRawConstructorReferenceWithTypeParams() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }