From 34f9ae77ba19b1b7cf2b51ca1fafe2d40ba60cc8 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 10 Dec 2012 21:33:43 +0400 Subject: [PATCH] Getting super methods correctly for inheritors of Collection, etc. --- .../SignaturesPropagationData.java | 44 +++++++++---------- .../regressions/resolveSubclassOfList.kt | 7 +++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++ 3 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/regressions/resolveSubclassOfList.kt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java index d4642c12aa6..23a5e43777c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java @@ -201,36 +201,36 @@ public class SignaturesPropagationData { List superFunctions = Lists.newArrayList(); for (HierarchicalMethodSignature superSignature : method.getPsiMethod().getHierarchicalMethodSignature().getSuperSignatures()) { PsiMethod superMethod = superSignature.getMethod(); + + PsiClass psiClass = superMethod.getContainingClass(); + assert psiClass != null; + String classFqName = psiClass.getQualifiedName(); + assert classFqName != null; + + if (!JavaToKotlinClassMap.getInstance().mapPlatformClass(new FqName(classFqName)).isEmpty()) { + List funsFromMap = JavaToKotlinMethodMap.INSTANCE.getFunctions(superMethod, containingClass); + superFunctions.addAll(funsFromMap); + continue; + } + PsiElement superDeclaration = superMethod instanceof JetClsMethod ? ((JetClsMethod) superMethod).getOrigin() : superMethod; DeclarationDescriptor superFun = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, superDeclaration); if (superFun instanceof FunctionDescriptor) { superFunctions.add(((FunctionDescriptor) superFun)); } else { - PsiClass psiClass = superMethod.getContainingClass(); - assert psiClass != null; - String fqName = psiClass.getQualifiedName(); - assert fqName != null; - - Collection platformClasses = JavaToKotlinClassMap.getInstance().mapPlatformClass(new FqName(fqName)); - if (platformClasses.isEmpty()) { - String errorMessage = "Can't find super function for " + method.getPsiMethod() + - " defined in " + method.getPsiMethod().getContainingClass(); - if (ApplicationManager.getApplication().isUnitTestMode()) { - throw new IllegalStateException(errorMessage); - } - else { - if (SystemInfo.isMac) { - LOG.error("Remove duplicates from your JDK definition\n" + errorMessage); - } - else { - LOG.error(errorMessage); - } - } + String errorMessage = "Can't find super function for " + method.getPsiMethod() + + " defined in " + method.getPsiMethod().getContainingClass(); + if (ApplicationManager.getApplication().isUnitTestMode()) { + throw new IllegalStateException(errorMessage); } else { - List funsFromMap = JavaToKotlinMethodMap.INSTANCE.getFunctions(superMethod, containingClass); - superFunctions.addAll(funsFromMap); + if (SystemInfo.isMac) { + LOG.error("Remove duplicates from your JDK definition\n" + errorMessage); + } + else { + LOG.error(errorMessage); + } } } } diff --git a/compiler/testData/diagnostics/tests/regressions/resolveSubclassOfList.kt b/compiler/testData/diagnostics/tests/regressions/resolveSubclassOfList.kt new file mode 100644 index 00000000000..93f595a6f9a --- /dev/null +++ b/compiler/testData/diagnostics/tests/regressions/resolveSubclassOfList.kt @@ -0,0 +1,7 @@ +import java.util.ArrayList + +fun foo(p: java.util.List) { + p.iterator(); // forcing resolve of java.util.List.iterator() + + ArrayList().iterator(); // this provoked exception in SignaturesPropagationData +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index b87f789f49b..95b9242dec8 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3390,6 +3390,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/regressions/OverrideResolution.kt"); } + @TestMetadata("resolveSubclassOfList.kt") + public void testResolveSubclassOfList() throws Exception { + doTest("compiler/testData/diagnostics/tests/regressions/resolveSubclassOfList.kt"); + } + @TestMetadata("SpecififcityByReceiver.kt") public void testSpecififcityByReceiver() throws Exception { doTest("compiler/testData/diagnostics/tests/regressions/SpecififcityByReceiver.kt");