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:
@@ -19,9 +19,11 @@ package org.jetbrains.jet;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@@ -43,7 +45,7 @@ public class FqNameTest {
|
||||
Assert.assertEquals(2, path.size());
|
||||
Assert.assertEquals("", path.get(0).getFqName());
|
||||
Assert.assertEquals("com", path.get(1).getFqName());
|
||||
Assert.assertEquals("com", path.get(1).shortName());
|
||||
Assert.assertEquals("com", path.get(1).shortName().getName());
|
||||
Assert.assertEquals("", path.get(1).parent().getFqName());
|
||||
}
|
||||
|
||||
@@ -53,10 +55,10 @@ public class FqNameTest {
|
||||
Assert.assertEquals(3, path.size());
|
||||
Assert.assertEquals("", path.get(0).getFqName());
|
||||
Assert.assertEquals("com", path.get(1).getFqName());
|
||||
Assert.assertEquals("com", path.get(1).shortName());
|
||||
Assert.assertEquals("com", path.get(1).shortName().getName());
|
||||
Assert.assertEquals("", path.get(1).parent().getFqName());
|
||||
Assert.assertEquals("com.jetbrains", path.get(2).getFqName());
|
||||
Assert.assertEquals("jetbrains", path.get(2).shortName());
|
||||
Assert.assertEquals("jetbrains", path.get(2).shortName().getName());
|
||||
Assert.assertEquals("com", path.get(2).parent().getFqName());
|
||||
}
|
||||
|
||||
@@ -66,13 +68,13 @@ public class FqNameTest {
|
||||
Assert.assertEquals(4, path.size());
|
||||
Assert.assertEquals("", path.get(0).getFqName());
|
||||
Assert.assertEquals("com", path.get(1).getFqName());
|
||||
Assert.assertEquals("com", path.get(1).shortName());
|
||||
Assert.assertEquals("com", path.get(1).shortName().getName());
|
||||
Assert.assertEquals("", path.get(1).parent().getFqName());
|
||||
Assert.assertEquals("com.jetbrains", path.get(2).getFqName());
|
||||
Assert.assertEquals("jetbrains", path.get(2).shortName());
|
||||
Assert.assertEquals("jetbrains", path.get(2).shortName().getName());
|
||||
Assert.assertEquals("com", path.get(2).parent().getFqName());
|
||||
Assert.assertEquals("com.jetbrains.jet", path.get(3).getFqName());
|
||||
Assert.assertEquals("jet", path.get(3).shortName());
|
||||
Assert.assertEquals("jet", path.get(3).shortName().getName());
|
||||
Assert.assertEquals("com.jetbrains", path.get(3).parent().getFqName());
|
||||
}
|
||||
|
||||
@@ -81,8 +83,12 @@ public class FqNameTest {
|
||||
Assert.assertEquals(Lists.newArrayList(), new FqName("").pathSegments());
|
||||
|
||||
for (String name : new String[] { "com", "com.jetbrains", "com.jetbrains.jet" }) {
|
||||
List<String> segments = new FqName(name).pathSegments();
|
||||
Assert.assertEquals(Arrays.asList(name.split("\\.")), segments);
|
||||
List<Name> segments = new FqName(name).pathSegments();
|
||||
List<String> segmentsStrings = new ArrayList<String>();
|
||||
for (Name segment : segments) {
|
||||
segmentsStrings.add(segment.getName());
|
||||
}
|
||||
Assert.assertEquals(Arrays.asList(name.split("\\.")), segmentsStrings);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
|
||||
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.junit.Assert;
|
||||
|
||||
import java.io.File;
|
||||
@@ -48,7 +49,7 @@ public class JavaDescriptorResolverTest extends TestCaseWithTmpdir {
|
||||
public void testStaticFinal() throws Exception {
|
||||
JavaDescriptorResolver javaDescriptorResolver = compileFileGetJavaDescriptorResolver("staticFinal.java");
|
||||
NamespaceDescriptor ns = javaDescriptorResolver.resolveNamespace(new FqName("StaticFinal"), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
|
||||
Set<VariableDescriptor> foos = ns.getMemberScope().getProperties("foo");
|
||||
Set<VariableDescriptor> foos = ns.getMemberScope().getProperties(Name.identifier("foo"));
|
||||
Assert.assertEquals(1, foos.size());
|
||||
VariableDescriptor foo = foos.iterator().next();
|
||||
Assert.assertFalse(foo.getType().isNullable());
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.jetbrains.jet.codegen.PropertyCodegen;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
@@ -85,9 +86,9 @@ class NamespaceComparator {
|
||||
|
||||
Assert.assertTrue(!nsa.getMemberScope().getAllDescriptors().isEmpty());
|
||||
|
||||
Set<String> classifierNames = new HashSet<String>();
|
||||
Set<String> propertyNames = new HashSet<String>();
|
||||
Set<String> functionNames = new HashSet<String>();
|
||||
Set<Name> classifierNames = new HashSet<Name>();
|
||||
Set<Name> propertyNames = new HashSet<Name>();
|
||||
Set<Name> functionNames = new HashSet<Name>();
|
||||
|
||||
for (DeclarationDescriptor ad : nsa.getMemberScope().getAllDescriptors()) {
|
||||
if (ad instanceof ClassifierDescriptor) {
|
||||
@@ -104,7 +105,7 @@ class NamespaceComparator {
|
||||
}
|
||||
}
|
||||
|
||||
for (String name : sorted(classifierNames)) {
|
||||
for (Name name : sorted(classifierNames)) {
|
||||
ClassifierDescriptor ca = nsa.getMemberScope().getClassifier(name);
|
||||
ClassifierDescriptor cb = nsb.getMemberScope().getClassifier(name);
|
||||
Assert.assertTrue(ca != null);
|
||||
@@ -112,16 +113,16 @@ class NamespaceComparator {
|
||||
compareClassifiers(ca, cb, sb);
|
||||
}
|
||||
|
||||
for (String name : sorted(propertyNames)) {
|
||||
for (Name name : sorted(propertyNames)) {
|
||||
Set<VariableDescriptor> pa = nsa.getMemberScope().getProperties(name);
|
||||
Set<VariableDescriptor> pb = nsb.getMemberScope().getProperties(name);
|
||||
compareDeclarationSets(pa, pb, sb);
|
||||
|
||||
Assert.assertTrue(nsb.getMemberScope().getFunctions(PropertyCodegen.getterName(name)).isEmpty());
|
||||
Assert.assertTrue(nsb.getMemberScope().getFunctions(PropertyCodegen.setterName(name)).isEmpty());
|
||||
Assert.assertTrue(nsb.getMemberScope().getFunctions(Name.identifier(PropertyCodegen.getterName(name))).isEmpty());
|
||||
Assert.assertTrue(nsb.getMemberScope().getFunctions(Name.identifier(PropertyCodegen.setterName(name))).isEmpty());
|
||||
}
|
||||
|
||||
for (String name : sorted(functionNames)) {
|
||||
for (Name name : sorted(functionNames)) {
|
||||
Set<FunctionDescriptor> fa = nsa.getMemberScope().getFunctions(name);
|
||||
Set<FunctionDescriptor> fb = nsb.getMemberScope().getFunctions(name);
|
||||
compareDeclarationSets(fa, fb, sb);
|
||||
@@ -528,7 +529,7 @@ class NamespaceComparator {
|
||||
JetScope memberScope = klass.getMemberScope(typeArguments);
|
||||
for (DeclarationDescriptor member : memberScope.getAllDescriptors()) {
|
||||
if (!includeObject) {
|
||||
if (member.getName().matches("equals|hashCode|finalize|wait|notify(All)?|toString|clone|getClass")) {
|
||||
if (member.getName().getName().matches("equals|hashCode|finalize|wait|notify(All)?|toString|clone|getClass")) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
|
||||
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
|
||||
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.plugin.JetLanguage;
|
||||
import org.junit.Assert;
|
||||
|
||||
@@ -89,7 +90,7 @@ public class ReadJavaBinaryClassTest extends TestCaseWithTmpdir {
|
||||
psiFile, JetControlFlowDataTraceFactory.EMPTY,
|
||||
jetCoreEnvironment.getCompilerDependencies())
|
||||
.getBindingContext();
|
||||
return bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, FqName.topLevel("test"));
|
||||
return bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, FqName.topLevel(Name.identifier("test")));
|
||||
}
|
||||
|
||||
private NamespaceDescriptor compileJava() throws Exception {
|
||||
@@ -117,7 +118,7 @@ public class ReadJavaBinaryClassTest extends TestCaseWithTmpdir {
|
||||
InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices(
|
||||
jetCoreEnvironment.getCompilerDependencies(), jetCoreEnvironment.getProject());
|
||||
JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver();
|
||||
return javaDescriptorResolver.resolveNamespace(FqName.topLevel("test"), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
|
||||
return javaDescriptorResolver.resolveNamespace(FqName.topLevel(Name.identifier("test")), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
|
||||
@@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
|
||||
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.plugin.JetLanguage;
|
||||
|
||||
import java.io.File;
|
||||
@@ -78,7 +79,7 @@ public class ReadKotlinBinaryClassTest extends TestCaseWithTmpdir {
|
||||
|
||||
NamespaceDescriptor namespaceFromSource = state.getBindingContext().get(BindingContext.FILE_TO_NAMESPACE, psiFile);
|
||||
|
||||
Assert.assertEquals("test", namespaceFromSource.getName());
|
||||
Assert.assertEquals("test", namespaceFromSource.getName().getName());
|
||||
|
||||
Disposer.dispose(myTestRootDisposable);
|
||||
|
||||
@@ -91,7 +92,7 @@ public class ReadKotlinBinaryClassTest extends TestCaseWithTmpdir {
|
||||
InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices(
|
||||
jetCoreEnvironment.getCompilerDependencies(), jetCoreEnvironment.getProject());
|
||||
JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver();
|
||||
NamespaceDescriptor namespaceFromClass = javaDescriptorResolver.resolveNamespace(FqName.topLevel("test"), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
|
||||
NamespaceDescriptor namespaceFromClass = javaDescriptorResolver.resolveNamespace(FqName.topLevel(Name.identifier("test")), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
|
||||
|
||||
NamespaceComparator.compareNamespaces(namespaceFromSource, namespaceFromClass, false, txtFile);
|
||||
}
|
||||
|
||||
@@ -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.java.AnalyzerFacadeForJVM;
|
||||
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.TypeConstructor;
|
||||
@@ -250,7 +251,7 @@ public abstract class ExpectedResolveData {
|
||||
|
||||
JetType actualType = bindingContext.get(BindingContext.TYPE, typeReference);
|
||||
assertNotNull("Type " + name + " not resolved for reference " + name, actualType);
|
||||
ClassifierDescriptor expectedClass = lib.getLibraryScope().getClassifier(name.substring(STANDARD_PREFIX.length()));
|
||||
ClassifierDescriptor expectedClass = lib.getLibraryScope().getClassifier(Name.identifier(name.substring(STANDARD_PREFIX.length())));
|
||||
assertNotNull("Expected class not found: " + name);
|
||||
assertSame("Type resolution mismatch: ", expectedClass.getTypeConstructor(), actualType.getConstructor());
|
||||
continue;
|
||||
@@ -308,7 +309,7 @@ public abstract class ExpectedResolveData {
|
||||
TypeConstructor expectedTypeConstructor;
|
||||
if (typeName.startsWith(STANDARD_PREFIX)) {
|
||||
String name = typeName.substring(STANDARD_PREFIX.length());
|
||||
ClassifierDescriptor expectedClass = lib.getLibraryScope().getClassifier(name);
|
||||
ClassifierDescriptor expectedClass = lib.getLibraryScope().getClassifier(Name.identifier(name));
|
||||
|
||||
assertNotNull("Expected class not found: " + typeName, expectedClass);
|
||||
expectedTypeConstructor = expectedClass.getTypeConstructor();
|
||||
|
||||
@@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
||||
import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults;
|
||||
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
|
||||
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
import org.jetbrains.jet.lang.types.TypeProjection;
|
||||
@@ -142,7 +143,7 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
|
||||
|
||||
CallResolver callResolver = new InjectorForTests(getProject()).getCallResolver();
|
||||
OverloadResolutionResults<FunctionDescriptor> functions = callResolver.resolveExactSignature(
|
||||
classDescriptor.getMemberScope(typeArguments), ReceiverDescriptor.NO_RECEIVER, name, parameterTypeList);
|
||||
classDescriptor.getMemberScope(typeArguments), ReceiverDescriptor.NO_RECEIVER, Name.identifier(name), parameterTypeList);
|
||||
for (ResolvedCall<? extends FunctionDescriptor> resolvedCall : functions.getResultingCalls()) {
|
||||
List<ValueParameterDescriptor> unsubstitutedValueParameters = resolvedCall.getResultingDescriptor().getValueParameters();
|
||||
for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) {
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
|
||||
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;
|
||||
@@ -48,7 +49,7 @@ public class JetDefaultModalityModifiersTest extends JetLiteFixture {
|
||||
}
|
||||
|
||||
public class JetDefaultModalityModifiersTestCase {
|
||||
private ModuleDescriptor root = new ModuleDescriptor("test_root");
|
||||
private ModuleDescriptor root = new ModuleDescriptor(Name.special("<test_root>"));
|
||||
private DescriptorResolver descriptorResolver;
|
||||
private JetScope scope;
|
||||
|
||||
@@ -76,7 +77,7 @@ public class JetDefaultModalityModifiersTest extends JetLiteFixture {
|
||||
}
|
||||
|
||||
private MutableClassDescriptor createClassDescriptor(ClassKind kind, JetClass aClass) {
|
||||
MutableClassDescriptor classDescriptor = new MutableClassDescriptor(root, scope, kind, aClass.getName());
|
||||
MutableClassDescriptor classDescriptor = new MutableClassDescriptor(root, scope, kind, Name.identifier(aClass.getName()));
|
||||
descriptorResolver.resolveMutableClassDescriptor(aClass, classDescriptor, JetTestUtils.DUMMY_TRACE);
|
||||
return classDescriptor;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
||||
import org.jetbrains.jet.lang.psi.JetPsiFactory;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.OverloadUtil;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,7 @@ import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
*/
|
||||
public class JetOverloadTest extends JetLiteFixture {
|
||||
|
||||
private ModuleDescriptor root = new ModuleDescriptor("test_root");
|
||||
private ModuleDescriptor root = new ModuleDescriptor(Name.special("<test_root>"));
|
||||
private JetStandardLibrary library;
|
||||
private DescriptorResolver descriptorResolver;
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
||||
import org.jetbrains.jet.lang.psi.JetPsiFactory;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.OverridingUtil;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,7 @@ import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
*/
|
||||
public class JetOverridingTest extends JetLiteFixture {
|
||||
|
||||
private ModuleDescriptor root = new ModuleDescriptor("test_root");
|
||||
private ModuleDescriptor root = new ModuleDescriptor(Name.special("<test_root>"));
|
||||
private JetStandardLibrary library;
|
||||
private DescriptorResolver descriptorResolver;
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ import org.jetbrains.jet.lang.resolve.*;
|
||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
||||
import org.jetbrains.jet.lang.resolve.java.*;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.*;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||
@@ -653,15 +654,15 @@ public class JetTypeCheckerTest extends JetLiteFixture {
|
||||
|
||||
public JetScope BASIC_SCOPE = new JetScopeAdapter(library.getLibraryScope()) {
|
||||
@Override
|
||||
public ClassifierDescriptor getClassifier(@NotNull String name) {
|
||||
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
||||
if (CLASSES.isEmpty()) {
|
||||
for (String classDeclaration : CLASS_DECLARATIONS) {
|
||||
JetClass classElement = JetPsiFactory.createClass(getProject(), classDeclaration);
|
||||
ClassDescriptor classDescriptor = resolveClassDescriptor(this, classElement);
|
||||
CLASSES.put(classDescriptor.getName(), classDescriptor);
|
||||
CLASSES.put(classDescriptor.getName().getName(), classDescriptor);
|
||||
}
|
||||
}
|
||||
ClassDescriptor classDescriptor = CLASSES.get(name);
|
||||
ClassDescriptor classDescriptor = CLASSES.get(name.getName());
|
||||
if (classDescriptor != null) {
|
||||
return classDescriptor;
|
||||
}
|
||||
@@ -670,7 +671,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Set<FunctionDescriptor> getFunctions(@NotNull String name) {
|
||||
public Set<FunctionDescriptor> getFunctions(@NotNull Name name) {
|
||||
Set<FunctionDescriptor> writableFunctionGroup = Sets.newLinkedHashSet();
|
||||
for (String funDecl : FUNCTION_DECLARATIONS) {
|
||||
FunctionDescriptor functionDescriptor = descriptorResolver.resolveFunctionDescriptor(this.getContainingDeclaration(), this, JetPsiFactory.createFunction(getProject(), funDecl), JetTestUtils.DUMMY_TRACE);
|
||||
|
||||
Reference in New Issue
Block a user