From fee7846c7ec09a257795183ffd5c87cda575f84a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 18 Apr 2013 19:56:51 +0400 Subject: [PATCH] LHS of callable reference can't be a type parameter --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 1 + .../lang/diagnostics/rendering/DefaultErrorMessages.java | 1 + .../types/expressions/BasicExpressionTypingVisitor.java | 6 ++++-- .../diagnostics/tests/callableReference/lhsNotAClass.kt | 9 +++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/callableReference/lhsNotAClass.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 9ea84d674d9..6bebfd7c7a6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -348,6 +348,7 @@ public interface Errors { // Callable references DiagnosticFactory1 EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED = DiagnosticFactory1.create(ERROR); + DiagnosticFactory0 CALLABLE_REFERENCE_LHS_NOT_A_CLASS = DiagnosticFactory0.create(ERROR); // Multi-declarations diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index fccf5119500..d50b52b1852 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -442,6 +442,7 @@ public class DefaultErrorMessages { 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.put(CALLABLE_REFERENCE_LHS_NOT_A_CLASS, "Callable reference left-hand side cannot be a type parameter"); MAP.setImmutable(); 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 85fed7c4f15..134a853ea85 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 @@ -657,8 +657,10 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } ClassifierDescriptor classifier = lhsType.getConstructor().getDeclarationDescriptor(); - // TODO: report an error if the classifier is not a class - assert classifier instanceof ClassDescriptor : "TODO"; + if (!(classifier instanceof ClassDescriptor)) { + context.trace.report(CALLABLE_REFERENCE_LHS_NOT_A_CLASS.on(expression)); + return null; + } ReceiverValue receiver = new TransientReceiver(lhsType); TemporaryBindingTrace traceWithReceiver = TemporaryBindingTrace.create(context.trace, diff --git a/compiler/testData/diagnostics/tests/callableReference/lhsNotAClass.kt b/compiler/testData/diagnostics/tests/callableReference/lhsNotAClass.kt new file mode 100644 index 00000000000..402624292cf --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/lhsNotAClass.kt @@ -0,0 +1,9 @@ +class A { + fun foo() = T::toString + + fun bar() = U::toString +} + +fun foo() = T::toString + +fun bar() = U::toString diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index e19ae790e67..31414def652 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -811,6 +811,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/callableReference/innerConstructorFromTopLevel.kt"); } + @TestMetadata("lhsNotAClass.kt") + public void testLhsNotAClass() throws Exception { + doTest("compiler/testData/diagnostics/tests/callableReference/lhsNotAClass.kt"); + } + @TestMetadata("localConstructor.kt") public void testLocalConstructor() throws Exception { doTest("compiler/testData/diagnostics/tests/callableReference/localConstructor.kt");