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 1a5d215f632..688675d6ab7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -523,6 +523,8 @@ public interface Errors { DiagnosticFactory0 NO_THIS = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 NAMESPACE_IS_NOT_AN_EXPRESSION = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 TYPE_PARAMETER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 TYPE_PARAMETER_ON_LHS_OF_DOT = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 INACCESSIBLE_OUTER_CLASS_EXPRESSION = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 NESTED_CLASS_NOT_ALLOWED = DiagnosticFactory0.create(ERROR); 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 5575185cbf6..069a3a7c83f 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 @@ -224,6 +224,8 @@ public class DefaultErrorMessages { MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE, RENDER_TYPE); MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE, RENDER_TYPE); MAP.put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier ''{0}'' does not have a class object", NAME); + MAP.put(TYPE_PARAMETER_IS_NOT_AN_EXPRESSION, "Type parameter ''{0}'' is not an expression", NAME); + MAP.put(TYPE_PARAMETER_ON_LHS_OF_DOT, "Type parameter ''{0}'' cannot have or inherit a class object, so it cannot be on the left hand side of dot", NAME); MAP.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); MAP.put(INACCESSIBLE_OUTER_CLASS_EXPRESSION, "Expression is inaccessible from a nested class ''{0}'', use ''inner'' keyword to make the class inner", NAME); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java index 058d5af53b5..1d6e8a4caf9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.constants.ConstantUtils; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.ChainedScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.*; @@ -87,13 +88,22 @@ public class CallExpressionResolver { } // To report NO_CLASS_OBJECT when no namespace found if (classifier != null) { - if (context.expressionPosition == ExpressionPosition.FREE) { + if (classifier instanceof TypeParameterDescriptor) { + if (context.expressionPosition == ExpressionPosition.FREE) { + context.trace.report(TYPE_PARAMETER_IS_NOT_AN_EXPRESSION.on(expression, (TypeParameterDescriptor) classifier)); + } + else { + context.trace.report(TYPE_PARAMETER_ON_LHS_OF_DOT.on(expression, (TypeParameterDescriptor) classifier)); + } + } + else if (context.expressionPosition == ExpressionPosition.FREE) { context.trace.report(NO_CLASS_OBJECT.on(expression, classifier)); } context.trace.record(REFERENCE_TARGET, expression, classifier); - JetScope scopeForStaticMembersResolution = classifier instanceof ClassDescriptor - ? getStaticNestedClassesScope((ClassDescriptor) classifier) - : JetScope.EMPTY; + JetScope scopeForStaticMembersResolution = + classifier instanceof ClassDescriptor + ? getStaticNestedClassesScope((ClassDescriptor) classifier) + : ErrorUtils.createErrorScope("Error scope for type parameter on the left hand side of dot"); return new NamespaceType(referencedName, scopeForStaticMembersResolution); } temporaryTrace.commit(); diff --git a/compiler/testData/diagnostics/tests/incompleteCode/typeParameterOnLhsOfDot.kt b/compiler/testData/diagnostics/tests/incompleteCode/typeParameterOnLhsOfDot.kt new file mode 100644 index 00000000000..a08af6d9d7c --- /dev/null +++ b/compiler/testData/diagnostics/tests/incompleteCode/typeParameterOnLhsOfDot.kt @@ -0,0 +1,8 @@ +package bar + +class S { + fun foo() { + T + T.create() + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 81964d4c6e8..2a7c31abccb 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1976,6 +1976,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/incompleteCode/SupertypeOfErrorType.kt"); } + @TestMetadata("typeParameterOnLhsOfDot.kt") + public void testTypeParameterOnLhsOfDot() throws Exception { + doTest("compiler/testData/diagnostics/tests/incompleteCode/typeParameterOnLhsOfDot.kt"); + } + @TestMetadata("compiler/testData/diagnostics/tests/incompleteCode/diagnosticWithSyntaxError") public static class DiagnosticWithSyntaxError extends AbstractDiagnosticsTestWithEagerResolve { public void testAllFilesPresentInDiagnosticWithSyntaxError() throws Exception {