Replaced PrefixExpression with LabeledExpression
where labeled expression is used Added 'visitLabeledExpression'
This commit is contained in:
@@ -2917,23 +2917,21 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static JetSimpleNameExpression targetLabel(JetExpression expression) {
|
private static JetSimpleNameExpression targetLabel(JetExpression expression) {
|
||||||
if (expression.getParent() instanceof JetPrefixExpression) {
|
if (expression.getParent() instanceof JetLabeledExpression) {
|
||||||
JetPrefixExpression parent = (JetPrefixExpression) expression.getParent();
|
return ((JetLabeledExpression) expression.getParent()).getTargetLabel();
|
||||||
JetSimpleNameExpression operationSign = parent.getOperationReference();
|
|
||||||
if (operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) {
|
|
||||||
return operationSign;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StackValue visitPrefixExpression(@NotNull JetPrefixExpression expression, StackValue receiver) {
|
public StackValue visitLabeledExpression(
|
||||||
JetSimpleNameExpression operationSign = expression.getOperationReference();
|
@NotNull JetLabeledExpression expression, StackValue receiver
|
||||||
if (operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) {
|
) {
|
||||||
return genQualified(receiver, expression.getBaseExpression());
|
return genQualified(receiver, expression.getBaseExpression());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StackValue visitPrefixExpression(@NotNull JetPrefixExpression expression, StackValue receiver) {
|
||||||
DeclarationDescriptor op = bindingContext.get(REFERENCE_TARGET, expression.getOperationReference());
|
DeclarationDescriptor op = bindingContext.get(REFERENCE_TARGET, expression.getOperationReference());
|
||||||
assert op instanceof FunctionDescriptor : String.valueOf(op);
|
assert op instanceof FunctionDescriptor : String.valueOf(op);
|
||||||
Callable callable = resolveToCallable((FunctionDescriptor) op, false);
|
Callable callable = resolveToCallable((FunctionDescriptor) op, false);
|
||||||
|
|||||||
@@ -96,9 +96,9 @@ public class DebugInfoUtil {
|
|||||||
if (EXCLUDED.contains(referencedNameElementType)) {
|
if (EXCLUDED.contains(referencedNameElementType)) {
|
||||||
return;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,18 +229,11 @@ public class JetControlFlowProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitExpressionWithLabelVoid(@NotNull JetExpressionWithLabel expression, CFPContext context) {
|
public void visitLabeledExpressionVoid(@NotNull JetLabeledExpression expression, CFPContext context) {
|
||||||
String labelName = expression.getLabelName();
|
mark(expression);
|
||||||
JetExpression labeledExpression = expression.getLabeledExpression();
|
JetExpression baseExpression = expression.getBaseExpression();
|
||||||
if (labelName != null && labeledExpression != null) {
|
if (baseExpression != null) {
|
||||||
visitLabeledExpression(labelName, labeledExpression, context);
|
generateInstructions(baseExpression, context);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void visitLabeledExpression(@NotNull String labelName, @NotNull JetExpression labeledExpression, CFPContext context) {
|
|
||||||
JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression);
|
|
||||||
if (deparenthesized != null) {
|
|
||||||
generateInstructions(labeledExpression, context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,11 +367,7 @@ public class JetControlFlowProcessor {
|
|||||||
IElementType operationType = operationSign.getReferencedNameElementType();
|
IElementType operationType = operationSign.getReferencedNameElementType();
|
||||||
JetExpression baseExpression = expression.getBaseExpression();
|
JetExpression baseExpression = expression.getBaseExpression();
|
||||||
if (baseExpression == null) return;
|
if (baseExpression == null) return;
|
||||||
if (operationType == JetTokens.LABEL_IDENTIFIER) {
|
if (JetTokens.EXCLEXCL == operationType) {
|
||||||
String referencedName = operationSign.getReferencedName();
|
|
||||||
visitLabeledExpression(referencedName.substring(1), baseExpression, context);
|
|
||||||
}
|
|
||||||
else if (JetTokens.EXCLEXCL == operationType) {
|
|
||||||
generateInstructions(baseExpression, NOT_IN_CONDITION);
|
generateInstructions(baseExpression, NOT_IN_CONDITION);
|
||||||
builder.predefinedOperation(expression, NOT_NULL_ASSERTION);
|
builder.predefinedOperation(expression, NOT_NULL_ASSERTION);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-7
@@ -102,14 +102,12 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitPrefixExpression(expression: JetPrefixExpression, expectedType: JetType?): CompileTimeConstant<*>? {
|
override fun visitLabeledExpression(expression: JetLabeledExpression, expectedType: JetType?): CompileTimeConstant<*>? {
|
||||||
val deparenthesizedExpression = JetPsiUtil.deparenthesize(expression)
|
val baseExpression = expression.getBaseExpression()
|
||||||
return if (deparenthesizedExpression != null && deparenthesizedExpression != expression) {
|
if (baseExpression != null) {
|
||||||
evaluate(deparenthesizedExpression, expectedType)
|
return evaluate(baseExpression, expectedType)
|
||||||
}
|
|
||||||
else {
|
|
||||||
super.visitPrefixExpression(expression, expectedType)
|
|
||||||
}
|
}
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitStringTemplateExpression(expression: JetStringTemplateExpression, expectedType: JetType?): CompileTimeConstant<*>? {
|
override fun visitStringTemplateExpression(expression: JetStringTemplateExpression, expectedType: JetType?): CompileTimeConstant<*>? {
|
||||||
|
|||||||
@@ -76,13 +76,11 @@ public class JetCallExpression extends JetReferenceExpression implements JetCall
|
|||||||
if (psi instanceof JetFunctionLiteralExpression) {
|
if (psi instanceof JetFunctionLiteralExpression) {
|
||||||
result.add((JetFunctionLiteralExpression) psi);
|
result.add((JetFunctionLiteralExpression) psi);
|
||||||
}
|
}
|
||||||
else if (psi instanceof JetPrefixExpression) {
|
else if (psi instanceof JetLabeledExpression) {
|
||||||
JetPrefixExpression prefixExpression = (JetPrefixExpression) psi;
|
JetLabeledExpression labeledExpression = (JetLabeledExpression) psi;
|
||||||
if (prefixExpression.getOperationReference().getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER) {
|
JetExpression baseExpression = labeledExpression.getBaseExpression();
|
||||||
JetExpression labeledExpression = prefixExpression.getBaseExpression();
|
if (baseExpression instanceof JetFunctionLiteralExpression) {
|
||||||
if (labeledExpression instanceof JetFunctionLiteralExpression) {
|
result.add(labeledExpression);
|
||||||
result.add(prefixExpression);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
node = node.getTreeNext();
|
node = node.getTreeNext();
|
||||||
|
|||||||
@@ -34,15 +34,15 @@ public class JetExpressionWithLabel extends JetExpressionImpl {
|
|||||||
return (JetSimpleNameExpression) qualifier.findChildByType(JetNodeTypes.LABEL_REFERENCE);
|
return (JetSimpleNameExpression) qualifier.findChildByType(JetNodeTypes.LABEL_REFERENCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable @IfNotParsed
|
|
||||||
public JetExpression getLabeledExpression() {
|
|
||||||
return findChildByClass(JetExpression.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public String getLabelName() {
|
public String getLabelName() {
|
||||||
JetSimpleNameExpression labelElement = getTargetLabel();
|
JetSimpleNameExpression labelElement = getTargetLabel();
|
||||||
assert labelElement == null || labelElement.getText().startsWith("@");
|
assert labelElement == null || labelElement.getText().startsWith("@");
|
||||||
return labelElement == null ? null : labelElement.getText().substring(1);
|
return labelElement == null ? null : labelElement.getText().substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
|
||||||
|
return visitor.visitExpressionWithLabel(this, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,4 +47,9 @@ public class JetLabeledExpression extends JetExpressionWithLabel {
|
|||||||
public JetExpression getBaseExpression() {
|
public JetExpression getBaseExpression() {
|
||||||
return findChildByClass(JetExpression.class);
|
return findChildByClass(JetExpression.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
|
||||||
|
return visitor.visitLabeledExpression(this, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,8 +107,8 @@ public class JetPsiUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (expression instanceof JetPrefixExpression) {
|
else if (expression instanceof JetLabeledExpression) {
|
||||||
JetExpression baseExpression = getBaseExpressionIfLabeledExpression((JetPrefixExpression) expression);
|
JetExpression baseExpression = ((JetLabeledExpression) expression).getBaseExpression();
|
||||||
if (baseExpression != null) {
|
if (baseExpression != null) {
|
||||||
expression = baseExpression;
|
expression = baseExpression;
|
||||||
}
|
}
|
||||||
@@ -124,26 +124,6 @@ public class JetPsiUtil {
|
|||||||
return expression;
|
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
|
@NotNull
|
||||||
public static Name safeName(@Nullable String name) {
|
public static Name safeName(@Nullable String name) {
|
||||||
return name == null ? SpecialNames.NO_NAME_PROVIDED : Name.identifier(name);
|
return name == null ? SpecialNames.NO_NAME_PROVIDED : Name.identifier(name);
|
||||||
@@ -571,7 +551,7 @@ public class JetPsiUtil {
|
|||||||
return maxPriority - 1;
|
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) {
|
if (expression instanceof JetDeclaration || expression instanceof JetStatementExpression || expression instanceof JetIfExpression) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -625,7 +605,7 @@ public class JetPsiUtil {
|
|||||||
IElementType parentOperation = getOperation(parentExpression);
|
IElementType parentOperation = getOperation(parentExpression);
|
||||||
|
|
||||||
// 'return (@label{...})' case
|
// 'return (@label{...})' case
|
||||||
if (parentExpression instanceof JetReturnExpression && innerOperation == JetTokens.LABEL_IDENTIFIER) {
|
if (parentExpression instanceof JetReturnExpression && innerExpression instanceof JetLabeledExpression) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -170,6 +170,10 @@ public class JetVisitor<R, D> extends PsiElementVisitor {
|
|||||||
return visitExpression(expression, data);
|
return visitExpression(expression, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public R visitLabeledExpression(@NotNull JetLabeledExpression expression, D data) {
|
||||||
|
return visitExpressionWithLabel(expression, data);
|
||||||
|
}
|
||||||
|
|
||||||
public R visitPrefixExpression(@NotNull JetPrefixExpression expression, D data) {
|
public R visitPrefixExpression(@NotNull JetPrefixExpression expression, D data) {
|
||||||
return visitUnaryExpression(expression, data);
|
return visitUnaryExpression(expression, data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,6 +169,10 @@ public class JetVisitorVoid extends JetVisitor<Void, Void> {
|
|||||||
super.visitReferenceExpression(expression, null);
|
super.visitReferenceExpression(expression, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void visitLabeledExpression(@NotNull JetLabeledExpression expression) {
|
||||||
|
super.visitLabeledExpression(expression, null);
|
||||||
|
}
|
||||||
|
|
||||||
public void visitPrefixExpression(@NotNull JetPrefixExpression expression) {
|
public void visitPrefixExpression(@NotNull JetPrefixExpression expression) {
|
||||||
super.visitPrefixExpression(expression, null);
|
super.visitPrefixExpression(expression, null);
|
||||||
}
|
}
|
||||||
@@ -630,6 +634,12 @@ public class JetVisitorVoid extends JetVisitor<Void, Void> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final Void visitLabeledExpression(@NotNull JetLabeledExpression expression, Void data) {
|
||||||
|
visitLabeledExpression(expression);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Void visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) {
|
public final Void visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) {
|
||||||
visitPrefixExpression(expression);
|
visitPrefixExpression(expression);
|
||||||
|
|||||||
@@ -170,6 +170,10 @@ public class JetVisitorVoidWithParameter<P> extends JetVisitor<Void, P> {
|
|||||||
super.visitReferenceExpression(expression, data);
|
super.visitReferenceExpression(expression, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void visitLabeledExpressionVoid(@NotNull JetLabeledExpression expression, P data) {
|
||||||
|
super.visitLabeledExpression(expression, data);
|
||||||
|
}
|
||||||
|
|
||||||
public void visitPrefixExpressionVoid(@NotNull JetPrefixExpression expression, P data) {
|
public void visitPrefixExpressionVoid(@NotNull JetPrefixExpression expression, P data) {
|
||||||
super.visitPrefixExpression(expression, data);
|
super.visitPrefixExpression(expression, data);
|
||||||
}
|
}
|
||||||
@@ -627,6 +631,12 @@ public class JetVisitorVoidWithParameter<P> extends JetVisitor<Void, P> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final Void visitLabeledExpression(@NotNull JetLabeledExpression expression, P data) {
|
||||||
|
visitLabeledExpressionVoid(expression, data);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Void visitPrefixExpression(@NotNull JetPrefixExpression expression, P data) {
|
public final Void visitPrefixExpression(@NotNull JetPrefixExpression expression, P data) {
|
||||||
visitPrefixExpressionVoid(expression, data);
|
visitPrefixExpressionVoid(expression, data);
|
||||||
|
|||||||
@@ -492,8 +492,8 @@ public class CandidateResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JetExpression visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) {
|
public JetExpression visitLabeledExpression(@NotNull JetLabeledExpression expression, Void data) {
|
||||||
return visitInnerExpression(JetPsiUtil.getBaseExpressionIfLabeledExpression(expression));
|
return visitInnerExpression(expression.getBaseExpression());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+2
-3
@@ -105,17 +105,16 @@ public class InlineCallResolverExtension implements CallResolverExtension {
|
|||||||
if (parent instanceof JetValueArgument ||
|
if (parent instanceof JetValueArgument ||
|
||||||
parent instanceof JetBinaryExpression ||
|
parent instanceof JetBinaryExpression ||
|
||||||
parent instanceof JetUnaryExpression ||
|
parent instanceof JetUnaryExpression ||
|
||||||
|
parent instanceof JetLabeledExpression ||
|
||||||
parent instanceof JetDotQualifiedExpression ||
|
parent instanceof JetDotQualifiedExpression ||
|
||||||
parent instanceof JetCallExpression ||
|
parent instanceof JetCallExpression ||
|
||||||
parent instanceof JetArrayAccessExpression ||
|
parent instanceof JetArrayAccessExpression ||
|
||||||
parent instanceof JetMultiDeclaration) {
|
parent instanceof JetMultiDeclaration) {
|
||||||
|
|
||||||
if (parent instanceof JetPrefixExpression) {
|
if (parent instanceof JetLabeledExpression) {
|
||||||
if (JetPsiUtil.isLabeledExpression((JetPrefixExpression) parent)) {
|
|
||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (parent instanceof JetBinaryExpression) {
|
else if (parent instanceof JetBinaryExpression) {
|
||||||
JetToken token = JetPsiUtil.getOperationToken((JetOperationExpression) parent);
|
JetToken token = JetPsiUtil.getOperationToken((JetOperationExpression) parent);
|
||||||
if (token == JetTokens.EQ || token == JetTokens.ANDAND || token == JetTokens.OROR) {
|
if (token == JetTokens.EQ || token == JetTokens.ANDAND || token == JetTokens.OROR) {
|
||||||
|
|||||||
+15
-14
@@ -601,11 +601,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JetTypeInfo visitUnaryExpression(@NotNull JetUnaryExpression expression, ExpressionTypingContext context) {
|
public JetTypeInfo visitUnaryExpression(@NotNull JetUnaryExpression expression, ExpressionTypingContext contextWithExpectedType) {
|
||||||
return visitUnaryExpression(expression, context, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JetTypeInfo visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext contextWithExpectedType, boolean isStatement) {
|
|
||||||
ExpressionTypingContext context = isUnaryExpressionDependentOnExpectedType(expression)
|
ExpressionTypingContext context = isUnaryExpressionDependentOnExpectedType(expression)
|
||||||
? contextWithExpectedType
|
? contextWithExpectedType
|
||||||
: contextWithExpectedType.replaceContextDependency(INDEPENDENT).replaceExpectedType(NO_EXPECTED_TYPE);
|
: contextWithExpectedType.replaceContextDependency(INDEPENDENT).replaceExpectedType(NO_EXPECTED_TYPE);
|
||||||
@@ -616,10 +612,6 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
JetSimpleNameExpression operationSign = expression.getOperationReference();
|
JetSimpleNameExpression operationSign = expression.getOperationReference();
|
||||||
|
|
||||||
IElementType operationType = operationSign.getReferencedNameElementType();
|
IElementType operationType = operationSign.getReferencedNameElementType();
|
||||||
// If it's a labeled expression
|
|
||||||
if (operationType == JetTokens.LABEL_IDENTIFIER) {
|
|
||||||
return visitLabeledExpression(expression, context, isStatement);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special case for expr!!
|
// Special case for expr!!
|
||||||
if (operationType == JetTokens.EXCLEXCL) {
|
if (operationType == JetTokens.EXCLEXCL) {
|
||||||
@@ -741,12 +733,21 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
return JetTypeInfo.create(TypeUtils.makeNotNullable(baseType), dataFlowInfo);
|
return JetTypeInfo.create(TypeUtils.makeNotNullable(baseType), dataFlowInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JetTypeInfo visitLabeledExpression(@NotNull JetUnaryExpression expression, @NotNull ExpressionTypingContext context,
|
@Override
|
||||||
boolean isStatement) {
|
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();
|
JetExpression baseExpression = expression.getBaseExpression();
|
||||||
assert baseExpression != null;
|
if (baseExpression == null) return JetTypeInfo.create(null, context.dataFlowInfo);
|
||||||
JetSimpleNameExpression operationSign = expression.getOperationReference();
|
|
||||||
assert operationSign.getReferencedNameElementType() == JetTokens.LABEL_IDENTIFIER;
|
|
||||||
|
|
||||||
return facade.getTypeInfo(baseExpression, context, isStatement);
|
return facade.getTypeInfo(baseExpression, context, isStatement);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -484,7 +484,6 @@ public class ExpressionTypingUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isUnaryExpressionDependentOnExpectedType(@NotNull JetUnaryExpression expression) {
|
public static boolean isUnaryExpressionDependentOnExpectedType(@NotNull JetUnaryExpression expression) {
|
||||||
IElementType operationType = expression.getOperationReference().getReferencedNameElementType();
|
return expression.getOperationReference().getReferencedNameElementType() == JetTokens.EXCLEXCL;
|
||||||
return operationType == JetTokens.LABEL_IDENTIFIER || operationType == JetTokens.EXCLEXCL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -385,7 +385,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JetTypeInfo visitUnaryExpression(@NotNull JetUnaryExpression expression, ExpressionTypingContext context) {
|
public JetTypeInfo visitLabeledExpression(@NotNull JetLabeledExpression expression, ExpressionTypingContext context) {
|
||||||
return basic.visitUnaryExpression(expression, context, true);
|
return basic.visitLabeledExpression(expression, context, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,13 +59,10 @@ public class LabelResolver {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Name getLabelNameIfAny(@NotNull PsiElement element) {
|
private Name getLabelNameIfAny(@NotNull PsiElement element) {
|
||||||
if (element instanceof JetPrefixExpression) {
|
if (element instanceof JetLabeledExpression) {
|
||||||
JetPrefixExpression prefixExpression = (JetPrefixExpression) element;
|
return Name.identifierForLabel(((JetLabeledExpression) element).getLabelName());
|
||||||
if (JetPsiUtil.isLabeledExpression(prefixExpression)) {
|
|
||||||
return Name.identifierForLabel(JetPsiUtil.getLabelName(prefixExpression));
|
|
||||||
}
|
}
|
||||||
}
|
if (element instanceof JetFunctionLiteralExpression) {
|
||||||
else if (element instanceof JetFunctionLiteralExpression) {
|
|
||||||
return getCallerName((JetFunctionLiteralExpression) element);
|
return getCallerName((JetFunctionLiteralExpression) element);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -267,7 +267,7 @@ public class JetPositionManager implements PositionManager {
|
|||||||
PsiElement valueArgument = functionLiteralExpression;
|
PsiElement valueArgument = functionLiteralExpression;
|
||||||
while (parent instanceof JetParenthesizedExpression ||
|
while (parent instanceof JetParenthesizedExpression ||
|
||||||
parent instanceof JetBinaryExpressionWithTypeRHS ||
|
parent instanceof JetBinaryExpressionWithTypeRHS ||
|
||||||
parent instanceof JetPrefixExpression && JetPsiUtil.isLabeledExpression((JetPrefixExpression) parent)) {
|
parent instanceof JetLabeledExpression) {
|
||||||
valueArgument = parent;
|
valueArgument = parent;
|
||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,23 +19,13 @@ package org.jetbrains.jet.plugin.highlighter;
|
|||||||
import com.intellij.lang.annotation.AnnotationHolder;
|
import com.intellij.lang.annotation.AnnotationHolder;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.JetExpressionWithLabel;
|
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.lang.psi.JetSimpleNameExpression;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
|
||||||
|
|
||||||
class LabelsHighlightingVisitor extends HighlightingVisitor {
|
class LabelsHighlightingVisitor extends HighlightingVisitor {
|
||||||
LabelsHighlightingVisitor(AnnotationHolder holder) {
|
LabelsHighlightingVisitor(AnnotationHolder holder) {
|
||||||
super(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
|
@Override
|
||||||
public void visitExpressionWithLabel(@NotNull JetExpressionWithLabel expression) {
|
public void visitExpressionWithLabel(@NotNull JetExpressionWithLabel expression) {
|
||||||
JetSimpleNameExpression targetLabel = expression.getTargetLabel();
|
JetSimpleNameExpression targetLabel = expression.getTargetLabel();
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ class JetInvokeFunctionReference extends JetSimpleReference<JetCallExpression> i
|
|||||||
|
|
||||||
List<JetExpression> functionLiteralArguments = getExpression().getFunctionLiteralArguments();
|
List<JetExpression> functionLiteralArguments = getExpression().getFunctionLiteralArguments();
|
||||||
for (JetExpression functionLiteralArgument : functionLiteralArguments) {
|
for (JetExpression functionLiteralArgument : functionLiteralArguments) {
|
||||||
while (functionLiteralArgument instanceof JetPrefixExpression) {
|
while (functionLiteralArgument instanceof JetLabeledExpression) {
|
||||||
functionLiteralArgument = ((JetPrefixExpression) functionLiteralArgument).getBaseExpression();
|
functionLiteralArgument = ((JetLabeledExpression) functionLiteralArgument).getBaseExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (functionLiteralArgument instanceof JetFunctionLiteralExpression) {
|
if (functionLiteralArgument instanceof JetFunctionLiteralExpression) {
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public object JetPsiPrecedences {
|
|||||||
public fun getPrecedence(expression: JetExpression): Int {
|
public fun getPrecedence(expression: JetExpression): Int {
|
||||||
return when (expression) {
|
return when (expression) {
|
||||||
is JetAnnotatedExpression,
|
is JetAnnotatedExpression,
|
||||||
|
is JetLabeledExpression,
|
||||||
is JetPrefixExpression -> PRECEDENCE_OF_PREFIX_EXPRESSION
|
is JetPrefixExpression -> PRECEDENCE_OF_PREFIX_EXPRESSION
|
||||||
is JetPostfixExpression -> PRECEDENCE_OF_POSTFIX_EXPRESSION
|
is JetPostfixExpression -> PRECEDENCE_OF_POSTFIX_EXPRESSION
|
||||||
is JetOperationExpression -> {
|
is JetOperationExpression -> {
|
||||||
|
|||||||
+11
-13
@@ -291,25 +291,23 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
|
|||||||
return QualifiedExpressionTranslator.translateQualifiedExpression(expression, context);
|
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
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public JsNode visitPrefixExpression(
|
public JsNode visitPrefixExpression(
|
||||||
@NotNull JetPrefixExpression expression,
|
@NotNull JetPrefixExpression expression,
|
||||||
@NotNull TranslationContext context
|
@NotNull TranslationContext context
|
||||||
) {
|
) {
|
||||||
JetSimpleNameExpression operationReference = expression.getOperationReference();
|
return UnaryOperationTranslator.translate(expression, context).source(expression);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user