From b72bcfd8ae30a9610b0219129d647526b19e7da5 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 5 Mar 2014 16:10:07 +0400 Subject: [PATCH] Type bounds check for class headers moved to DeclarationsChecker --- .../jet/lang/resolve/DeclarationsChecker.java | 28 ++++++++++++++++ .../lang/resolve/TypeHierarchyResolver.java | 32 ------------------- .../tests/FinalClassObjectBound.kt | 4 +++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++ 4 files changed, 37 insertions(+), 32 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/FinalClassObjectBound.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 8984c0738cf..1722104781a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -21,6 +21,7 @@ import com.google.common.collect.Sets; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; @@ -66,6 +67,7 @@ public class DeclarationsChecker { } checkSupertypesForConsistency(classDescriptor); + checkTypesInClassHeader(classOrObject); modifiersChecker.checkModifiersForDeclaration(classOrObject, classDescriptor); } @@ -124,6 +126,32 @@ public class DeclarationsChecker { } } + private void checkTypesInClassHeader(@NotNull JetClassOrObject classOrObject) { + for (JetDelegationSpecifier delegationSpecifier : classOrObject.getDelegationSpecifiers()) { + checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference()); + } + + if (!(classOrObject instanceof JetClass)) return; + JetClass jetClass = (JetClass) classOrObject; + + for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) { + checkBoundsForTypeInClassHeader(jetTypeParameter.getExtendsBound()); + } + + for (JetTypeConstraint constraint : jetClass.getTypeConstraints()) { + checkBoundsForTypeInClassHeader(constraint.getBoundTypeReference()); + } + } + + private void checkBoundsForTypeInClassHeader(@Nullable JetTypeReference typeReference) { + if (typeReference != null) { + JetType type = trace.getBindingContext().get(TYPE, typeReference); + if (type != null) { + DescriptorResolver.checkBounds(typeReference, type, trace); + } + } + } + private void checkSupertypesForConsistency(@NotNull ClassDescriptor classDescriptor) { Multimap multimap = SubstitutionUtils .buildDeepSubstitutionMultimap(classDescriptor.getDefaultType()); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 00a393e0e01..e2983211e08 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -136,10 +136,6 @@ public class TypeHierarchyResolver { // Detect and disconnect all loops in the hierarchy detectAndDisconnectLoops(c); - - // At this point, there are no loops in the type hierarchy - - checkTypesInClassHeaders(c); // Check bounds in the types used in generic bounds and supertype lists } @NotNull @@ -319,34 +315,6 @@ public class TypeHierarchyResolver { } } - private void checkTypesInClassHeaders(@NotNull TopDownAnalysisContext c) { - for (JetClassOrObject classOrObject : c.getClasses().keySet()) { - for (JetDelegationSpecifier delegationSpecifier : classOrObject.getDelegationSpecifiers()) { - checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference()); - } - - if (!(classOrObject instanceof JetClass)) continue; - JetClass jetClass = (JetClass) classOrObject; - - for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) { - checkBoundsForTypeInClassHeader(jetTypeParameter.getExtendsBound()); - } - - for (JetTypeConstraint constraint : jetClass.getTypeConstraints()) { - checkBoundsForTypeInClassHeader(constraint.getBoundTypeReference()); - } - } - } - - private void checkBoundsForTypeInClassHeader(@Nullable JetTypeReference typeReference) { - if (typeReference != null) { - JetType type = trace.getBindingContext().get(TYPE, typeReference); - if (type != null) { - DescriptorResolver.checkBounds(typeReference, type, trace); - } - } - } - private class ClassifierCollector extends JetVisitorVoid { private final TopDownAnalysisContext c; private final JetScope outerScope; diff --git a/compiler/testData/diagnostics/tests/FinalClassObjectBound.kt b/compiler/testData/diagnostics/tests/FinalClassObjectBound.kt new file mode 100644 index 00000000000..f7bf2f02c9c --- /dev/null +++ b/compiler/testData/diagnostics/tests/FinalClassObjectBound.kt @@ -0,0 +1,4 @@ +class Other +trait Trait +trait WithBounds +class Test1 where class object T: WithBounds<Other> \ 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 5d83b0d17ae..674c81707d0 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -219,6 +219,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/Dollar.kt"); } + @TestMetadata("FinalClassObjectBound.kt") + public void testFinalClassObjectBound() throws Exception { + doTest("compiler/testData/diagnostics/tests/FinalClassObjectBound.kt"); + } + @TestMetadata("ForRangeConventions.kt") public void testForRangeConventions() throws Exception { doTest("compiler/testData/diagnostics/tests/ForRangeConventions.kt");