LabelName stores label name
TODO: uncomment assertions in LabelName constructor
This commit is contained in:
+2
-1
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -56,7 +57,7 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
throw new UnsupportedOperationException(); // TODO
|
throw new UnsupportedOperationException(); // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
@@ -91,7 +92,7 @@ public abstract class AbstractScopeAdapter implements JetScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
return getWorkerScope().getDeclarationsByLabel(labelName);
|
return getWorkerScope().getDeclarationsByLabel(labelName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.lang.resolve.name;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stepan Koltsov
|
||||||
|
*/
|
||||||
|
public class LabelName {
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public LabelName(@NotNull String name) {
|
||||||
|
if (name.startsWith("@")) {
|
||||||
|
// label may contain @, and may not contain
|
||||||
|
//throw new IllegalArgumentException("@ must be chopped: " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.length() == 0) {
|
||||||
|
// label can be empty
|
||||||
|
//throw new IllegalStateException("label cannot be empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
LabelName name1 = (LabelName) o;
|
||||||
|
|
||||||
|
if (!name.equals(name1.name)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return name.hashCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.scopes;
|
|||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -134,7 +135,7 @@ public class ChainedScope implements JetScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
for (JetScope jetScope : scopeChain) {
|
for (JetScope jetScope : scopeChain) {
|
||||||
Collection<DeclarationDescriptor> declarationsByLabel = jetScope.getDeclarationsByLabel(labelName);
|
Collection<DeclarationDescriptor> declarationsByLabel = jetScope.getDeclarationsByLabel(labelName);
|
||||||
if (!declarationsByLabel.isEmpty()) return declarationsByLabel; // TODO : merge?
|
if (!declarationsByLabel.isEmpty()) return declarationsByLabel; // TODO : merge?
|
||||||
|
|||||||
+2
-1
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.ClassKind;
|
import org.jetbrains.jet.lang.descriptors.ClassKind;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -58,7 +59,7 @@ public class InnerClassesScopeWrapper extends JetScopeImpl {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
Collection<DeclarationDescriptor> declarationsByLabel = actualScope.getDeclarationsByLabel(labelName);
|
Collection<DeclarationDescriptor> declarationsByLabel = actualScope.getDeclarationsByLabel(labelName);
|
||||||
return Collections2.filter(declarationsByLabel, new Predicate<DeclarationDescriptor>() {
|
return Collections2.filter(declarationsByLabel, new Predicate<DeclarationDescriptor>() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.scopes;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -67,7 +68,7 @@ public interface JetScope {
|
|||||||
DeclarationDescriptor getContainingDeclaration();
|
DeclarationDescriptor getContainingDeclaration();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName);
|
Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param fieldName includes the "$"
|
* @param fieldName includes the "$"
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.scopes;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -75,7 +76,7 @@ public abstract class JetScopeImpl implements JetScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.google.common.collect.Sets;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
||||||
|
|
||||||
@@ -136,7 +137,7 @@ public class SubstitutingScope implements JetScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
throw new UnsupportedOperationException(); // TODO
|
throw new UnsupportedOperationException(); // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
import org.jetbrains.jet.util.CommonSuppliers;
|
import org.jetbrains.jet.util.CommonSuppliers;
|
||||||
@@ -56,7 +57,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
private Map<String, NamespaceDescriptor> namespaceAliases;
|
private Map<String, NamespaceDescriptor> namespaceAliases;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Map<String, List<DeclarationDescriptor>> labelsToDescriptors;
|
private Map<LabelName, List<DeclarationDescriptor>> labelsToDescriptors;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Map<String, ClassDescriptor> objectDescriptors;
|
private Map<String, ClassDescriptor> objectDescriptors;
|
||||||
@@ -137,9 +138,9 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Map<String, List<DeclarationDescriptor>> getLabelsToDescriptors() {
|
private Map<LabelName, List<DeclarationDescriptor>> getLabelsToDescriptors() {
|
||||||
if (labelsToDescriptors == null) {
|
if (labelsToDescriptors == null) {
|
||||||
labelsToDescriptors = new HashMap<String, List<DeclarationDescriptor>>();
|
labelsToDescriptors = new HashMap<LabelName, List<DeclarationDescriptor>>();
|
||||||
}
|
}
|
||||||
return labelsToDescriptors;
|
return labelsToDescriptors;
|
||||||
}
|
}
|
||||||
@@ -154,11 +155,11 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(@NotNull String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(@NotNull LabelName labelName) {
|
||||||
checkMayRead();
|
checkMayRead();
|
||||||
|
|
||||||
Collection<DeclarationDescriptor> superResult = super.getDeclarationsByLabel(labelName);
|
Collection<DeclarationDescriptor> superResult = super.getDeclarationsByLabel(labelName);
|
||||||
Map<String, List<DeclarationDescriptor>> labelsToDescriptors = getLabelsToDescriptors();
|
Map<LabelName, List<DeclarationDescriptor>> labelsToDescriptors = getLabelsToDescriptors();
|
||||||
List<DeclarationDescriptor> declarationDescriptors = labelsToDescriptors.get(labelName);
|
List<DeclarationDescriptor> declarationDescriptors = labelsToDescriptors.get(labelName);
|
||||||
if (declarationDescriptors == null) {
|
if (declarationDescriptors == null) {
|
||||||
return superResult;
|
return superResult;
|
||||||
@@ -173,9 +174,8 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
public void addLabeledDeclaration(@NotNull DeclarationDescriptor descriptor) {
|
public void addLabeledDeclaration(@NotNull DeclarationDescriptor descriptor) {
|
||||||
checkMayWrite();
|
checkMayWrite();
|
||||||
|
|
||||||
Map<String, List<DeclarationDescriptor>> labelsToDescriptors = getLabelsToDescriptors();
|
Map<LabelName, List<DeclarationDescriptor>> labelsToDescriptors = getLabelsToDescriptors();
|
||||||
String name = descriptor.getName();
|
LabelName name = new LabelName(descriptor.getName());
|
||||||
assert name != null;
|
|
||||||
List<DeclarationDescriptor> declarationDescriptors = labelsToDescriptors.get(name);
|
List<DeclarationDescriptor> declarationDescriptors = labelsToDescriptors.get(name);
|
||||||
if (declarationDescriptors == null) {
|
if (declarationDescriptors == null) {
|
||||||
declarationDescriptors = new ArrayList<DeclarationDescriptor>();
|
declarationDescriptors = new ArrayList<DeclarationDescriptor>();
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.google.common.collect.Sets;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -49,7 +50,7 @@ public class WriteThroughScope extends WritableScopeWithImports {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
checkMayRead();
|
checkMayRead();
|
||||||
|
|
||||||
return writableWorker.getDeclarationsByLabel(labelName);
|
return writableWorker.getDeclarationsByLabel(labelName);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.error.ErrorSimpleFunctionDescriptorImpl;
|
import org.jetbrains.jet.lang.types.error.ErrorSimpleFunctionDescriptorImpl;
|
||||||
@@ -99,7 +100,7 @@ public class ErrorUtils {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
|||||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory;
|
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory;
|
||||||
import org.jetbrains.jet.lang.resolve.constants.*;
|
import org.jetbrains.jet.lang.resolve.constants.*;
|
||||||
import org.jetbrains.jet.lang.resolve.constants.StringValue;
|
import org.jetbrains.jet.lang.resolve.constants.StringValue;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
||||||
@@ -486,7 +487,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
ReceiverDescriptor thisReceiver = null;
|
ReceiverDescriptor thisReceiver = null;
|
||||||
String labelName = expression.getLabelName();
|
String labelName = expression.getLabelName();
|
||||||
if (labelName != null) {
|
if (labelName != null) {
|
||||||
thisReceiver = context.labelResolver.resolveThisLabel(expression.getInstanceReference(), expression.getTargetLabel(), context, thisReceiver, labelName);
|
thisReceiver = context.labelResolver.resolveThisLabel(
|
||||||
|
expression.getInstanceReference(), expression.getTargetLabel(), context, thisReceiver, new LabelName(labelName));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (onlyClassReceivers) {
|
if (onlyClassReceivers) {
|
||||||
@@ -682,7 +684,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
if (JetTokens.LABELS.contains(operationSign.getReferencedNameElementType())) {
|
if (JetTokens.LABELS.contains(operationSign.getReferencedNameElementType())) {
|
||||||
String referencedName = operationSign.getReferencedName();
|
String referencedName = operationSign.getReferencedName();
|
||||||
referencedName = referencedName == null ? " <?>" : referencedName;
|
referencedName = referencedName == null ? " <?>" : referencedName;
|
||||||
context.labelResolver.enterLabeledElement(referencedName.substring(1), baseExpression);
|
context.labelResolver.enterLabeledElement(new LabelName(referencedName.substring(1)), baseExpression);
|
||||||
// TODO : Some processing for the label?
|
// TODO : Some processing for the label?
|
||||||
JetType type = facade.getType(baseExpression, context, isStatement);
|
JetType type = facade.getType(baseExpression, context, isStatement);
|
||||||
context.labelResolver.exitLabeledElement(baseExpression);
|
context.labelResolver.exitLabeledElement(baseExpression);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
|||||||
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.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -37,11 +38,11 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.*;
|
|||||||
*/
|
*/
|
||||||
public class LabelResolver {
|
public class LabelResolver {
|
||||||
|
|
||||||
private final Map<String, Stack<JetElement>> labeledElements = new HashMap<String, Stack<JetElement>>();
|
private final Map<LabelName, Stack<JetElement>> labeledElements = new HashMap<LabelName, Stack<JetElement>>();
|
||||||
|
|
||||||
public LabelResolver() {}
|
public LabelResolver() {}
|
||||||
|
|
||||||
public void enterLabeledElement(@NotNull String labelName, @NotNull JetExpression labeledExpression) {
|
public void enterLabeledElement(@NotNull LabelName labelName, @NotNull JetExpression labeledExpression) {
|
||||||
JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression);
|
JetExpression deparenthesized = JetPsiUtil.deparenthesize(labeledExpression);
|
||||||
if (deparenthesized != null) {
|
if (deparenthesized != null) {
|
||||||
Stack<JetElement> stack = labeledElements.get(labelName);
|
Stack<JetElement> stack = labeledElements.get(labelName);
|
||||||
@@ -56,8 +57,8 @@ public class LabelResolver {
|
|||||||
public void exitLabeledElement(@NotNull JetExpression expression) {
|
public void exitLabeledElement(@NotNull JetExpression expression) {
|
||||||
JetExpression deparenthesized = JetPsiUtil.deparenthesize(expression);
|
JetExpression deparenthesized = JetPsiUtil.deparenthesize(expression);
|
||||||
// TODO : really suboptimal
|
// TODO : really suboptimal
|
||||||
for (Iterator<Map.Entry<String, Stack<JetElement>>> mapIter = labeledElements.entrySet().iterator(); mapIter.hasNext(); ) {
|
for (Iterator<Map.Entry<LabelName,Stack<JetElement>>> mapIter = labeledElements.entrySet().iterator(); mapIter.hasNext(); ) {
|
||||||
Map.Entry<String, Stack<JetElement>> entry = mapIter.next();
|
Map.Entry<LabelName, Stack<JetElement>> entry = mapIter.next();
|
||||||
Stack<JetElement> stack = entry.getValue();
|
Stack<JetElement> stack = entry.getValue();
|
||||||
for (Iterator<JetElement> stackIter = stack.iterator(); stackIter.hasNext(); ) {
|
for (Iterator<JetElement> stackIter = stack.iterator(); stackIter.hasNext(); ) {
|
||||||
JetElement recorded = stackIter.next();
|
JetElement recorded = stackIter.next();
|
||||||
@@ -72,7 +73,7 @@ public class LabelResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private JetElement resolveControlLabel(@NotNull String labelName, @NotNull JetSimpleNameExpression labelExpression, boolean reportUnresolved, ExpressionTypingContext context) {
|
private JetElement resolveControlLabel(@NotNull LabelName labelName, @NotNull JetSimpleNameExpression labelExpression, boolean reportUnresolved, ExpressionTypingContext context) {
|
||||||
Collection<DeclarationDescriptor> declarationsByLabel = context.scope.getDeclarationsByLabel(labelName);
|
Collection<DeclarationDescriptor> declarationsByLabel = context.scope.getDeclarationsByLabel(labelName);
|
||||||
int size = declarationsByLabel.size();
|
int size = declarationsByLabel.size();
|
||||||
|
|
||||||
@@ -99,14 +100,13 @@ public class LabelResolver {
|
|||||||
public JetElement resolveLabel(JetLabelQualifiedExpression expression, ExpressionTypingContext context) {
|
public JetElement resolveLabel(JetLabelQualifiedExpression expression, ExpressionTypingContext context) {
|
||||||
JetSimpleNameExpression labelElement = expression.getTargetLabel();
|
JetSimpleNameExpression labelElement = expression.getTargetLabel();
|
||||||
if (labelElement != null) {
|
if (labelElement != null) {
|
||||||
String labelName = expression.getLabelName();
|
LabelName labelName = new LabelName(expression.getLabelName());
|
||||||
assert labelName != null;
|
|
||||||
return resolveControlLabel(labelName, labelElement, true, context);
|
return resolveControlLabel(labelName, labelElement, true, context);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JetElement resolveNamedLabel(@NotNull String labelName, @NotNull JetSimpleNameExpression labelExpression, boolean reportUnresolved, ExpressionTypingContext context) {
|
private JetElement resolveNamedLabel(@NotNull LabelName labelName, @NotNull JetSimpleNameExpression labelExpression, boolean reportUnresolved, ExpressionTypingContext context) {
|
||||||
Stack<JetElement> stack = labeledElements.get(labelName);
|
Stack<JetElement> stack = labeledElements.get(labelName);
|
||||||
if (stack == null || stack.isEmpty()) {
|
if (stack == null || stack.isEmpty()) {
|
||||||
if (reportUnresolved) {
|
if (reportUnresolved) {
|
||||||
@@ -123,7 +123,8 @@ public class LabelResolver {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReceiverDescriptor resolveThisLabel(JetReferenceExpression thisReference, JetSimpleNameExpression targetLabel, ExpressionTypingContext context, ReceiverDescriptor thisReceiver, String labelName) {
|
public ReceiverDescriptor resolveThisLabel(JetReferenceExpression thisReference, JetSimpleNameExpression targetLabel,
|
||||||
|
ExpressionTypingContext context, ReceiverDescriptor thisReceiver, LabelName 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;
|
assert targetLabel != null;
|
||||||
|
|||||||
Reference in New Issue
Block a user