From d2ce6f5787177acf8de75647e7f6f2a50e09ca35 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 10 Jun 2014 12:47:46 +0400 Subject: [PATCH] Safe identifier for the case of no name in PSI moved to 'descriptors' module, to be used in 'descriptor.loader.java' --- .../lang/resolve/lazy/ResolveSessionUtils.java | 9 ++------- .../tests/recovery/namelessInJava.kt | 17 +++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ .../descriptors/LazyJavaPackageFragmentScope.kt | 4 ++-- .../jet/lang/resolve/name/SpecialNames.java | 15 ++++++++++++++- .../plugin/stubs/AbstractStubBuilderTest.java | 8 ++------ 6 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/recovery/namelessInJava.kt 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 9bd5fca24eb..f75a1319b93 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 @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.psi.JetNamedDeclarationUtil; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.NamePackage; +import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.Collection; @@ -36,12 +37,6 @@ import java.util.Collections; public class ResolveSessionUtils { - // This name is used as a key for the case when something has no name _due to a syntactic error_ - // Example: fun (x: Int) = 5 - // There's no name for this function in the PSI - // The name contains a GUID to avoid clashes, if a clash happens, it's not a big deal: the code does not compile anyway - public static final Name NO_NAME_FOR_LAZY_RESOLVE = Name.identifier("no_name_in_PSI_for_lazy_resolve_3d19d79d_1ba9_4cd0_b7f5_b46aa3cd5d40"); - public static final Predicate NON_SINGLETON_FILTER = new Predicate() { @Override public boolean apply(@Nullable ClassDescriptor descriptor) { @@ -148,7 +143,7 @@ public class ResolveSessionUtils { @NotNull public static Name safeNameForLazyResolve(@Nullable Name name) { - return name != null && !name.isSpecial() ? name : NO_NAME_FOR_LAZY_RESOLVE; + return SpecialNames.safeIdentifier(name); } @Nullable diff --git a/compiler/testData/diagnostics/tests/recovery/namelessInJava.kt b/compiler/testData/diagnostics/tests/recovery/namelessInJava.kt new file mode 100644 index 00000000000..9dd41d745aa --- /dev/null +++ b/compiler/testData/diagnostics/tests/recovery/namelessInJava.kt @@ -0,0 +1,17 @@ +// FILE: p/Nameless.java + +package p; + +public class Nameless { + void () {} + int ; +} + +// FILE: k.kt + +import p.* + +class K : Nameless() { + fun () {} + val : Int = 1 +} \ 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 bc799f398b3..2dcb09635c3 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -5911,6 +5911,11 @@ 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("namelessInJava.kt") + public void testNamelessInJava() throws Exception { + doTest("compiler/testData/diagnostics/tests/recovery/namelessInJava.kt"); + } + @TestMetadata("namelessMembers.kt") public void testNamelessMembers() throws Exception { doTest("compiler/testData/diagnostics/tests/recovery/namelessMembers.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt index 050b0c7d626..9636158fad3 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt @@ -32,12 +32,12 @@ import org.jetbrains.jet.lang.resolve.java.lazy.findJavaClass import org.jetbrains.jet.lang.resolve.java.lazy.findClassInJava import org.jetbrains.jet.lang.resolve.java.PackageClassUtils import org.jetbrains.jet.lang.resolve.scopes.JetScope -import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod import org.jetbrains.jet.lang.types.JetType import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaMemberScope.MethodSignatureData import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor +import org.jetbrains.jet.lang.resolve.name.SpecialNames public abstract class LazyJavaPackageFragmentScope( c: LazyJavaResolverContext, @@ -104,7 +104,7 @@ public class LazyPackageFragmentScopeForJavaPackage( private val classes = c.storageManager.createMemoizedFunctionWithNullableValues { name -> - val fqName = fqName.child(name) + val fqName = fqName.child(SpecialNames.safeIdentifier(name)) val (jClass, kClass) = c.findClassInJava(fqName) if (kClass != null) kClass diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/SpecialNames.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/SpecialNames.java index b5b98773499..a638ac94cfb 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/SpecialNames.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/SpecialNames.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.resolve.name; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class SpecialNames { public static final Name NO_NAME_PROVIDED = Name.special(""); @@ -24,7 +25,16 @@ public class SpecialNames { private static final String CLASS_OBJECT_FOR = ""); + .replace(SpecialNames.SAFE_IDENTIFIER_FOR_NO_NAME.asString(), ""); String expectedFile = sourcePath.replace(".kt", ".expected"); JetTestUtils.assertEqualsToFile(new File(expectedFile), stubTree); }