From a325d86e208f54e02d512059306dc8275553a837 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 1 Nov 2012 19:31:39 +0400 Subject: [PATCH] Properly reporting illegal use of 'super' in extension functions --- .../BasicExpressionTypingVisitor.java | 16 +++++++++++++--- .../thisAndSuper/superInExtensionFunction.kt | 4 ++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/thisAndSuper/superInExtensionFunction.kt 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 09d63727589..62a606b2066 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 @@ -525,15 +525,21 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { ) { String labelName = expression.getLabelName(); if (labelName != null) { - return context.labelResolver.resolveThisLabel(expression.getInstanceReference(), expression.getTargetLabel(), - context, new LabelName(labelName)); + LabelResolver.LabeledReceiverResolutionResult resolutionResult = context.labelResolver.resolveThisLabel( + expression.getInstanceReference(), expression.getTargetLabel(), context, new LabelName(labelName)); + if (onlyClassReceivers && resolutionResult.success()) { + if (!isDeclaredInClass(resolutionResult.getReceiverParameterDescriptor())) { + return LabelResolver.LabeledReceiverResolutionResult.labelResolutionSuccess(NO_RECEIVER_PARAMETER); + } + } + return resolutionResult; } else { ReceiverParameterDescriptor result = NO_RECEIVER_PARAMETER; List receivers = context.scope.getImplicitReceiversHierarchy(); if (onlyClassReceivers) { for (ReceiverParameterDescriptor receiver : receivers) { - if (receiver.getContainingDeclaration() instanceof ClassDescriptor) { + if (isDeclaredInClass(receiver)) { result = receiver; break; } @@ -549,6 +555,10 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } } + private boolean isDeclaredInClass(ReceiverParameterDescriptor receiver) { + return receiver.getContainingDeclaration() instanceof ClassDescriptor; + } + @Override public JetTypeInfo visitBlockExpression(JetBlockExpression expression, ExpressionTypingContext context) { return visitBlockExpression(expression, context, false); diff --git a/compiler/testData/diagnostics/tests/thisAndSuper/superInExtensionFunction.kt b/compiler/testData/diagnostics/tests/thisAndSuper/superInExtensionFunction.kt new file mode 100644 index 00000000000..19bc692e760 --- /dev/null +++ b/compiler/testData/diagnostics/tests/thisAndSuper/superInExtensionFunction.kt @@ -0,0 +1,4 @@ +fun String.f() { + super@f.compareTo("") + super.compareTo("") +} \ 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 264c62e5fed..1b235982622 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3500,6 +3500,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/thisAndSuper/Super.kt"); } + @TestMetadata("superInExtensionFunction.kt") + public void testSuperInExtensionFunction() throws Exception { + doTest("compiler/testData/diagnostics/tests/thisAndSuper/superInExtensionFunction.kt"); + } + @TestMetadata("superInExtensionFunctionCall.kt") public void testSuperInExtensionFunctionCall() throws Exception { doTest("compiler/testData/diagnostics/tests/thisAndSuper/superInExtensionFunctionCall.kt");