From f109cfc30356741f4380dbd9e3770236a8a835c4 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Thu, 15 May 2014 14:45:41 +0400 Subject: [PATCH] Replaced PrefixExpression with LabeledExpression where labeled expression is used Added 'visitLabeledExpression' --- .../jet/codegen/ExpressionCodegen.java | 20 ++++++------- .../jetbrains/jet/checkers/DebugInfoUtil.java | 4 +-- .../jet/lang/cfg/JetControlFlowProcessor.java | 23 ++++----------- .../evaluate/ConstantExpressionEvaluator.kt | 12 ++++---- .../jet/lang/psi/JetCallExpression.java | 12 ++++---- .../jet/lang/psi/JetExpressionWithLabel.java | 10 +++---- .../jet/lang/psi/JetLabeledExpression.java | 5 ++++ .../jetbrains/jet/lang/psi/JetPsiUtil.java | 28 +++--------------- .../jetbrains/jet/lang/psi/JetVisitor.java | 4 +++ .../jet/lang/psi/JetVisitorVoid.java | 10 +++++++ .../lang/psi/JetVisitorVoidWithParameter.java | 10 +++++++ .../lang/resolve/calls/CandidateResolver.java | 4 +-- .../calls/InlineCallResolverExtension.java | 9 +++--- .../BasicExpressionTypingVisitor.java | 29 ++++++++++--------- .../expressions/ExpressionTypingUtils.java | 5 ++-- .../ExpressionTypingVisitorForStatements.java | 4 +-- .../lang/types/expressions/LabelResolver.java | 9 ++---- .../plugin/debugger/JetPositionManager.java | 2 +- .../LabelsHighlightingVisitor.java | 10 ------- .../JetInvokeFunctionReference.java | 4 +-- .../jet/plugin/util/JetPsiPrecedences.kt | 1 + .../expression/ExpressionVisitor.java | 24 +++++++-------- 22 files changed, 108 insertions(+), 131 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index f7711e0e7c9..000b1979235 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2917,23 +2917,21 @@ public class ExpressionCodegen extends JetVisitor implem @Nullable private static JetSimpleNameExpression targetLabel(JetExpression expression) { - if (expression.getParent() instanceof JetPrefixExpression) { - JetPrefixExpression parent = (JetPrefixExpression) expression.getParent(); - JetSimpleNameExpression operationSign = parent.getOperationReference(); - if (operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) { - return operationSign; - } + if (expression.getParent() instanceof JetLabeledExpression) { + return ((JetLabeledExpression) expression.getParent()).getTargetLabel(); } return null; } @Override - public StackValue visitPrefixExpression(@NotNull JetPrefixExpression expression, StackValue receiver) { - JetSimpleNameExpression operationSign = expression.getOperationReference(); - if (operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) { - return genQualified(receiver, expression.getBaseExpression()); - } + public StackValue visitLabeledExpression( + @NotNull JetLabeledExpression expression, StackValue receiver + ) { + return genQualified(receiver, expression.getBaseExpression()); + } + @Override + public StackValue visitPrefixExpression(@NotNull JetPrefixExpression expression, StackValue receiver) { DeclarationDescriptor op = bindingContext.get(REFERENCE_TARGET, expression.getOperationReference()); assert op instanceof FunctionDescriptor : String.valueOf(op); Callable callable = resolveToCallable((FunctionDescriptor) op, false); diff --git a/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java b/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java index af058fd39d6..e714aa3e019 100644 --- a/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/checkers/DebugInfoUtil.java @@ -96,9 +96,9 @@ public class DebugInfoUtil { if (EXCLUDED.contains(referencedNameElementType)) { return; } - if (referencedNameElementType == JetTokens.LABEL_IDENTIFIER) return; } - else if (nameExpression.getReferencedNameElementType() == JetTokens.THIS_KEYWORD) { + if (elementType == JetNodeTypes.LABEL_REFERENCE || + nameExpression.getReferencedNameElementType() == JetTokens.THIS_KEYWORD) { return; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index b70668bb3ac..93faf1b5c81 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -229,18 +229,11 @@ public class JetControlFlowProcessor { } @Override - public void visitExpressionWithLabelVoid(@NotNull JetExpressionWithLabel expression, CFPContext context) { - String labelName = expression.getLabelName(); - JetExpression labeledExpression = expression.getLabeledExpression(); - if (labelName != null && labeledExpression != null) { - visitLabeledExpression(labelName, labeledExpression, context); - } - } - - private void visitLabeledExpression(@NotNull String labelName, @NotNull JetExpression labeledExpression, CFPContext context) { - JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression); - if (deparenthesized != null) { - generateInstructions(labeledExpression, context); + public void visitLabeledExpressionVoid(@NotNull JetLabeledExpression expression, CFPContext context) { + mark(expression); + JetExpression baseExpression = expression.getBaseExpression(); + if (baseExpression != null) { + generateInstructions(baseExpression, context); } } @@ -374,11 +367,7 @@ public class JetControlFlowProcessor { IElementType operationType = operationSign.getReferencedNameElementType(); JetExpression baseExpression = expression.getBaseExpression(); if (baseExpression == null) return; - if (operationType == JetTokens.LABEL_IDENTIFIER) { - String referencedName = operationSign.getReferencedName(); - visitLabeledExpression(referencedName.substring(1), baseExpression, context); - } - else if (JetTokens.EXCLEXCL == operationType) { + if (JetTokens.EXCLEXCL == operationType) { generateInstructions(baseExpression, NOT_IN_CONDITION); builder.predefinedOperation(expression, NOT_NULL_ASSERTION); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt index f12448c7794..3131614b810 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt @@ -102,14 +102,12 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet return null } - override fun visitPrefixExpression(expression: JetPrefixExpression, expectedType: JetType?): CompileTimeConstant<*>? { - val deparenthesizedExpression = JetPsiUtil.deparenthesize(expression) - return if (deparenthesizedExpression != null && deparenthesizedExpression != expression) { - evaluate(deparenthesizedExpression, expectedType) - } - else { - super.visitPrefixExpression(expression, expectedType) + override fun visitLabeledExpression(expression: JetLabeledExpression, expectedType: JetType?): CompileTimeConstant<*>? { + val baseExpression = expression.getBaseExpression() + if (baseExpression != null) { + return evaluate(baseExpression, expectedType) } + return null } override fun visitStringTemplateExpression(expression: JetStringTemplateExpression, expectedType: JetType?): CompileTimeConstant<*>? { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java index 50e9d3f6de6..372900f18eb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java @@ -76,13 +76,11 @@ public class JetCallExpression extends JetReferenceExpression implements JetCall if (psi instanceof JetFunctionLiteralExpression) { result.add((JetFunctionLiteralExpression) psi); } - else if (psi instanceof JetPrefixExpression) { - JetPrefixExpression prefixExpression = (JetPrefixExpression) psi; - if (prefixExpression.getOperationReference().getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) { - JetExpression labeledExpression = prefixExpression.getBaseExpression(); - if (labeledExpression instanceof JetFunctionLiteralExpression) { - result.add(prefixExpression); - } + else if (psi instanceof JetLabeledExpression) { + JetLabeledExpression labeledExpression = (JetLabeledExpression) psi; + JetExpression baseExpression = labeledExpression.getBaseExpression(); + if (baseExpression instanceof JetFunctionLiteralExpression) { + result.add(labeledExpression); } } node = node.getTreeNext(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionWithLabel.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionWithLabel.java index b69cb54a101..a8dabf711bd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionWithLabel.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionWithLabel.java @@ -34,15 +34,15 @@ public class JetExpressionWithLabel extends JetExpressionImpl { return (JetSimpleNameExpression) qualifier.findChildByType(JetNodeTypes.LABEL_REFERENCE); } - @Nullable @IfNotParsed - public JetExpression getLabeledExpression() { - return findChildByClass(JetExpression.class); - } - @Nullable public String getLabelName() { JetSimpleNameExpression labelElement = getTargetLabel(); assert labelElement == null || labelElement.getText().startsWith("@"); return labelElement == null ? null : labelElement.getText().substring(1); } + + @Override + public R accept(@NotNull JetVisitor visitor, D data) { + return visitor.visitExpressionWithLabel(this, data); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabeledExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabeledExpression.java index c4ef7aff369..799d7c0df03 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabeledExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabeledExpression.java @@ -47,4 +47,9 @@ public class JetLabeledExpression extends JetExpressionWithLabel { public JetExpression getBaseExpression() { return findChildByClass(JetExpression.class); } + + @Override + public R accept(@NotNull JetVisitor visitor, D data) { + return visitor.visitLabeledExpression(this, data); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index 3ee23ea7e7a..c7032d0f603 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -107,8 +107,8 @@ public class JetPsiUtil { } } } - else if (expression instanceof JetPrefixExpression) { - JetExpression baseExpression = getBaseExpressionIfLabeledExpression((JetPrefixExpression) expression); + else if (expression instanceof JetLabeledExpression) { + JetExpression baseExpression = ((JetLabeledExpression) expression).getBaseExpression(); if (baseExpression != null) { expression = baseExpression; } @@ -124,26 +124,6 @@ public class JetPsiUtil { return expression; } - @Nullable - public static JetExpression getBaseExpressionIfLabeledExpression(@NotNull JetPrefixExpression expression) { - if (isLabeledExpression(expression)) { - return expression.getBaseExpression(); - } - return null; - } - - public static boolean isLabeledExpression(JetPrefixExpression expression) { - return expression.getOperationReference().getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER; - } - - @NotNull - public static String getLabelName(@NotNull JetPrefixExpression expression) { - assert isLabeledExpression(expression); - String labelName = expression.getOperationReference().getReferencedName(); - assert labelName.startsWith("@") : "Incorrect label name " + expression.getText(); - return labelName.substring(1); - } - @NotNull public static Name safeName(@Nullable String name) { return name == null ? SpecialNames.NO_NAME_PROVIDED : Name.identifier(name); @@ -571,7 +551,7 @@ public class JetPsiUtil { return maxPriority - 1; } - if (expression instanceof JetPrefixExpression) return maxPriority - 2; + if (expression instanceof JetPrefixExpression || expression instanceof JetLabeledExpression) return maxPriority - 2; if (expression instanceof JetDeclaration || expression instanceof JetStatementExpression || expression instanceof JetIfExpression) { return 0; @@ -625,7 +605,7 @@ public class JetPsiUtil { IElementType parentOperation = getOperation(parentExpression); // 'return (@label{...})' case - if (parentExpression instanceof JetReturnExpression && innerOperation == JetTokens.LABEL_IDENTIFIER) { + if (parentExpression instanceof JetReturnExpression && innerExpression instanceof JetLabeledExpression) { return true; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java index aee9465a913..b7fde83b325 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -170,6 +170,10 @@ public class JetVisitor extends PsiElementVisitor { return visitExpression(expression, data); } + public R visitLabeledExpression(@NotNull JetLabeledExpression expression, D data) { + return visitExpressionWithLabel(expression, data); + } + public R visitPrefixExpression(@NotNull JetPrefixExpression expression, D data) { return visitUnaryExpression(expression, data); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java index da93daec344..626af3a431a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java @@ -169,6 +169,10 @@ public class JetVisitorVoid extends JetVisitor { super.visitReferenceExpression(expression, null); } + public void visitLabeledExpression(@NotNull JetLabeledExpression expression) { + super.visitLabeledExpression(expression, null); + } + public void visitPrefixExpression(@NotNull JetPrefixExpression expression) { super.visitPrefixExpression(expression, null); } @@ -630,6 +634,12 @@ public class JetVisitorVoid extends JetVisitor { return null; } + @Override + public final Void visitLabeledExpression(@NotNull JetLabeledExpression expression, Void data) { + visitLabeledExpression(expression); + return null; + } + @Override public final Void visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) { visitPrefixExpression(expression); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java index 11f5e3920b9..2841096c837 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java @@ -170,6 +170,10 @@ public class JetVisitorVoidWithParameter

extends JetVisitor { super.visitReferenceExpression(expression, data); } + public void visitLabeledExpressionVoid(@NotNull JetLabeledExpression expression, P data) { + super.visitLabeledExpression(expression, data); + } + public void visitPrefixExpressionVoid(@NotNull JetPrefixExpression expression, P data) { super.visitPrefixExpression(expression, data); } @@ -627,6 +631,12 @@ public class JetVisitorVoidWithParameter

extends JetVisitor { return null; } + @Override + public final Void visitLabeledExpression(@NotNull JetLabeledExpression expression, P data) { + visitLabeledExpressionVoid(expression, data); + return null; + } + @Override public final Void visitPrefixExpression(@NotNull JetPrefixExpression expression, P data) { visitPrefixExpressionVoid(expression, data); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 0e177bb43d7..c18fd48ffc5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -492,8 +492,8 @@ public class CandidateResolver { } @Override - public JetExpression visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) { - return visitInnerExpression(JetPsiUtil.getBaseExpressionIfLabeledExpression(expression)); + public JetExpression visitLabeledExpression(@NotNull JetLabeledExpression expression, Void data) { + return visitInnerExpression(expression.getBaseExpression()); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java index 0cf058bad5a..ac40516e7c6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java @@ -105,16 +105,15 @@ public class InlineCallResolverExtension implements CallResolverExtension { if (parent instanceof JetValueArgument || parent instanceof JetBinaryExpression || parent instanceof JetUnaryExpression || + parent instanceof JetLabeledExpression || parent instanceof JetDotQualifiedExpression || parent instanceof JetCallExpression || parent instanceof JetArrayAccessExpression || parent instanceof JetMultiDeclaration) { - if (parent instanceof JetPrefixExpression) { - if (JetPsiUtil.isLabeledExpression((JetPrefixExpression) parent)) { - parent = parent.getParent(); - continue; - } + if (parent instanceof JetLabeledExpression) { + parent = parent.getParent(); + continue; } else if (parent instanceof JetBinaryExpression) { JetToken token = JetPsiUtil.getOperationToken((JetOperationExpression) parent); 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 6734c8db5d5..aa1629f2108 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 @@ -601,11 +601,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } @Override - public JetTypeInfo visitUnaryExpression(@NotNull JetUnaryExpression expression, ExpressionTypingContext context) { - return visitUnaryExpression(expression, context, false); - } - - public JetTypeInfo visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext contextWithExpectedType, boolean isStatement) { + public JetTypeInfo visitUnaryExpression(@NotNull JetUnaryExpression expression, ExpressionTypingContext contextWithExpectedType) { ExpressionTypingContext context = isUnaryExpressionDependentOnExpectedType(expression) ? contextWithExpectedType : contextWithExpectedType.replaceContextDependency(INDEPENDENT).replaceExpectedType(NO_EXPECTED_TYPE); @@ -616,10 +612,6 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { JetSimpleNameExpression operationSign = expression.getOperationReference(); IElementType operationType = operationSign.getReferencedNameElementType(); - // If it's a labeled expression - if (operationType == JetTokens.LABEL_IDENTIFIER) { - return visitLabeledExpression(expression, context, isStatement); - } // Special case for expr!! if (operationType == JetTokens.EXCLEXCL) { @@ -741,12 +733,21 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return JetTypeInfo.create(TypeUtils.makeNotNullable(baseType), dataFlowInfo); } - private JetTypeInfo visitLabeledExpression(@NotNull JetUnaryExpression expression, @NotNull ExpressionTypingContext context, - boolean isStatement) { + @Override + public JetTypeInfo visitLabeledExpression( + @NotNull JetLabeledExpression expression, ExpressionTypingContext context + ) { + return visitLabeledExpression(expression, context, false); + } + + @NotNull + public JetTypeInfo visitLabeledExpression( + @NotNull JetLabeledExpression expression, + @NotNull ExpressionTypingContext context, + boolean isStatement + ) { JetExpression baseExpression = expression.getBaseExpression(); - assert baseExpression != null; - JetSimpleNameExpression operationSign = expression.getOperationReference(); - assert operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER; + if (baseExpression == null) return JetTypeInfo.create(null, context.dataFlowInfo); return facade.getTypeInfo(baseExpression, context, isStatement); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 92edee8febb..5a8715597e4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -483,8 +483,7 @@ public class ExpressionTypingUtils { || operationType == JetTokens.ELVIS); } - public static boolean isUnaryExpressionDependentOnExpectedType(@NotNull JetUnaryExpression expression) { - IElementType operationType = expression.getOperationReference().getReferencedNameElementType(); - return operationType == JetTokens.LABEL_IDENTIFIER || operationType == JetTokens.EXCLEXCL; + public static boolean isUnaryExpressionDependentOnExpectedType(@NotNull JetUnaryExpression expression) { + return expression.getOperationReference().getReferencedNameElementType() == JetTokens.EXCLEXCL; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index fbfe9416689..6c150cffc6d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -385,7 +385,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito } @Override - public JetTypeInfo visitUnaryExpression(@NotNull JetUnaryExpression expression, ExpressionTypingContext context) { - return basic.visitUnaryExpression(expression, context, true); + public JetTypeInfo visitLabeledExpression(@NotNull JetLabeledExpression expression, ExpressionTypingContext context) { + return basic.visitLabeledExpression(expression, context, true); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java index 7d3c6824ca7..d14352400d7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java @@ -59,13 +59,10 @@ public class LabelResolver { @Nullable private Name getLabelNameIfAny(@NotNull PsiElement element) { - if (element instanceof JetPrefixExpression) { - JetPrefixExpression prefixExpression = (JetPrefixExpression) element; - if (JetPsiUtil.isLabeledExpression(prefixExpression)) { - return Name.identifierForLabel(JetPsiUtil.getLabelName(prefixExpression)); - } + if (element instanceof JetLabeledExpression) { + return Name.identifierForLabel(((JetLabeledExpression) element).getLabelName()); } - else if (element instanceof JetFunctionLiteralExpression) { + if (element instanceof JetFunctionLiteralExpression) { return getCallerName((JetFunctionLiteralExpression) element); } return null; diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java index 1633d454739..d7c493f9cfc 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java +++ b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java @@ -267,7 +267,7 @@ public class JetPositionManager implements PositionManager { PsiElement valueArgument = functionLiteralExpression; while (parent instanceof JetParenthesizedExpression || parent instanceof JetBinaryExpressionWithTypeRHS || - parent instanceof JetPrefixExpression && JetPsiUtil.isLabeledExpression((JetPrefixExpression) parent)) { + parent instanceof JetLabeledExpression) { valueArgument = parent; parent = parent.getParent(); } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/LabelsHighlightingVisitor.java b/idea/src/org/jetbrains/jet/plugin/highlighter/LabelsHighlightingVisitor.java index 11e4c093934..7a3d1e4d5db 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/LabelsHighlightingVisitor.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/LabelsHighlightingVisitor.java @@ -19,23 +19,13 @@ package org.jetbrains.jet.plugin.highlighter; import com.intellij.lang.annotation.AnnotationHolder; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetExpressionWithLabel; -import org.jetbrains.jet.lang.psi.JetPrefixExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; -import org.jetbrains.jet.lexer.JetTokens; class LabelsHighlightingVisitor extends HighlightingVisitor { LabelsHighlightingVisitor(AnnotationHolder holder) { super(holder); } - @Override - public void visitPrefixExpression(@NotNull JetPrefixExpression expression) { - JetSimpleNameExpression operationSign = expression.getOperationReference(); - if (operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) { - JetPsiChecker.highlightName(holder, operationSign, JetHighlightingColors.LABEL); - } - } - @Override public void visitExpressionWithLabel(@NotNull JetExpressionWithLabel expression) { JetSimpleNameExpression targetLabel = expression.getTargetLabel(); diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java index 67ed53ec86d..ae0c1232a64 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java @@ -86,8 +86,8 @@ class JetInvokeFunctionReference extends JetSimpleReference i List functionLiteralArguments = getExpression().getFunctionLiteralArguments(); for (JetExpression functionLiteralArgument : functionLiteralArguments) { - while (functionLiteralArgument instanceof JetPrefixExpression) { - functionLiteralArgument = ((JetPrefixExpression) functionLiteralArgument).getBaseExpression(); + while (functionLiteralArgument instanceof JetLabeledExpression) { + functionLiteralArgument = ((JetLabeledExpression) functionLiteralArgument).getBaseExpression(); } if (functionLiteralArgument instanceof JetFunctionLiteralExpression) { diff --git a/idea/src/org/jetbrains/jet/plugin/util/JetPsiPrecedences.kt b/idea/src/org/jetbrains/jet/plugin/util/JetPsiPrecedences.kt index 14711838b3e..78aea90bf25 100644 --- a/idea/src/org/jetbrains/jet/plugin/util/JetPsiPrecedences.kt +++ b/idea/src/org/jetbrains/jet/plugin/util/JetPsiPrecedences.kt @@ -46,6 +46,7 @@ public object JetPsiPrecedences { public fun getPrecedence(expression: JetExpression): Int { return when (expression) { is JetAnnotatedExpression, + is JetLabeledExpression, is JetPrefixExpression -> PRECEDENCE_OF_PREFIX_EXPRESSION is JetPostfixExpression -> PRECEDENCE_OF_POSTFIX_EXPRESSION is JetOperationExpression -> { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index ca125eaa479..ad27cb000e9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -291,25 +291,23 @@ public final class ExpressionVisitor extends TranslatorVisitor { return QualifiedExpressionTranslator.translateQualifiedExpression(expression, context); } + @Override + public JsNode visitLabeledExpression( + @NotNull JetLabeledExpression expression, TranslationContext context + ) { + JetExpression baseExpression = expression.getBaseExpression(); + assert baseExpression != null; + return new JsLabel(context.scope().declareName(getReferencedName(expression.getTargetLabel())), + convertToStatement(baseExpression.accept(this, context))).source(expression); + } + @Override @NotNull public JsNode visitPrefixExpression( @NotNull JetPrefixExpression expression, @NotNull TranslationContext context ) { - JetSimpleNameExpression operationReference = expression.getOperationReference(); - IElementType operationToken = operationReference.getReferencedNameElementType(); - JsNode result; - if (operationToken == JetTokens.LABEL_IDENTIFIER) { - JetExpression baseExpression = expression.getBaseExpression(); - assert baseExpression != null; - result = new JsLabel(context.scope().declareName(getReferencedName(operationReference)), - convertToStatement(baseExpression.accept(this, context))); - } - else { - result = UnaryOperationTranslator.translate(expression, context); - } - return result.source(expression); + return UnaryOperationTranslator.translate(expression, context).source(expression); } @Override