Report upper bounds violation for objects, not only classes
This commit is contained in:
@@ -395,37 +395,32 @@ public class TypeHierarchyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkTypesInClassHeaders() {
|
private void checkTypesInClassHeaders() {
|
||||||
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
for (JetClass jetClass : context.getClasses().keySet()) {
|
||||||
JetClass jetClass = entry.getKey();
|
|
||||||
|
|
||||||
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
|
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
|
||||||
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference());
|
||||||
if (typeReference != null) {
|
|
||||||
JetType type = trace.getBindingContext().get(TYPE, typeReference);
|
|
||||||
if (type != null) {
|
|
||||||
descriptorResolver.checkBounds(typeReference, type, trace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) {
|
for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) {
|
||||||
JetTypeReference extendsBound = jetTypeParameter.getExtendsBound();
|
checkBoundsForTypeInClassHeader(jetTypeParameter.getExtendsBound());
|
||||||
if (extendsBound != null) {
|
|
||||||
JetType type = trace.getBindingContext().get(TYPE, extendsBound);
|
|
||||||
if (type != null) {
|
|
||||||
descriptorResolver.checkBounds(extendsBound, type, trace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (JetTypeConstraint constraint : jetClass.getTypeConstraints()) {
|
for (JetTypeConstraint constraint : jetClass.getTypeConstraints()) {
|
||||||
JetTypeReference extendsBound = constraint.getBoundTypeReference();
|
checkBoundsForTypeInClassHeader(constraint.getBoundTypeReference());
|
||||||
if (extendsBound != null) {
|
}
|
||||||
JetType type = trace.getBindingContext().get(TYPE, extendsBound);
|
}
|
||||||
if (type != null) {
|
|
||||||
descriptorResolver.checkBounds(extendsBound, type, trace);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
trait Trait<N : Number>
|
||||||
|
|
||||||
|
object O1 : Trait<Int>
|
||||||
|
|
||||||
|
object O2 : Trait<<!UPPER_BOUND_VIOLATED!>String<!>>
|
||||||
|
|
||||||
|
class C {
|
||||||
|
class object : Trait<<!UPPER_BOUND_VIOLATED!>IntRange<!>>
|
||||||
|
}
|
||||||
@@ -4303,6 +4303,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
|||||||
doTest("compiler/testData/diagnostics/tests/objects/ObjectsNested.kt");
|
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")
|
@TestMetadata("compiler/testData/diagnostics/tests/operatorsOverloading")
|
||||||
|
|||||||
Reference in New Issue
Block a user