Disallow references to extensions in classes

It's not clear in which order should the two receiver arguments be passed to
them, and there's no corresponding K*FunctionN class for now

 #KT-1183 In Progress
This commit is contained in:
Alexander Udalov
2013-04-18 18:54:14 +04:00
parent c4b4fa750c
commit d40906a690
5 changed files with 27 additions and 2 deletions
@@ -345,6 +345,10 @@ public interface Errors {
DiagnosticFactory1<PsiElement, InferenceErrorData> TYPE_INFERENCE_UPPER_BOUND_VIOLATED = DiagnosticFactory1.create(ERROR);
DiagnosticFactory2<PsiElement, JetType, JetType> TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH = DiagnosticFactory2.create(ERROR);
// Callable references
DiagnosticFactory1<JetExpression, CallableMemberDescriptor> EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED = DiagnosticFactory1.create(ERROR);
// Multi-declarations
DiagnosticFactory0<JetMultiDeclaration> INITIALIZER_REQUIRED_FOR_MULTIDECLARATION = DiagnosticFactory0.create(ERROR, DEFAULT);
@@ -440,6 +440,9 @@ public class DefaultErrorMessages {
MAP.put(AMBIGUOUS_ANONYMOUS_TYPE_INFERRED, "Right-hand side has anonymous type. Please specify type explicitly", TO_STRING);
MAP.put(EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED,
"''{0}'' is a member and an extension at the same time. References to such elements are not allowed", TO_STRING);
MAP.setImmutable();
for (Field field : Errors.class.getFields()) {
@@ -611,8 +611,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter();
ReceiverParameterDescriptor expectedThisObject = descriptor.getExpectedThisObject();
if (receiverParameter != null && expectedThisObject != null) {
// TODO: report "extensions in classes" are not supported
context.trace.report(UNRESOLVED_REFERENCE.on(reference, reference));
context.trace.report(EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED.on(reference, descriptor));
return null;
}
@@ -0,0 +1,14 @@
class A {
fun Int.extInt() = 42
fun A.extA(x: String) = x
fun main() {
::<!EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED!>extInt<!>
::<!EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED!>extA<!>
}
}
fun main() {
A::<!EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED!>extInt<!>
A::<!EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED!>extA<!>
}
@@ -781,6 +781,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/callableReference/extensionFromTopLevel.kt");
}
@TestMetadata("extensionInClassDisallowed.kt")
public void testExtensionInClassDisallowed() throws Exception {
doTest("compiler/testData/diagnostics/tests/callableReference/extensionInClassDisallowed.kt");
}
@TestMetadata("genericClassFromTopLevel.kt")
public void testGenericClassFromTopLevel() throws Exception {
doTest("compiler/testData/diagnostics/tests/callableReference/genericClassFromTopLevel.kt");