Name class

In the most places in frontend identifier is stored in Name class, was in String.
Name has two advantages over String:
* validation: you cannot accidentally create identifier with dot, for example
* readability: if you see String, you don't now whether it is
  identifier, fq name, jvm class name or something else

Name's disadvantage is (small) performance overhead. We have no value types in JVM.
This commit is contained in:
Stepan Koltsov
2012-05-23 02:52:32 +04:00
parent c15ff2dee0
commit 33a59ff5fe
152 changed files with 962 additions and 726 deletions
@@ -43,11 +43,11 @@ public class JetPluginUtil {
LinkedList<String> fullName = Lists.newLinkedList();
while (declarationDescriptor != null && !(declarationDescriptor instanceof ModuleDescriptor)) {
fullName.addFirst(declarationDescriptor.getName());
fullName.addFirst(declarationDescriptor.getName().getName());
declarationDescriptor = declarationDescriptor.getContainingDeclaration();
}
assert fullName.size() > 0;
if (JavaDescriptorResolver.JAVA_ROOT.equals(fullName.getFirst())) {
if (JavaDescriptorResolver.JAVA_ROOT.getName().equals(fullName.getFirst())) {
fullName.removeFirst();
}
return fullName;
@@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.kt.JetValueParameterAnnotation;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.util.QualifiedNamesUtil;
import java.util.ArrayList;
@@ -135,9 +136,9 @@ class JetFromJavaDescriptorHelper {
FqName classFQN = new FqName(containingClass.getQualifiedName());
if (classFQN != null) {
if (QualifiedNamesUtil.fqnToShortName(classFQN).equals(JvmAbi.PACKAGE_CLASS)) {
if (QualifiedNamesUtil.fqnToShortName(classFQN).getName().equals(JvmAbi.PACKAGE_CLASS)) {
FqName classParentFQN = QualifiedNamesUtil.withoutLastSegment(classFQN);
return QualifiedNamesUtil.combine(classParentFQN, method.getName());
return QualifiedNamesUtil.combine(classParentFQN, Name.identifier(method.getName()));
}
}
}
@@ -93,7 +93,7 @@ public class JetShortNamesCache extends PsiShortNamesCache {
List<PsiClass> result = new ArrayList<PsiClass>();
for (String fqName : JetFullClassNameIndex.getInstance().getAllKeys(project)) {
if (QualifiedNamesUtil.fqnToShortName(new FqName(fqName)).equals(name)) {
if (QualifiedNamesUtil.fqnToShortName(new FqName(fqName)).getName().equals(name)) {
PsiClass psiClass = javaElementFinder.findClass(fqName, scope);
if (psiClass != null) {
result.add(psiClass);
@@ -83,7 +83,7 @@ public class ReferenceToClassesShortening {
// do not replace "Unit" with "Tuple0"
return;
}
String name = targetClass.getName();
String name = targetClass.getName().getName();
DeclarationDescriptor parent = targetClass.getContainingDeclaration();
while (parent instanceof ClassDescriptor) {
name = parent.getName() + "." + name;
@@ -53,7 +53,7 @@ public final class DescriptorLookupConverter {
@NotNull DeclarationDescriptor descriptor, @Nullable PsiElement declaration) {
LookupElementBuilder element = LookupElementBuilder.create(
new JetLookupObject(descriptor, bindingContext, declaration), descriptor.getName());
new JetLookupObject(descriptor, bindingContext, declaration), descriptor.getName().getName());
String typeText = "";
String tailText = "";
boolean tailTextGrayed = false;
@@ -354,7 +354,7 @@ public class JetCompletionContributor extends CompletionContributor {
return false;
}
return result.getPrefixMatcher().prefixMatches(descriptor.getName()) && isVisibleDescriptor(descriptor, session);
return result.getPrefixMatcher().prefixMatches(descriptor.getName().getName()) && isVisibleDescriptor(descriptor, session);
}
});
@@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper;
import org.jetbrains.jet.util.QualifiedNamesUtil;
@@ -204,11 +205,11 @@ public class JetImportOptimizer implements ImportOptimizer {
}
FqName classFQN = new FqName(classFQNStr);
if (classFQN.shortName().equals(JvmAbi.PACKAGE_CLASS)) {
return QualifiedNamesUtil.combine(classFQN.parent(), method.getName());
if (classFQN.shortName().getName().equals(JvmAbi.PACKAGE_CLASS)) {
return QualifiedNamesUtil.combine(classFQN.parent(), Name.identifier(method.getName()));
}
else {
return QualifiedNamesUtil.combine(classFQN, method.getName());
return QualifiedNamesUtil.combine(classFQN, Name.identifier(method.getName()));
}
}
}
@@ -39,6 +39,7 @@ 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.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
@@ -152,6 +153,8 @@ public class JetSourceNavigationHelper {
return null;
}
Name entityNameAsName = Name.identifier(entityName);
PsiElement declarationContainer = decompiledDeclaration.getParent();
if (declarationContainer instanceof JetFile) {
Tuple2<BindingContext, NamespaceDescriptor> bindingContextAndNamespaceDescriptor =
@@ -161,7 +164,7 @@ public class JetSourceNavigationHelper {
NamespaceDescriptor namespaceDescriptor = bindingContextAndNamespaceDescriptor._2;
if (receiverType == null) {
// non-extension property
for (Descr candidate : matcher.getCandidatesFromScope(namespaceDescriptor.getMemberScope(), entityName)) {
for (Descr candidate : matcher.getCandidatesFromScope(namespaceDescriptor.getMemberScope(), entityNameAsName)) {
if (candidate.getReceiverParameter() == ReceiverDescriptor.NO_RECEIVER) {
if (matcher.areSame(decompiledDeclaration, candidate)) {
return (JetDeclaration) BindingContextUtils.descriptorToDeclaration(bindingContext, candidate);
@@ -172,7 +175,7 @@ public class JetSourceNavigationHelper {
else {
// extension property
String expectedTypeString = receiverType.getText();
for (Descr candidate : matcher.getCandidatesFromScope(namespaceDescriptor.getMemberScope(), entityName)) {
for (Descr candidate : matcher.getCandidatesFromScope(namespaceDescriptor.getMemberScope(), entityNameAsName)) {
if (candidate.getReceiverParameter() != ReceiverDescriptor.NO_RECEIVER) {
String thisReceiverType = DescriptorRenderer.TEXT.renderType(candidate.getReceiverParameter().getType());
if (expectedTypeString.equals(thisReceiverType)) {
@@ -206,7 +209,7 @@ public class JetSourceNavigationHelper {
}
ClassDescriptor expectedContainer = isClassObject ? classDescriptor.getClassObjectDescriptor() : classDescriptor;
for (Descr candidate : matcher.getCandidatesFromScope(memberScope, entityName)) {
for (Descr candidate : matcher.getCandidatesFromScope(memberScope, entityNameAsName)) {
if (candidate.getContainingDeclaration() == expectedContainer) {
JetDeclaration property = (JetDeclaration) BindingContextUtils.descriptorToDeclaration(bindingContext, candidate);
if (property != null) {
@@ -229,7 +232,7 @@ public class JetSourceNavigationHelper {
}
@Override
public Set<VariableDescriptor> getCandidatesFromScope(JetScope scope, String name) {
public Set<VariableDescriptor> getCandidatesFromScope(JetScope scope, Name name) {
return scope.getProperties(name);
}
});
@@ -271,7 +274,7 @@ public class JetSourceNavigationHelper {
}
@Override
public Set<FunctionDescriptor> getCandidatesFromScope(JetScope scope, String name) {
public Set<FunctionDescriptor> getCandidatesFromScope(JetScope scope, Name name) {
return scope.getFunctions(name);
}
});
@@ -280,6 +283,6 @@ public class JetSourceNavigationHelper {
private interface Matcher<Decl extends JetDeclaration, Descr extends CallableDescriptor> {
boolean areSame(Decl declaration, Descr descriptor);
Set<Descr> getCandidatesFromScope(JetScope scope, String name);
Set<Descr> getCandidatesFromScope(JetScope scope, Name name);
}
}
@@ -32,6 +32,7 @@ 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.JetVisibilityChecker;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
@@ -276,7 +277,7 @@ public class JetFunctionParameterInfoHandler implements
JetSimpleNameExpression referenceExpression = argument.getArgumentName().getReferenceExpression();
ValueParameterDescriptor param = valueParameters.get(j);
if (referenceExpression != null && !usedIndexes[j] &&
param.getName().equals(referenceExpression.getReferencedName())) {
param.getName().equals(referenceExpression.getReferencedNameAsName())) {
takeAnyArgument = false;
usedIndexes[j] = true;
builder.append(renderParameter(param, true, bindingContext));
@@ -355,7 +356,7 @@ public class JetFunctionParameterInfoHandler implements
placeDescriptor = scope.getContainingDeclaration();
}
Collection<DeclarationDescriptor> variants = TipsManager.getReferenceVariants(refExpression, bindingContext);
String refName = refExpression.getReferencedName();
Name refName = refExpression.getReferencedNameAsName();
PsiReference[] references = refExpression.getReferences();
if (references.length == 0) return null;
ArrayList<DeclarationDescriptor> itemsToShow = new ArrayList<DeclarationDescriptor>();
@@ -156,7 +156,7 @@ public class ImportInsertHelper {
}
public static boolean doNeedImport(@NotNull ImportPath importPath, @Nullable String aliasName, @NotNull JetFile file) {
if (QualifiedNamesUtil.getFirstSegment(importPath.fqnPart().getFqName()).equals(JavaDescriptorResolver.JAVA_ROOT)) {
if (QualifiedNamesUtil.getFirstSegment(importPath.fqnPart().getFqName()).equals(JavaDescriptorResolver.JAVA_ROOT.getName())) {
FqName withoutJavaRoot = QualifiedNamesUtil.withoutFirstSegment(importPath.fqnPart());
importPath = new ImportPath(withoutJavaRoot, importPath.isAllUnder());
}
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeUtils;
@@ -145,8 +146,8 @@ public class JetNameSuggester {
else {
ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(argument);
if (classDescriptor != null) {
String className = classDescriptor.getName();
addName(result, "arrayOf" + StringUtil.capitalize(className) + "s", validator);
Name className = classDescriptor.getName();
addName(result, "arrayOf" + StringUtil.capitalize(className.getName()) + "s", validator);
}
}
}
@@ -165,8 +166,8 @@ public class JetNameSuggester {
private static void addForClassType(ArrayList<String> result, JetType jetType, JetNameValidator validator) {
ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(jetType);
if (classDescriptor != null) {
String className = classDescriptor.getName();
addCamelNames(result, className, validator);
Name className = classDescriptor.getName();
addCamelNames(result, className.getName(), validator);
}
}
@@ -108,7 +108,7 @@ public class JetNameValidatorImpl implements JetNameValidator {
Collection<DeclarationDescriptor> variants =
TipsManager.getVariantsNoReceiver(expression, myBindingContext);
for (DeclarationDescriptor variant : variants) {
if (variant.getName().equals(name) && variant instanceof VariableDescriptor) {
if (variant.getName().getName().equals(name) && variant instanceof VariableDescriptor) {
result.set(false);
return;
}
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
@@ -138,7 +139,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent {
String renderedOriginal = DescriptorRenderer.TEXT.render(originalDescriptor);
for (DeclarationDescriptor member : memberScope.getAllDescriptors()) {
if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member).replace(TUPLE0_FQ_NAME.getFqName(),
JetStandardClasses.UNIT_ALIAS))) {
JetStandardClasses.UNIT_ALIAS.getName()))) {
return member;
}
}
@@ -171,7 +172,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent {
private WritableScope memberScope;
private FakeJetNamespaceDescriptor() {
super(new NamespaceDescriptorImpl(new ModuleDescriptor("<fake_module>"), Collections.<AnnotationDescriptor>emptyList(), "<root>"),
super(new NamespaceDescriptorImpl(new ModuleDescriptor(Name.special("<fake_module>")), Collections.<AnnotationDescriptor>emptyList(), Name.special("<root>")),
Collections.<AnnotationDescriptor>emptyList(),
JetStandardClasses.STANDARD_CLASSES_NAMESPACE.getName());
}
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.JetMainDetector;
/**
@@ -73,7 +74,7 @@ public class JetRunConfigurationProducer extends RuntimeConfigurationProducer im
if (JetMainDetector.hasMain(jetFile.getDeclarations())) {
mySourceElement = jetFile;
FqName fqName = JetPsiUtil.getFQName(jetFile);
return fqName.child(JvmAbi.PACKAGE_CLASS);
return fqName.child(Name.identifier(JvmAbi.PACKAGE_CLASS));
}
}
@@ -215,11 +215,11 @@ public class JetStructureViewElement implements StructureViewTreeElement {
else if (descriptor instanceof VariableDescriptor) {
JetType outType = ((VariableDescriptor) descriptor).getType();
textBuilder = new StringBuilder(descriptor.getName());
textBuilder = new StringBuilder(descriptor.getName().getName());
textBuilder.append(":").append(DescriptorRenderer.TEXT.renderType(outType));
}
else if (descriptor instanceof ClassDescriptor) {
textBuilder = new StringBuilder(descriptor.getName());
textBuilder = new StringBuilder(descriptor.getName().getName());
textBuilder
.append(" (")
.append(DescriptorUtils.getFQName(descriptor.getContainingDeclaration()))
@@ -204,7 +204,7 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase {
else {
CallableMemberDescriptor candidateToOverride = null;
for (CallableMemberDescriptor callable : descriptors) {
if (callable.getName().equals(memberToOverride)) {
if (callable.getName().getName().equals(memberToOverride)) {
if (candidateToOverride != null) {
throw new IllegalStateException("more then one descriptor with name " + memberToOverride);
}
@@ -71,7 +71,7 @@ public class StandardLibraryReferenceResolverTest extends ResolveTestCase {
public void testAllReferencesResolved() {
StandardLibraryReferenceResolver referenceResolver = getProject().getComponent(StandardLibraryReferenceResolver.class);
for (DeclarationDescriptor descriptor : getAllStandardDescriptors(JetStandardClasses.STANDARD_CLASSES_NAMESPACE)) {
if (descriptor instanceof NamespaceDescriptor && "jet".equals(descriptor.getName())) continue;
if (descriptor instanceof NamespaceDescriptor && "jet".equals(descriptor.getName().getName())) continue;
assertNotNull("Can't resolve " + descriptor, referenceResolver.resolveStandardLibrarySymbol(descriptor));
}
}