Only normalize names when accessing PSI, not earlier

#KT-4833 Fixed
This commit is contained in:
Andrey Breslav
2014-06-10 11:34:54 +04:00
parent ef7b43ecdc
commit bb581bb645
14 changed files with 130 additions and 51 deletions
@@ -48,16 +48,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
public class ResolveSession implements KotlinCodeAnalyzer {
private static final Function<FqName, Name> NO_ALIASES = new Function<FqName, Name>() {
@Override
public Name fun(FqName name) {
return null;
}
};
private final LazyResolveStorageManager storageManager;
private final ExceptionTracker exceptionTracker;
@@ -66,8 +57,6 @@ public class ResolveSession implements KotlinCodeAnalyzer {
private final BindingTrace trace;
private final DeclarationProviderFactory declarationProviderFactory;
private final Function<FqName, Name> classifierAliases;
private final MemoizedFunctionToNullable<FqName, LazyPackageDescriptor> packages;
private final PackageFragmentProvider packageFragmentProvider;
@@ -132,8 +121,6 @@ public class ResolveSession implements KotlinCodeAnalyzer {
this.trace = lockBasedLazyResolveStorageManager.createSafeTrace(delegationTrace);
this.module = rootDescriptor;
this.classifierAliases = NO_ALIASES;
this.packages = storageManager.createMemoizedFunctionWithNullableValues(new MemoizedFunctionToNullable<FqName, LazyPackageDescriptor>() {
@Nullable
@Override
@@ -257,7 +244,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
}
}
JetScope resolutionScope = getScopeProvider().getResolutionScopeForDeclaration(classOrObject);
Name name = safeNameForLazyResolve(classOrObject.getNameAsName());
Name name = classOrObject.getNameAsSafeName();
// Why not use the result here. Because it may be that there is a redeclaration:
// class A {} class A { fun foo(): A<completion here>}
@@ -376,7 +363,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
throw new IllegalStateException("Unknown owner kind for a type parameter: " + ownerDescriptor);
}
Name name = ResolveSessionUtils.safeNameForLazyResolve(parameter.getNameAsName());
Name name = parameter.getNameAsSafeName();
for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) {
if (typeParameterDescriptor.getName().equals(name)) {
return typeParameterDescriptor;
@@ -389,7 +376,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
@Override
public DeclarationDescriptor visitNamedFunction(@NotNull JetNamedFunction function, Void data) {
JetScope scopeForDeclaration = getScopeProvider().getResolutionScopeForDeclaration(function);
scopeForDeclaration.getFunctions(safeNameForLazyResolve(function));
scopeForDeclaration.getFunctions(function.getNameAsSafeName());
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, function);
}
@@ -401,7 +388,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
// This is a primary constructor parameter
ClassDescriptor classDescriptor = getClassDescriptor(jetClass);
if (parameter.hasValOrVarNode()) {
classDescriptor.getDefaultType().getMemberScope().getProperties(safeNameForLazyResolve(parameter));
classDescriptor.getDefaultType().getMemberScope().getProperties(parameter.getNameAsSafeName());
return getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter);
}
else {
@@ -417,7 +404,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
@Override
public DeclarationDescriptor visitProperty(@NotNull JetProperty property, Void data) {
JetScope scopeForDeclaration = getScopeProvider().getResolutionScopeForDeclaration(property);
scopeForDeclaration.getProperties(safeNameForLazyResolve(property));
scopeForDeclaration.getProperties(property.getNameAsSafeName());
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property);
}
@@ -434,16 +421,6 @@ public class ResolveSession implements KotlinCodeAnalyzer {
return result;
}
@NotNull
public Name resolveClassifierAlias(@NotNull FqName packageName, @NotNull Name alias) {
// TODO: creating a new FqName object every time...
Name actualName = classifierAliases.fun(packageName.child(alias));
if (actualName == null) {
return alias;
}
return actualName;
}
@NotNull
private List<LazyPackageDescriptor> getAllPackages() {
LazyPackageDescriptor rootPackage = getPackageFragment(FqName.ROOT);
@@ -148,7 +148,7 @@ public class ResolveSessionUtils {
@NotNull
public static Name safeNameForLazyResolve(@Nullable Name name) {
return name != null ? name : NO_NAME_FOR_LAZY_RESOLVE;
return name != null && !name.isSpecial() ? name : NO_NAME_FOR_LAZY_RESOLVE;
}
@Nullable
@@ -23,6 +23,7 @@ import com.google.common.collect.Multimap;
import kotlin.Function0;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo;
@@ -107,18 +108,18 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
@NotNull
@Override
public List<JetNamedFunction> getFunctionDeclarations(@NotNull Name name) {
return Lists.newArrayList(index.invoke().functions.get(name));
return Lists.newArrayList(index.invoke().functions.get(ResolveSessionUtils.safeNameForLazyResolve(name)));
}
@NotNull
@Override
public List<JetProperty> getPropertyDeclarations(@NotNull Name name) {
return Lists.newArrayList(index.invoke().properties.get(name));
return Lists.newArrayList(index.invoke().properties.get(ResolveSessionUtils.safeNameForLazyResolve(name)));
}
@NotNull
@Override
public Collection<JetClassLikeInfo> getClassOrObjectDeclarations(@NotNull Name name) {
return index.invoke().classesAndObjects.get(name);
return index.invoke().classesAndObjects.get(ResolveSessionUtils.safeNameForLazyResolve(name));
}
}
@@ -42,8 +42,6 @@ import org.jetbrains.jet.utils.Printer;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, DP extends DeclarationProvider> implements JetScope {
protected final ResolveSession resolveSession;
protected final BindingTrace trace;
@@ -228,19 +226,19 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
for (JetDeclaration declaration : declarations) {
if (declaration instanceof JetClassOrObject) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration;
result.addAll(classDescriptors.invoke(safeNameForLazyResolve(classOrObject.getNameAsName())));
result.addAll(classDescriptors.invoke(classOrObject.getNameAsSafeName()));
}
else if (declaration instanceof JetFunction) {
JetFunction function = (JetFunction) declaration;
result.addAll(getFunctions(safeNameForLazyResolve(function)));
result.addAll(getFunctions(function.getNameAsSafeName()));
}
else if (declaration instanceof JetProperty) {
JetProperty property = (JetProperty) declaration;
result.addAll(getProperties(safeNameForLazyResolve(property)));
result.addAll(getProperties(property.getNameAsSafeName()));
}
else if (declaration instanceof JetParameter) {
JetParameter parameter = (JetParameter) declaration;
result.addAll(getProperties(safeNameForLazyResolve(parameter)));
result.addAll(getProperties(parameter.getNameAsSafeName()));
}
else if (declaration instanceof JetScript) {
result.addAll(classDescriptors.invoke(ScriptNameUtil.classNameForScript((JetScript) declaration).shortName()));
@@ -20,8 +20,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -45,13 +43,6 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragm
return null;
}
@Override
public ClassifierDescriptor getClassifier(@NotNull Name name) {
// TODO: creating an FqName every time may be a performance problem
Name actualName = resolveSession.resolveClassifierAlias(DescriptorUtils.getFqNameSafe(thisDescriptor), name);
return super.getClassifier(actualName);
}
@NotNull
@Override
protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) {
@@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.LazyEntity;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lexer.JetTokens;
@@ -45,7 +44,7 @@ public class LazyTypeParameterDescriptor extends AbstractLazyTypeParameterDescri
super(
resolveSession.getStorageManager(),
containingDeclaration,
ResolveSessionUtils.safeNameForLazyResolve(jetTypeParameter.getNameAsName()),
jetTypeParameter.getNameAsSafeName(),
jetTypeParameter.getVariance(),
jetTypeParameter.hasModifier(JetTokens.REIFIED_KEYWORD),
index
@@ -0,0 +1,17 @@
// !DIAGNOSTICS: -REDECLARATION
class C {
fun<!SYNTAX!><!> () {
}
val<!SYNTAX!><!> : Int = 1
class<!SYNTAX!><!> {}
enum class<!SYNTAX!><!> {}
}
class C1<in<!SYNTAX!>><!><!SYNTAX!><!> {}
class C2(val<!SYNTAX!><!>) {}
@@ -0,0 +1,26 @@
// !DIAGNOSTICS: -REDECLARATION
package<!SYNTAX!><!>
fun<!SYNTAX!><!> () {
}
val<!SYNTAX!><!> : Int = 1
class<!SYNTAX!><!> {
}
trait<!SYNTAX!><!> {
}
object <!SYNTAX!><!>{
}
enum class<!SYNTAX!><!> {}
annotation class<!SYNTAX!><!> <!ANNOTATION_CLASS_WITH_BODY!>{}<!>
@@ -5911,6 +5911,16 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/recovery"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("namelessMembers.kt")
public void testNamelessMembers() throws Exception {
doTest("compiler/testData/diagnostics/tests/recovery/namelessMembers.kt");
}
@TestMetadata("namelessToplevelDeclarations.kt")
public void testNamelessToplevelDeclarations() throws Exception {
doTest("compiler/testData/diagnostics/tests/recovery/namelessToplevelDeclarations.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/redeclarations")