LabelResolver refactoring: rename public methods
resolveLabel -> resolveControlLabel resolveThisLabel -> resolveThisOrSuperLabel + small improvements
This commit is contained in:
+1
-2
@@ -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);
|
||||
|
||||
+5
-4
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<DeclarationDescriptor> 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<JetElement> 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<DeclarationDescriptor> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user