diff --git a/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java b/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java index 2503c530b495..1fd0373825f0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java @@ -35,6 +35,7 @@ import com.intellij.psi.util.*; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.intellij.util.text.UniqueNameGenerator; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -353,6 +354,10 @@ public class PsiDiamondTypeImpl extends PsiDiamondType { } buf.append("static "); buf.append("<"); + //it's possible that constructor type parameters and class type parameters are same named: + //it's important that class type parameters names are preserved(they are first in the list), + //though constructor parameters would be renamed in case of conflicts + final UniqueNameGenerator generator = new UniqueNameGenerator(); buf.append(StringUtil.join(params, new Function() { @Override public String fun(PsiTypeParameter psiTypeParameter) { @@ -369,7 +374,7 @@ public class PsiDiamondTypeImpl extends PsiDiamondType { extendsList = " extends " + StringUtil.join(extendsListTypes, canonicalTypePresentationFun, "&"); } } - return psiTypeParameter.getName() + extendsList; + return generator.generateUniqueName(psiTypeParameter.getName()) + extendsList; } }, ", ")); buf.append(">"); @@ -430,10 +435,10 @@ public class PsiDiamondTypeImpl extends PsiDiamondType { private static PsiTypeParameter[] getAllTypeParams(PsiTypeParameterListOwner listOwner, PsiClass containingClass) { Set params = new LinkedHashSet(); + Collections.addAll(params, containingClass.getTypeParameters()); if (listOwner != null) { Collections.addAll(params, listOwner.getTypeParameters()); } - Collections.addAll(params, containingClass.getTypeParameters()); return params.toArray(new PsiTypeParameter[params.size()]); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/ConflictingNamesInConstructorAndClassTypeParameters.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/ConflictingNamesInConstructorAndClassTypeParameters.java new file mode 100644 index 000000000000..cf77fb6fe017 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/ConflictingNamesInConstructorAndClassTypeParameters.java @@ -0,0 +1,12 @@ + +interface E {} +interface A {} +class N

implements A

{ +

N(P p) {} +} + +class K { + A f(J p) { + return new N<>(p); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java index aa1efd90c51c..ce03e07c4e91 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java @@ -69,6 +69,10 @@ public class Diamond8HighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testConflictingNamesInConstructorAndClassTypeParameters() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(BASE_PATH + "/" + getTestName(false) + ".java", false, false); }