From 29f3c4a1a042cb92ca0c40e2541f8863b48e9add Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 18 Oct 2013 20:11:09 +0400 Subject: [PATCH] Report upper bounds violation for objects, not only classes --- .../lang/resolve/TypeHierarchyResolver.java | 43 ++++++++----------- .../tests/objects/upperBoundViolated.kt | 9 ++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++ 3 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/objects/upperBoundViolated.kt 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 2c510cf6488..a38d0c36dc3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -395,37 +395,32 @@ public class TypeHierarchyResolver { } private void checkTypesInClassHeaders() { - for (Map.Entry entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); - + for (JetClass jetClass : context.getClasses().keySet()) { for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) { - JetTypeReference typeReference = delegationSpecifier.getTypeReference(); - if (typeReference != null) { - JetType type = trace.getBindingContext().get(TYPE, typeReference); - if (type != null) { - descriptorResolver.checkBounds(typeReference, type, trace); - } - } + checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference()); } for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) { - JetTypeReference extendsBound = jetTypeParameter.getExtendsBound(); - if (extendsBound != null) { - JetType type = trace.getBindingContext().get(TYPE, extendsBound); - if (type != null) { - descriptorResolver.checkBounds(extendsBound, type, trace); - } - } + checkBoundsForTypeInClassHeader(jetTypeParameter.getExtendsBound()); } for (JetTypeConstraint constraint : jetClass.getTypeConstraints()) { - JetTypeReference extendsBound = constraint.getBoundTypeReference(); - if (extendsBound != null) { - JetType type = trace.getBindingContext().get(TYPE, extendsBound); - if (type != null) { - descriptorResolver.checkBounds(extendsBound, type, trace); - } - } + checkBoundsForTypeInClassHeader(constraint.getBoundTypeReference()); + } + } + + for (JetObjectDeclaration object : context.getObjects().keySet()) { + for (JetDelegationSpecifier delegationSpecifier : object.getDelegationSpecifiers()) { + checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference()); + } + } + } + + private void checkBoundsForTypeInClassHeader(@Nullable JetTypeReference typeReference) { + if (typeReference != null) { + JetType type = trace.getBindingContext().get(TYPE, typeReference); + if (type != null) { + DescriptorResolver.checkBounds(typeReference, type, trace); } } } diff --git a/compiler/testData/diagnostics/tests/objects/upperBoundViolated.kt b/compiler/testData/diagnostics/tests/objects/upperBoundViolated.kt new file mode 100644 index 00000000000..02fa5eac1c3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/objects/upperBoundViolated.kt @@ -0,0 +1,9 @@ +trait Trait + +object O1 : Trait + +object O2 : Trait<String> + +class C { + class object : Trait<IntRange> +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c4082cd0f3b..27a48532701 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -4303,6 +4303,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/objects/ObjectsNested.kt"); } + @TestMetadata("upperBoundViolated.kt") + public void testUpperBoundViolated() throws Exception { + doTest("compiler/testData/diagnostics/tests/objects/upperBoundViolated.kt"); + } + } @TestMetadata("compiler/testData/diagnostics/tests/operatorsOverloading")