diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index f0ddcf70649..7361ef9b524 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -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 NO_ALIASES = new Function() { - @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 classifierAliases; - private final MemoizedFunctionToNullable 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() { @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} @@ -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 getAllPackages() { LazyPackageDescriptor rootPackage = getPackageFragment(FqName.ROOT); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java index 8f4255c1b9d..9bd5fca24eb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java @@ -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 diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.java index 4ee18c5b915..e2edee1d7d6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.java @@ -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 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 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 getClassOrObjectDeclarations(@NotNull Name name) { - return index.invoke().classesAndObjects.get(name); + return index.invoke().classesAndObjects.get(ResolveSessionUtils.safeNameForLazyResolve(name)); } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java index 8b67617ffc3..69e5babe6be 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java @@ -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 implements JetScope { protected final ResolveSession resolveSession; protected final BindingTrace trace; @@ -228,19 +226,19 @@ public abstract class AbstractLazyMemberScope () { + + } + + val : Int = 1 + + class {} + + enum class {} +} + +class C1> {} + +class C2(val) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/recovery/namelessToplevelDeclarations.kt b/compiler/testData/diagnostics/tests/recovery/namelessToplevelDeclarations.kt new file mode 100644 index 00000000000..2c380e965ee --- /dev/null +++ b/compiler/testData/diagnostics/tests/recovery/namelessToplevelDeclarations.kt @@ -0,0 +1,26 @@ +// !DIAGNOSTICS: -REDECLARATION + +package + +fun () { + +} + +val : Int = 1 + + +class { + +} + +trait { + +} + +object { + +} + +enum class {} + +annotation class {} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 0fd899c31b3..bc799f398b3 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -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") diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index 2f39ef29612..1551281af90 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -278,6 +278,7 @@ fun main(args: Array) { testClass(javaClass()) { model("checker", recursive = false) model("checker/regression") + model("checker/recovery") model("checker/rendering") model("checker/duplicateJvmSignature") model("checker/infos", testMethod = "doTestWithInfos") diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index 20fb292c476..29596c3c4e0 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -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() } } diff --git a/idea/testData/checker/recovery/namelessMembers.kt b/idea/testData/checker/recovery/namelessMembers.kt new file mode 100644 index 00000000000..14c6e2d520a --- /dev/null +++ b/idea/testData/checker/recovery/namelessMembers.kt @@ -0,0 +1,15 @@ +class C { + fun () { + + } + + val : Int = 1 + + class {} + + enum class {} +} + +class C1> {} + +class C2(val) {} \ No newline at end of file diff --git a/idea/testData/checker/recovery/namelessToplevelDeclarations.kt b/idea/testData/checker/recovery/namelessToplevelDeclarations.kt new file mode 100644 index 00000000000..a77cb125fc9 --- /dev/null +++ b/idea/testData/checker/recovery/namelessToplevelDeclarations.kt @@ -0,0 +1,24 @@ +package + +fun () { + +} + +val : Int = 1 + + +class { + +} + +trait { + +} + +object { + +} + +enum class {} + +annotation class {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java index 35fd5b7267d..bdd6b55d8d7 100644 --- a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java @@ -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);