From a02af7344ee5ef382b5e2bc04af5efb6bf131a67 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 13 May 2014 15:17:24 +0400 Subject: [PATCH] LabelResolver refactoring: rename public methods resolveLabel -> resolveControlLabel resolveThisLabel -> resolveThisOrSuperLabel + small improvements --- .../BasicExpressionTypingVisitor.java | 3 +- .../ControlStructureTypingVisitor.java | 9 +- .../lang/types/expressions/LabelResolver.java | 83 +++++++++++-------- 3 files changed, 53 insertions(+), 42 deletions(-) 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 84815829960..be8a56f607c 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 @@ -377,8 +377,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { String labelName = expression.getLabelName(); if (labelName != null) { LabelResolver.LabeledReceiverResolutionResult resolutionResult = - LabelResolver.INSTANCE.resolveThisLabel( - expression.getInstanceReference(), expression.getTargetLabel(), context, Name.identifierForLabel(labelName)); + LabelResolver.INSTANCE.resolveThisOrSuperLabel(expression, context, Name.identifierForLabel(labelName)); if (onlyClassReceivers && resolutionResult.success()) { if (!isDeclaredInClass(resolutionResult.getReceiverParameterDescriptor())) { return LabelResolver.LabeledReceiverResolutionResult.labelResolutionSuccess(NO_RECEIVER_PARAMETER); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index 4102fda4334..13a47130d3a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -52,7 +52,8 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.resolve.calls.context.ContextDependency.INDEPENDENT; import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE; import static org.jetbrains.jet.lang.types.TypeUtils.noExpectedType; -import static org.jetbrains.jet.lang.types.expressions.ControlStructureTypingUtils.*; +import static org.jetbrains.jet.lang.types.expressions.ControlStructureTypingUtils.createCallForSpecialConstruction; +import static org.jetbrains.jet.lang.types.expressions.ControlStructureTypingUtils.createDataFlowInfoForArgumentsForIfCall; import static org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils.*; public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { @@ -437,7 +438,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { @Override public JetTypeInfo visitReturnExpression(@NotNull JetReturnExpression expression, ExpressionTypingContext context) { - JetElement labelTargetElement = LabelResolver.INSTANCE.resolveLabel(expression, context); + JetElement labelTargetElement = LabelResolver.INSTANCE.resolveControlLabel(expression, context); JetExpression returnedExpression = expression.getReturnedExpression(); @@ -509,13 +510,13 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { @Override public JetTypeInfo visitBreakExpression(@NotNull JetBreakExpression expression, ExpressionTypingContext context) { - LabelResolver.INSTANCE.resolveLabel(expression, context); + LabelResolver.INSTANCE.resolveControlLabel(expression, context); return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getNothingType(), expression, context, context.dataFlowInfo); } @Override public JetTypeInfo visitContinueExpression(@NotNull JetContinueExpression expression, ExpressionTypingContext context) { - LabelResolver.INSTANCE.resolveLabel(expression, context); + LabelResolver.INSTANCE.resolveControlLabel(expression, context); return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getNothingType(), expression, context, context.dataFlowInfo); } 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 61d5c385607..129d6605126 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 @@ -24,7 +24,9 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext; import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; @@ -93,7 +95,7 @@ public class LabelResolver { } @Nullable - private JetCallExpression getContainingCallExpression(JetFunctionLiteralExpression expression) { + private JetCallExpression getContainingCallExpression(@NotNull JetFunctionLiteralExpression expression) { PsiElement parent = expression.getParent(); if (parent instanceof JetCallExpression) { // f {} @@ -114,61 +116,70 @@ public class LabelResolver { } @Nullable - private JetElement resolveControlLabel(@NotNull Name labelName, @NotNull JetSimpleNameExpression labelExpression, ExpressionTypingContext context) { + public JetElement resolveControlLabel( + @NotNull JetLabelQualifiedExpression expression, + @NotNull ResolutionContext context + ) { + JetSimpleNameExpression labelElement = expression.getTargetLabel(); + String name = expression.getLabelName(); + if (labelElement == null || name == null) return null; + + Name labelName = Name.identifierForLabel(name); Collection declarationsByLabel = context.scope.getDeclarationsByLabel(labelName); int size = declarationsByLabel.size(); - if (size == 1) { - DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next(); - JetElement element; - if (declarationDescriptor instanceof FunctionDescriptor || declarationDescriptor instanceof ClassDescriptor) { - element = (JetElement) BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), declarationDescriptor); - } - else { - throw new UnsupportedOperationException(declarationDescriptor.getClass().toString()); // TODO - } - context.trace.record(LABEL_TARGET, labelExpression, element); - return element; + if (size > 1) { + BindingContextUtils.reportAmbiguousLabel(context.trace, labelElement, declarationsByLabel); + return null; } - else if (size == 0) { - JetElement element = resolveNamedLabel(labelName, labelExpression, context); + if (size == 0) { + JetElement element = resolveNamedLabel(labelName, labelElement, context.trace); if (element == null) { - context.trace.report(UNRESOLVED_REFERENCE.on(labelExpression, labelExpression)); + context.trace.report(UNRESOLVED_REFERENCE.on(labelElement, labelElement)); } return element; } - BindingContextUtils.reportAmbiguousLabel(context.trace, labelExpression, declarationsByLabel); - return null; - } - - @Nullable - public JetElement resolveLabel(JetLabelQualifiedExpression expression, ExpressionTypingContext context) { - JetSimpleNameExpression labelElement = expression.getTargetLabel(); - if (labelElement != null) { - Name labelName = Name.identifierForLabel(expression.getLabelName()); - return resolveControlLabel(labelName, labelElement, context); + DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next(); + JetElement element; + if (declarationDescriptor instanceof FunctionDescriptor || declarationDescriptor instanceof ClassDescriptor) { + element = (JetElement) BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), declarationDescriptor); } - return null; + else { + throw new UnsupportedOperationException(declarationDescriptor.getClass().toString()); // TODO + } + context.trace.record(LABEL_TARGET, labelElement, element); + return element; } - private JetElement resolveNamedLabel(@NotNull Name labelName, @NotNull JetSimpleNameExpression labelExpression, ExpressionTypingContext context) { + private JetElement resolveNamedLabel( + @NotNull Name labelName, + @NotNull JetSimpleNameExpression labelExpression, + @NotNull BindingTrace trace + ) { List list = getElementsByLabelName(labelName, labelExpression); if (list.isEmpty()) return null; if (list.size() > 1) { - context.trace.report(LABEL_NAME_CLASH.on(labelExpression)); + trace.report(LABEL_NAME_CLASH.on(labelExpression)); } JetElement result = list.get(0); - context.trace.record(LABEL_TARGET, labelExpression, result); + trace.record(LABEL_TARGET, labelExpression, result); return result; } + + @NotNull + public LabeledReceiverResolutionResult resolveThisOrSuperLabel( + @NotNull JetLabelQualifiedInstanceExpression expression, + @NotNull ResolutionContext context, + @NotNull Name labelName + ) { + JetReferenceExpression referenceExpression = expression.getInstanceReference(); + JetSimpleNameExpression targetLabel = expression.getTargetLabel(); + assert targetLabel != null : expression; - public LabeledReceiverResolutionResult resolveThisLabel(JetReferenceExpression thisReference, JetSimpleNameExpression targetLabel, - ExpressionTypingContext context, Name labelName) { Collection declarationsByLabel = context.scope.getDeclarationsByLabel(labelName); int size = declarationsByLabel.size(); - assert targetLabel != null; if (size == 1) { DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next(); ReceiverParameterDescriptor thisReceiver; @@ -190,7 +201,7 @@ public class LabelResolver { PsiElement element = BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), declarationDescriptor); assert element != null : "No PSI element for descriptor: " + declarationDescriptor; context.trace.record(LABEL_TARGET, targetLabel, element); - context.trace.record(REFERENCE_TARGET, thisReference, declarationDescriptor); + context.trace.record(REFERENCE_TARGET, referenceExpression, declarationDescriptor); if (declarationDescriptor instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor; @@ -202,7 +213,7 @@ public class LabelResolver { return LabeledReceiverResolutionResult.labelResolutionSuccess(thisReceiver); } else if (size == 0) { - JetElement element = resolveNamedLabel(labelName, targetLabel, context); + JetElement element = resolveNamedLabel(labelName, targetLabel, context.trace); if (element instanceof JetFunctionLiteral) { DeclarationDescriptor declarationDescriptor = context.trace.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, element); @@ -210,7 +221,7 @@ public class LabelResolver { ReceiverParameterDescriptor thisReceiver = ((FunctionDescriptor) declarationDescriptor).getReceiverParameter(); if (thisReceiver != null) { context.trace.record(LABEL_TARGET, targetLabel, element); - context.trace.record(REFERENCE_TARGET, thisReference, declarationDescriptor); + context.trace.record(REFERENCE_TARGET, referenceExpression, declarationDescriptor); } return LabeledReceiverResolutionResult.labelResolutionSuccess(thisReceiver); }