From c4428496bd0e35ed84cb0ce8b82a88344ad35b93 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 14 Nov 2012 22:41:41 +0400 Subject: [PATCH] check super type qualifier even if super resolve is unsuccessful --- .../BasicExpressionTypingVisitor.java | 18 +++++++++++++----- .../diagnostics/tests/thisAndSuper/Super.kt | 8 ++++---- .../thisAndSuper/superInToplevelFunction.kt | 2 +- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 911a1875009..5e71aeb1df7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -481,19 +481,19 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @Override public JetTypeInfo visitSuperExpression(JetSuperExpression expression, ExpressionTypingContext context) { + LabelResolver.LabeledReceiverResolutionResult resolutionResult = resolveToReceiver(expression, context, true); + if (!context.namespacesAllowed) { context.trace.report(SUPER_IS_NOT_AN_EXPRESSION.on(expression, expression.getText())); - return JetTypeInfo.create(null, context.dataFlowInfo); + return errorInSuper(expression, context); } - - LabelResolver.LabeledReceiverResolutionResult resolutionResult = resolveToReceiver(expression, context, true); switch (resolutionResult.getCode()) { case LABEL_RESOLUTION_ERROR: // The error is already reported - return JetTypeInfo.create(null, context.dataFlowInfo); + return errorInSuper(expression, context); case NO_THIS: context.trace.report(SUPER_NOT_AVAILABLE.on(expression)); - return JetTypeInfo.create(null, context.dataFlowInfo); + return errorInSuper(expression, context); case SUCCESS: JetType result = checkPossiblyQualifiedSuper(expression, context, resolutionResult.getReceiverParameterDescriptor()); if (result != null) { @@ -504,6 +504,14 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { throw new IllegalStateException("Unknown code: " + resolutionResult.getCode()); } + private JetTypeInfo errorInSuper(JetSuperExpression expression, ExpressionTypingContext context) { + JetTypeReference superTypeQualifier = expression.getSuperTypeQualifier(); + if (superTypeQualifier != null) { + context.expressionTypingServices.getTypeResolver().resolveType(context.scope, superTypeQualifier, context.trace, true); + } + return JetTypeInfo.create(null, context.dataFlowInfo); + } + private JetType checkPossiblyQualifiedSuper( JetSuperExpression expression, ExpressionTypingContext context, diff --git a/compiler/testData/diagnostics/tests/thisAndSuper/Super.kt b/compiler/testData/diagnostics/tests/thisAndSuper/Super.kt index 8c584a2cc48..ca82c13316c 100644 --- a/compiler/testData/diagnostics/tests/thisAndSuper/Super.kt +++ b/compiler/testData/diagnostics/tests/thisAndSuper/Super.kt @@ -11,7 +11,7 @@ class A() : C(), T { fun test() { super - super<T> + super super.foo() super.foo() super.bar() @@ -23,8 +23,8 @@ class A() : C(), T { super<>.foo() super<() -> Unit>.foo() super<Unit>.foo() - super<T>@B.foo() - super<C>@B.bar() + super@B.foo() + super@B.bar() } class B : T { @@ -37,7 +37,7 @@ class A() : C(), T { super<C>@B.foo() super.foo() super - super<T> + super } } } diff --git a/compiler/testData/diagnostics/tests/thisAndSuper/superInToplevelFunction.kt b/compiler/testData/diagnostics/tests/thisAndSuper/superInToplevelFunction.kt index 050bde1f598..e494e1d88ab 100644 --- a/compiler/testData/diagnostics/tests/thisAndSuper/superInToplevelFunction.kt +++ b/compiler/testData/diagnostics/tests/thisAndSuper/superInToplevelFunction.kt @@ -1,5 +1,5 @@ fun foo() { super super.foo() - super<Nothing>.foo() + super.foo() } \ No newline at end of file