Mark string prefixes and suffixes as unsupported

This commit is contained in:
Andrey Breslav
2015-10-15 16:06:18 +03:00
parent 267ec2724e
commit b050324869
4 changed files with 81 additions and 2 deletions
@@ -31,6 +31,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.lexer.JetKeywordToken;
import org.jetbrains.kotlin.lexer.JetTokens;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.*;
@@ -73,8 +75,7 @@ import java.util.Iterator;
import java.util.List;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
import static org.jetbrains.kotlin.lexer.JetTokens.AS_KEYWORD;
import static org.jetbrains.kotlin.lexer.JetTokens.AS_SAFE;
import static org.jetbrains.kotlin.lexer.JetTokens.*;
import static org.jetbrains.kotlin.resolve.BindingContext.*;
import static org.jetbrains.kotlin.resolve.calls.context.ContextDependency.DEPENDENT;
import static org.jetbrains.kotlin.resolve.calls.context.ContextDependency.INDEPENDENT;
@@ -115,6 +116,10 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
@Override
public JetTypeInfo visitConstantExpression(@NotNull JetConstantExpression expression, ExpressionTypingContext context) {
if (expression.getNode().getElementType() == JetNodeTypes.CHARACTER_CONSTANT) {
checkStringPrefixAndSuffix(expression, context);
}
CompileTimeConstant<?> compileTimeConstant = components.constantExpressionEvaluator.evaluateExpression(
expression, context.trace, context.expectedType
);
@@ -1372,6 +1377,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
@Override
public JetTypeInfo visitStringTemplateExpression(@NotNull JetStringTemplateExpression expression, ExpressionTypingContext contextWithExpectedType) {
final ExpressionTypingContext context = contextWithExpectedType.replaceExpectedType(NO_EXPECTED_TYPE).replaceContextDependency(INDEPENDENT);
checkStringPrefixAndSuffix(expression, context);
class StringTemplateVisitor extends JetVisitorVoid {
private JetTypeInfo typeInfo = TypeInfoFactoryKt.noTypeInfo(context);
@@ -1402,6 +1410,27 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
contextWithExpectedType);
}
private static void checkStringPrefixAndSuffix(@NotNull PsiElement expression, ExpressionTypingContext context) {
checkStringPrefixOrSuffix(PsiTreeUtil.prevLeaf(expression), context);
checkStringPrefixOrSuffix(PsiTreeUtil.nextLeaf(expression), context);
}
private static void checkStringPrefixOrSuffix(PsiElement prefixOrSuffix, ExpressionTypingContext context) {
if (illegalStringPrefixOrSuffix(prefixOrSuffix)) {
context.trace.report(Errors.UNSUPPORTED.on(prefixOrSuffix, "string prefixes and suffixes"));
}
}
private static boolean illegalStringPrefixOrSuffix(@Nullable PsiElement element) {
if (element == null) return false;
IElementType elementType = element.getNode().getElementType();
return elementType == IDENTIFIER ||
elementType == INTEGER_LITERAL ||
elementType == FLOAT_LITERAL ||
elementType instanceof JetKeywordToken;
}
@Override
public JetTypeInfo visitAnnotatedExpression(@NotNull JetAnnotatedExpression expression, ExpressionTypingContext context) {
return visitAnnotatedExpression(expression, context, false);