From 3c7d4134562c5d8469daa0195ceb60e7b038d58a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 20 Feb 2013 17:16:52 +0400 Subject: [PATCH] Disabled super functions checking on error types. --- .../java/resolver/JavaFunctionResolver.java | 43 ++++++++++++++++--- .../jet/lang/resolve/MemberComparator.java | 13 +++++- .../loadJavaCustom/errorTypes/ErrorTypes.txt | 15 +++++++ .../errorTypes/test/ErrorTypes.java | 17 ++++++++ .../jet/jvm/compiler/LoadJavaCustomTest.java | 6 +-- 5 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/loadJavaCustom/errorTypes/ErrorTypes.txt create mode 100644 compiler/testData/loadJavaCustom/errorTypes/test/ErrorTypes.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index e5a092c29ae..5fd1d0c797b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -38,10 +38,7 @@ import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers; import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.SubstitutionUtils; -import org.jetbrains.jet.lang.types.TypeSubstitutor; -import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -197,7 +194,9 @@ public final class JavaFunctionResolver { throw new IllegalStateException("non-static method in subclass"); } - if (!RawTypesCheck.hasRawTypesInHierarchicalSignature(psiMethod) && JavaMethodSignatureUtil.isMethodReturnTypeCompatible(psiMethod)) { + if (!RawTypesCheck.hasRawTypesInHierarchicalSignature(psiMethod) + && JavaMethodSignatureUtil.isMethodReturnTypeCompatible(psiMethod) + && !containsErrorType(superFunctions, functionDescriptorImpl)) { if (signatureErrors.isEmpty()) { checkFunctionsOverrideCorrectly(method, superFunctions, functionDescriptorImpl); } @@ -364,4 +363,38 @@ public final class JavaFunctionResolver { } return (methodName.equals("values") && methodTypeParameters.isEmpty()); } + + private static boolean containsErrorType(@NotNull List superFunctions, @NotNull FunctionDescriptor function) { + if (containsErrorType(function)) { + return true; + } + + for (FunctionDescriptor superFunction : superFunctions) { + if (containsErrorType(superFunction)) { + return true; + } + } + + return false; + } + + private static boolean containsErrorType(@NotNull FunctionDescriptor function) { + if (ErrorUtils.containsErrorType(function.getReturnType())) { + return true; + } + for (ValueParameterDescriptor parameter : function.getValueParameters()) { + if (ErrorUtils.containsErrorType(parameter.getType())) { + return true; + } + } + for (TypeParameterDescriptor parameter : function.getTypeParameters()) { + for (JetType upperBound : parameter.getUpperBounds()) { + if (ErrorUtils.containsErrorType(upperBound)) { + return true; + } + } + } + + return false; + } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MemberComparator.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MemberComparator.java index cefbb129cf5..09eecdc7a51 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MemberComparator.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MemberComparator.java @@ -112,6 +112,17 @@ public class MemberComparator implements Comparator { } } - return c1TypeParameters.size() - c2TypeParameters.size(); + int typeParametersCompareTo = c1TypeParameters.size() - c2TypeParameters.size(); + if (typeParametersCompareTo != 0) { + return typeParametersCompareTo; + } + + if (c1 instanceof CallableMemberDescriptor && c2 instanceof CallableMemberDescriptor) { + CallableMemberDescriptor.Kind c1Kind = ((CallableMemberDescriptor) c1).getKind(); + CallableMemberDescriptor.Kind c2Kind = ((CallableMemberDescriptor) c2).getKind(); + return c1Kind.ordinal() - c2Kind.ordinal(); + } + + return 0; } } diff --git a/compiler/testData/loadJavaCustom/errorTypes/ErrorTypes.txt b/compiler/testData/loadJavaCustom/errorTypes/ErrorTypes.txt new file mode 100644 index 00000000000..ba986fa307a --- /dev/null +++ b/compiler/testData/loadJavaCustom/errorTypes/ErrorTypes.txt @@ -0,0 +1,15 @@ +package test + +public trait ErrorTypes : java.lang.Object { + + public trait Sub : test.ErrorTypes.Super { + public abstract fun errorTypeInParameter(/*0*/ list : jet.List?>?) : Unit + public abstract override /*1*/ /*fake_override*/ fun errorTypeInParameter(/*0*/ list : jet.List?>?) : Unit + public abstract override /*1*/ fun returnErrorType() : [ERROR : Unresolved java class: T] + } + + public trait Super : java.lang.Object { + public abstract fun errorTypeInParameter(/*0*/ list : jet.List?>?) : Unit + public abstract fun returnErrorType() : [ERROR : Unresolved java class: T] + } +} diff --git a/compiler/testData/loadJavaCustom/errorTypes/test/ErrorTypes.java b/compiler/testData/loadJavaCustom/errorTypes/test/ErrorTypes.java new file mode 100644 index 00000000000..a7c83302c3e --- /dev/null +++ b/compiler/testData/loadJavaCustom/errorTypes/test/ErrorTypes.java @@ -0,0 +1,17 @@ +package test; + +import java.util.List; + +public interface ErrorTypes { + interface Super { + void errorTypeInParameter(List list); + + T returnErrorType(); + } + + interface Sub extends Super { + void errorTypeInParameter(List list); + + T returnErrorType(); + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java index 5267c940720..00f5195fd34 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java @@ -187,9 +187,9 @@ public final class LoadJavaCustomTest extends KotlinTestWithEnvironment { doTestNoCompile(dir + "ReturnNotSubtype.txt", dir); } - public void testWrongNumberOfGenericParameters() throws Exception { - String dir = PATH + "/errors/"; - doTestNoCompile(dir + "WrongNumberOfGenericParameters.txt", dir); + public void testErrorTypes() throws Exception { + String dir = PATH + "/errorTypes/"; + doTestNoCompile(dir + "ErrorTypes.txt", dir); } public static class SubclassingKotlinInJavaTest extends KotlinTestWithEnvironmentManagement {