From 1e0d077a732946962fc2c43bd285d7766941abf2 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 16 Mar 2011 17:44:28 +0300 Subject: [PATCH] Checks for . and ?. fixed for namespaces, a liitle bit of logic added for "foo.1" --- .../jet/lang/types/JetTypeInferrer.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index d4e68f4ca15..6c74d7bcba2 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -176,11 +176,18 @@ public class JetTypeInferrer { private void checkNullSafety(JetType receiverType, JetQualifiedExpression expression) { if (receiverType != null) { - if (receiverType.isNullable() && expression.getOperationSign() == JetTokens.DOT) { + boolean namespaceType = receiverType instanceof NamespaceType; + boolean nullable = !namespaceType && receiverType.isNullable(); + if (nullable && expression.getOperationSign() == JetTokens.DOT) { semanticServices.getErrorHandler().genericError(expression.getOperationTokenNode(), "Only safe calls (?.) are allowed on a nullable receiver of type " + receiverType); } - else if (!receiverType.isNullable() && expression.getOperationSign() == JetTokens.SAFE_ACCESS) { - semanticServices.getErrorHandler().genericWarning(expression.getOperationTokenNode(), "Unnecessary safe call on a non-null receiver of type " + receiverType); + else if (!nullable && expression.getOperationSign() == JetTokens.SAFE_ACCESS) { + if (namespaceType) { + semanticServices.getErrorHandler().genericError(expression.getOperationTokenNode(), "Safe calls are not allowed on namespaces"); + } + else { + semanticServices.getErrorHandler().genericWarning(expression.getOperationTokenNode(), "Unnecessary safe call on a non-null receiver of type " + receiverType); + } } } } @@ -547,12 +554,14 @@ public class JetTypeInferrer { JetType receiverType = getType(scope, receiverExpression, false); if (receiverType != null) { checkNullSafety(receiverType, expression); - if (selectorExpression != null) { - // TODO : review - + if (selectorExpression instanceof JetSimpleNameExpression) { JetScope compositeScope = new ScopeWithReceiver(scope, receiverType); result = getType(compositeScope, selectorExpression, false); } + else if (selectorExpression != null) { + // TODO : not a simple name -> resolve in scope, expect property type or a function type + throw new UnsupportedOperationException(); + } } }