LabelResolver refactoring: rename public methods

resolveLabel -> resolveControlLabel
resolveThisLabel -> resolveThisOrSuperLabel
+ small improvements
This commit is contained in:
Svetlana Isakova
2014-05-13 15:17:24 +04:00
parent 8c8db832f1
commit a02af7344e
3 changed files with 53 additions and 42 deletions
@@ -377,8 +377,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
String labelName = expression.getLabelName(); String labelName = expression.getLabelName();
if (labelName != null) { if (labelName != null) {
LabelResolver.LabeledReceiverResolutionResult resolutionResult = LabelResolver.LabeledReceiverResolutionResult resolutionResult =
LabelResolver.INSTANCE.resolveThisLabel( LabelResolver.INSTANCE.resolveThisOrSuperLabel(expression, context, Name.identifierForLabel(labelName));
expression.getInstanceReference(), expression.getTargetLabel(), context, Name.identifierForLabel(labelName));
if (onlyClassReceivers && resolutionResult.success()) { if (onlyClassReceivers && resolutionResult.success()) {
if (!isDeclaredInClass(resolutionResult.getReceiverParameterDescriptor())) { if (!isDeclaredInClass(resolutionResult.getReceiverParameterDescriptor())) {
return LabelResolver.LabeledReceiverResolutionResult.labelResolutionSuccess(NO_RECEIVER_PARAMETER); return LabelResolver.LabeledReceiverResolutionResult.labelResolutionSuccess(NO_RECEIVER_PARAMETER);
@@ -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.resolve.calls.context.ContextDependency.INDEPENDENT;
import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE; 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.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.*; import static org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils.*;
public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
@@ -437,7 +438,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
@Override @Override
public JetTypeInfo visitReturnExpression(@NotNull JetReturnExpression expression, ExpressionTypingContext context) { 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(); JetExpression returnedExpression = expression.getReturnedExpression();
@@ -509,13 +510,13 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
@Override @Override
public JetTypeInfo visitBreakExpression(@NotNull JetBreakExpression expression, ExpressionTypingContext context) { 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); return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getNothingType(), expression, context, context.dataFlowInfo);
} }
@Override @Override
public JetTypeInfo visitContinueExpression(@NotNull JetContinueExpression expression, ExpressionTypingContext context) { 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); return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getNothingType(), expression, context, context.dataFlowInfo);
} }
@@ -24,7 +24,9 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils; 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.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection; import java.util.Collection;
@@ -93,7 +95,7 @@ public class LabelResolver {
} }
@Nullable @Nullable
private JetCallExpression getContainingCallExpression(JetFunctionLiteralExpression expression) { private JetCallExpression getContainingCallExpression(@NotNull JetFunctionLiteralExpression expression) {
PsiElement parent = expression.getParent(); PsiElement parent = expression.getParent();
if (parent instanceof JetCallExpression) { if (parent instanceof JetCallExpression) {
// f {} // f {}
@@ -114,61 +116,70 @@ public class LabelResolver {
} }
@Nullable @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<DeclarationDescriptor> declarationsByLabel = context.scope.getDeclarationsByLabel(labelName); Collection<DeclarationDescriptor> declarationsByLabel = context.scope.getDeclarationsByLabel(labelName);
int size = declarationsByLabel.size(); int size = declarationsByLabel.size();
if (size == 1) { if (size > 1) {
DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next(); BindingContextUtils.reportAmbiguousLabel(context.trace, labelElement, declarationsByLabel);
JetElement element; return null;
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;
} }
else if (size == 0) { if (size == 0) {
JetElement element = resolveNamedLabel(labelName, labelExpression, context); JetElement element = resolveNamedLabel(labelName, labelElement, context.trace);
if (element == null) { if (element == null) {
context.trace.report(UNRESOLVED_REFERENCE.on(labelExpression, labelExpression)); context.trace.report(UNRESOLVED_REFERENCE.on(labelElement, labelElement));
} }
return element; return element;
} }
BindingContextUtils.reportAmbiguousLabel(context.trace, labelExpression, declarationsByLabel); DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next();
return null; JetElement element;
} if (declarationDescriptor instanceof FunctionDescriptor || declarationDescriptor instanceof ClassDescriptor) {
element = (JetElement) BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), declarationDescriptor);
@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);
} }
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<JetElement> list = getElementsByLabelName(labelName, labelExpression); List<JetElement> list = getElementsByLabelName(labelName, labelExpression);
if (list.isEmpty()) return null; if (list.isEmpty()) return null;
if (list.size() > 1) { if (list.size() > 1) {
context.trace.report(LABEL_NAME_CLASH.on(labelExpression)); trace.report(LABEL_NAME_CLASH.on(labelExpression));
} }
JetElement result = list.get(0); JetElement result = list.get(0);
context.trace.record(LABEL_TARGET, labelExpression, result); trace.record(LABEL_TARGET, labelExpression, result);
return 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<DeclarationDescriptor> declarationsByLabel = context.scope.getDeclarationsByLabel(labelName); Collection<DeclarationDescriptor> declarationsByLabel = context.scope.getDeclarationsByLabel(labelName);
int size = declarationsByLabel.size(); int size = declarationsByLabel.size();
assert targetLabel != null;
if (size == 1) { if (size == 1) {
DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next(); DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next();
ReceiverParameterDescriptor thisReceiver; ReceiverParameterDescriptor thisReceiver;
@@ -190,7 +201,7 @@ public class LabelResolver {
PsiElement element = BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), declarationDescriptor); PsiElement element = BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), declarationDescriptor);
assert element != null : "No PSI element for descriptor: " + declarationDescriptor; assert element != null : "No PSI element for descriptor: " + declarationDescriptor;
context.trace.record(LABEL_TARGET, targetLabel, element); 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) { if (declarationDescriptor instanceof ClassDescriptor) {
ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor; ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor;
@@ -202,7 +213,7 @@ public class LabelResolver {
return LabeledReceiverResolutionResult.labelResolutionSuccess(thisReceiver); return LabeledReceiverResolutionResult.labelResolutionSuccess(thisReceiver);
} }
else if (size == 0) { else if (size == 0) {
JetElement element = resolveNamedLabel(labelName, targetLabel, context); JetElement element = resolveNamedLabel(labelName, targetLabel, context.trace);
if (element instanceof JetFunctionLiteral) { if (element instanceof JetFunctionLiteral) {
DeclarationDescriptor declarationDescriptor = DeclarationDescriptor declarationDescriptor =
context.trace.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, element); context.trace.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, element);
@@ -210,7 +221,7 @@ public class LabelResolver {
ReceiverParameterDescriptor thisReceiver = ((FunctionDescriptor) declarationDescriptor).getReceiverParameter(); ReceiverParameterDescriptor thisReceiver = ((FunctionDescriptor) declarationDescriptor).getReceiverParameter();
if (thisReceiver != null) { if (thisReceiver != null) {
context.trace.record(LABEL_TARGET, targetLabel, element); 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); return LabeledReceiverResolutionResult.labelResolutionSuccess(thisReceiver);
} }