Properly reporting illegal use of 'super' in extension functions

This commit is contained in:
Andrey Breslav
2012-11-01 19:31:39 +04:00
parent 20906e34ce
commit a325d86e20
3 changed files with 22 additions and 3 deletions
@@ -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<ReceiverParameterDescriptor> 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);
@@ -0,0 +1,4 @@
fun String.f() {
<!SUPER_NOT_AVAILABLE!>super@f<!>.compareTo("")
<!SUPER_NOT_AVAILABLE!>super<!>.compareTo("")
}
@@ -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");