From 33a583584b46d0dafc2df7f65f9efe248cc5eb7e Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 25 Feb 2013 18:41:22 +0100 Subject: [PATCH] do not apply substitutor twice (IDEA-101752) --- .../psi/HierarchicalMethodSignature.java | 11 +++++++++- .../interfaceMethods/CyclicSubstitutor.java | 22 +++++++++++++++++++ .../Interface8MethodsHighlightingTest.java | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/CyclicSubstitutor.java diff --git a/java/java-psi-api/src/com/intellij/psi/HierarchicalMethodSignature.java b/java/java-psi-api/src/com/intellij/psi/HierarchicalMethodSignature.java index 3c920d38a5e6..8de679aae04a 100644 --- a/java/java-psi-api/src/com/intellij/psi/HierarchicalMethodSignature.java +++ b/java/java-psi-api/src/com/intellij/psi/HierarchicalMethodSignature.java @@ -29,9 +29,18 @@ import java.util.List; public abstract class HierarchicalMethodSignature extends MethodSignatureBackedByPsiMethod { public HierarchicalMethodSignature(@NotNull MethodSignatureBackedByPsiMethod signature) { super(signature.getMethod(), signature.getSubstitutor(), signature.isRaw(), - signature.getParameterTypes(), signature.getTypeParameters()); + getParameterTypes(signature.getMethod()), signature.getTypeParameters()); } + private static PsiType[] getParameterTypes(PsiMethod method) { + final PsiParameter[] parameters = method.getParameterList().getParameters(); + final PsiType[] paramTypes = new PsiType[parameters.length]; + for (int i = 0; i < paramTypes.length; i++) { + paramTypes[i] = parameters[i].getType(); + } + return paramTypes; + } + /** * Returns the list of super method signatures for the specified signature. * diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/CyclicSubstitutor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/CyclicSubstitutor.java new file mode 100644 index 000000000000..80d0e5e96b53 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/CyclicSubstitutor.java @@ -0,0 +1,22 @@ +public interface Iso { + T deply(R r); + + default Iso inverse() { + final Iso z = this; + return new Iso() { + @Override + public R deply(T t) { + throw null; + } + }; + } + + static Iso inverse(Iso z) { + return new Iso() { + @Override + public R deply(T t) { + throw null; + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java index 4562a63e62d0..1b158ef45779 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java @@ -29,6 +29,7 @@ public class Interface8MethodsHighlightingTest extends LightDaemonAnalyzerTestCa public void testExtensionMethods() { doTest(false, false); } public void testInheritDefaultMethodInInterface() { doTest(false, false); } public void testStaticMethodsInFunctionalInterface() { doTest(false, false); } + public void testCyclicSubstitutor() { doTest(false, false); } public void testExtensionMethodSyntax() { enableInspectionTools(DeprecatedDefenderSyntaxInspection.class);