diff --git a/compiler/testData/asJava/lightClasses/DollarsInName.java b/compiler/testData/asJava/lightClasses/DollarsInName.java new file mode 100644 index 00000000000..7db366a3771 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/DollarsInName.java @@ -0,0 +1,15 @@ +public final class A$B { + public A$B() { /* compiled code */ } + + public final class C$D { + public C$D() { /* compiled code */ } + } + + public static final class $$$$$$$ { + public $$$$$$$() { /* compiled code */ } + + public final class G$G$ { + public G$G$() { /* compiled code */ } + } + } +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/DollarsInName.kt b/compiler/testData/asJava/lightClasses/DollarsInName.kt new file mode 100644 index 00000000000..7ccba55715d --- /dev/null +++ b/compiler/testData/asJava/lightClasses/DollarsInName.kt @@ -0,0 +1,10 @@ +// c.b.a.A$B +package c.b.a + +class `A$B` { + inner class `C$D` + + class `$$$$$$$` { + inner class `G$G$` + } +} diff --git a/compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.java b/compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.java new file mode 100644 index 00000000000..46c03b6e2e2 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.java @@ -0,0 +1,15 @@ +public final class A$B { + public A$B() { /* compiled code */ } + + public final class C$D { + public C$D() { /* compiled code */ } + } + + public static final class $$$$$$$ { + public $$$$$$$() { /* compiled code */ } + + public final class G$G$ { + public G$G$() { /* compiled code */ } + } + } +} diff --git a/compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.kt b/compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.kt new file mode 100644 index 00000000000..de23a745648 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.kt @@ -0,0 +1,8 @@ +// A$B +class `A$B` { + inner class `C$D` + + class `$$$$$$$` { + inner class `G$G$` + } +} diff --git a/compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.java b/compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.java new file mode 100644 index 00000000000..ba8bd9cbb1d --- /dev/null +++ b/compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.java @@ -0,0 +1,15 @@ +static final class Foo$bar$A$B { + public Foo$bar$A$B() { /* compiled code */ } + + final class C$D { + public C$D() { /* compiled code */ } + } + + final class $$$$$$$ { + public $$$$$$$() { /* compiled code */ } + + final class G$G$ { + public G$G$() { /* compiled code */ } + } + } +} diff --git a/compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.kt b/compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.kt new file mode 100644 index 00000000000..119659bf9d3 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.kt @@ -0,0 +1,14 @@ +// c.b.a.Foo$bar$A$B +package c.b.a + +class Foo { + fun bar() { + class `A$B` { + inner class `C$D` + + inner class `$$$$$$$` { + inner class `G$G$` + } + } + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index 61caea12e2b..006ae235aa0 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -32,7 +32,7 @@ import java.util.regex.Pattern; @RunWith(JUnit3RunnerWithInners.class) public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassTest { public void testAllFilesPresentInLightClasses() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^(.+)\\.kt$"), true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^(.+)\\.kt$"), true, "local"); } @TestMetadata("AnnotationClass.kt") @@ -47,6 +47,18 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT doTest(fileName); } + @TestMetadata("DollarsInName.kt") + public void testDollarsInName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DollarsInName.kt"); + doTest(fileName); + } + + @TestMetadata("DollarsInNameNoPackage.kt") + public void testDollarsInNameNoPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/asJava/lightClasses/delegation") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index eee6c5b921c..8d9cb03f124 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -333,7 +333,7 @@ fun main(args: Array) { } testClass() { - model("asJava/lightClasses") + model("asJava/lightClasses", excludeDirs = listOf("local")) } testClass() { @@ -855,7 +855,7 @@ fun main(args: Array) { } testClass { - model("asJava/lightClasses", pattern = KT_WITHOUT_DOTS_IN_NAME) + model("asJava/lightClasses", excludeDirs = listOf("local"), pattern = KT_WITHOUT_DOTS_IN_NAME) } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt index b5d21e3716a..dd131866597 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,17 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.util.io.FileUtilRt import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiClass import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.LightClassTestCommon +import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.idea.KotlinDaemonAnalyzerTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.load.java.JvmAnnotationNames +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.MockLibraryUtil import org.junit.Assert @@ -34,7 +39,7 @@ import java.io.File abstract class AbstractIdeLightClassTest : KotlinLightCodeInsightFixtureTestCase() { fun doTest(testDataPath: String) { myFixture.configureByFile(testDataPath) - testLightClass(project, testDataPath, { LightClassTestCommon.removeEmptyDefaultImpls(it) }) + testLightClass(project, myFixture.file as KtFile, testDataPath, { LightClassTestCommon.removeEmptyDefaultImpls(it) }) } override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE @@ -59,15 +64,20 @@ abstract class AbstractIdeCompiledLightClassTest : KotlinDaemonAnalyzerTestCase( private fun libName() = "libFor" + getTestName(false) fun doTest(testDataPath: String) { - testLightClass(project, testDataPath, { it }) + testLightClass(project, null, testDataPath, { it }) } } -private fun testLightClass(project: Project, testDataPath: String, normalize: (String) -> String) { +private fun testLightClass(project: Project, ktFile: KtFile?, testDataPath: String, normalize: (String) -> String) { LightClassTestCommon.testLightClass( File(testDataPath), - findLightClass = { - val clazz = JavaPsiFacade.getInstance(project).findClass(it, GlobalSearchScope.allScope(project)) + findLightClass = { fqName -> + var clazz: PsiClass? = JavaPsiFacade.getInstance(project).findClass(fqName, GlobalSearchScope.allScope(project)) + if (clazz == null) { + clazz = PsiTreeUtil.findChildrenOfType(ktFile, KtClassOrObject::class.java) + .find { fqName.endsWith(it.nameAsName!!.asString()) } + ?.let { KtLightClassForSourceDeclaration.create(it) } + } if (clazz != null) { PsiElementChecker.checkPsiElementStructure(clazz) } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java index 48f5ffcbe61..14cc180d120 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java @@ -32,7 +32,7 @@ import java.util.regex.Pattern; @RunWith(JUnit3RunnerWithInners.class) public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLightClassTest { public void testAllFilesPresentInLightClasses() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), true, "local"); } @TestMetadata("AnnotationClass.kt") @@ -47,6 +47,18 @@ public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLight doTest(fileName); } + @TestMetadata("DollarsInName.kt") + public void testDollarsInName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DollarsInName.kt"); + doTest(fileName); + } + + @TestMetadata("DollarsInNameNoPackage.kt") + public void testDollarsInNameNoPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/asJava/lightClasses/delegation") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index 2e0cff049a6..fd38f064002 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -47,6 +47,18 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { doTest(fileName); } + @TestMetadata("DollarsInName.kt") + public void testDollarsInName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DollarsInName.kt"); + doTest(fileName); + } + + @TestMetadata("DollarsInNameNoPackage.kt") + public void testDollarsInNameNoPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DollarsInNameNoPackage.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/asJava/lightClasses/facades") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -80,6 +92,21 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { } } + @TestMetadata("compiler/testData/asJava/lightClasses/local") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Local extends AbstractIdeLightClassTest { + public void testAllFilesPresentInLocal() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/local"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("DollarsInNameLocal.kt") + public void testDollarsInNameLocal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/local/DollarsInNameLocal.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/asJava/lightClasses/nullabilityAnnotations") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)