Only normalize names when accessing PSI, not earlier
#KT-4833 Fixed
This commit is contained in:
@@ -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
|
||||
|
||||
+4
-3
@@ -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));
|
||||
}
|
||||
}
|
||||
+4
-6
@@ -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()));
|
||||
|
||||
-9
@@ -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) {
|
||||
|
||||
+1
-2
@@ -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")
|
||||
|
||||
@@ -278,6 +278,7 @@ fun main(args: Array<String>) {
|
||||
testClass(javaClass<AbstractJetPsiCheckerTest>()) {
|
||||
model("checker", recursive = false)
|
||||
model("checker/regression")
|
||||
model("checker/recovery")
|
||||
model("checker/rendering")
|
||||
model("checker/duplicateJvmSignature")
|
||||
model("checker/infos", testMethod = "doTestWithInfos")
|
||||
|
||||
+2
-1
@@ -29,6 +29,7 @@ import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex
|
||||
import org.jetbrains.jet.plugin.stubindex.PackageIndexUtil
|
||||
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo
|
||||
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil
|
||||
import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils
|
||||
|
||||
public class StubBasedPackageMemberDeclarationProvider(
|
||||
private val fqName: FqName,
|
||||
@@ -66,7 +67,7 @@ public class StubBasedPackageMemberDeclarationProvider(
|
||||
}
|
||||
|
||||
private fun childName(name: Name): String {
|
||||
return fqName.child(name).asString()
|
||||
return fqName.child(ResolveSessionUtils.safeNameForLazyResolve(name)).asString()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
class C {
|
||||
fun<error> </error>() {
|
||||
|
||||
}
|
||||
|
||||
<error>val<error> </error>: Int = 1</error>
|
||||
|
||||
<error>class<error> </error>{}</error>
|
||||
|
||||
<error>enum class<error> </error>{}</error>
|
||||
}
|
||||
|
||||
class C1<in<error>></error><error> </error>{}
|
||||
|
||||
class C2(val<error>)</error> {}
|
||||
@@ -0,0 +1,24 @@
|
||||
package<EOLError></EOLError>
|
||||
|
||||
fun<error> </error>() {
|
||||
|
||||
}
|
||||
|
||||
val<error> </error>: Int = 1
|
||||
|
||||
|
||||
class<error> </error>{
|
||||
|
||||
}
|
||||
|
||||
trait<error> </error>{
|
||||
|
||||
}
|
||||
|
||||
object <error>{</error>
|
||||
|
||||
}
|
||||
|
||||
enum class<error> </error>{}
|
||||
|
||||
annotation class<error> </error><error>{}</error>
|
||||
@@ -30,7 +30,7 @@ import org.jetbrains.jet.checkers.AbstractJetPsiCheckerTest;
|
||||
|
||||
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||
@SuppressWarnings("all")
|
||||
@InnerTestClasses({JetPsiCheckerTestGenerated.Checker.class, JetPsiCheckerTestGenerated.Regression.class, JetPsiCheckerTestGenerated.Rendering.class, JetPsiCheckerTestGenerated.DuplicateJvmSignature.class, JetPsiCheckerTestGenerated.Infos.class})
|
||||
@InnerTestClasses({JetPsiCheckerTestGenerated.Checker.class, JetPsiCheckerTestGenerated.Regression.class, JetPsiCheckerTestGenerated.Recovery.class, JetPsiCheckerTestGenerated.Rendering.class, JetPsiCheckerTestGenerated.DuplicateJvmSignature.class, JetPsiCheckerTestGenerated.Infos.class})
|
||||
public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest {
|
||||
@TestMetadata("idea/testData/checker")
|
||||
public static class Checker extends AbstractJetPsiCheckerTest {
|
||||
@@ -408,6 +408,24 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest {
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("idea/testData/checker/recovery")
|
||||
public static class Recovery extends AbstractJetPsiCheckerTest {
|
||||
public void testAllFilesPresentInRecovery() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/checker/recovery"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("namelessMembers.kt")
|
||||
public void testNamelessMembers() throws Exception {
|
||||
doTest("idea/testData/checker/recovery/namelessMembers.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("namelessToplevelDeclarations.kt")
|
||||
public void testNamelessToplevelDeclarations() throws Exception {
|
||||
doTest("idea/testData/checker/recovery/namelessToplevelDeclarations.kt");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("idea/testData/checker/rendering")
|
||||
public static class Rendering extends AbstractJetPsiCheckerTest {
|
||||
public void testAllFilesPresentInRendering() throws Exception {
|
||||
@@ -540,6 +558,7 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest {
|
||||
TestSuite suite = new TestSuite("JetPsiCheckerTestGenerated");
|
||||
suite.addTestSuite(Checker.class);
|
||||
suite.addTestSuite(Regression.class);
|
||||
suite.addTestSuite(Recovery.class);
|
||||
suite.addTestSuite(Rendering.class);
|
||||
suite.addTest(DuplicateJvmSignature.innerSuite());
|
||||
suite.addTestSuite(Infos.class);
|
||||
|
||||
Reference in New Issue
Block a user