From 7e92cf2af7e04c146b209ff2613b10efbbccdf7c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 12 Dec 2016 17:27:38 +0100 Subject: [PATCH] Don't create light classes for platform declarations #KT-15137 Fixed --- .../kotlin/load/kotlin/PackagePartClassUtils.kt | 5 +++-- .../asJava/classes/KtLightClassForSourceDeclaration.kt | 3 ++- .../jetbrains/kotlin/asJava/KtFileLightClassTest.kt | 7 +++++++ .../jetbrains/kotlin/asJava/LightClassFromTextTest.kt | 10 ++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/PackagePartClassUtils.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/PackagePartClassUtils.kt index 22861f4c0c2..e04f9e69d41 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/PackagePartClassUtils.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/PackagePartClassUtils.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -69,10 +70,10 @@ object PackagePartClassUtils { @JvmStatic fun fileHasTopLevelCallables(file: KtFile): Boolean = file.declarations.any { - it is KtProperty || + (it is KtProperty || it is KtNamedFunction || it is KtScript || - it is KtTypeAlias + it is KtTypeAlias) && !it.hasModifier(KtTokens.PLATFORM_KEYWORD) } @JvmStatic fun getFilePartShortName(fileName: String): String = diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index f2959c7ef96..8d18a59bfcd 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightPsiReferenceList import org.jetbrains.kotlin.asJava.hasInterfaceDefaultImpls import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.name.FqName @@ -351,7 +352,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? { - if (classOrObject.getContainingKtFile().isScript) { + if (classOrObject.getContainingKtFile().isScript || classOrObject.hasModifier(KtTokens.PLATFORM_KEYWORD)) { return null } diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt index 3f7d1d9caa7..dc7a68281dd 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt @@ -62,6 +62,13 @@ class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() { assertEquals(0, facadeFiles.size) } + fun testNoFacadeForHeaderClass() { + val file = myFixture.configureByText("foo.kt", "platform fun foo(): Int") as KtFile + assertEquals(0, file.classes.size) + val facadeFiles = LightClassGenerationSupport.getInstance(project).findFilesForFacade(FqName("foo.FooKt"), GlobalSearchScope.allScope(project)) + assertEquals(0, facadeFiles.size) + } + override fun getTestDataPath(): String? { return PluginTestCaseBase.getTestDataPathBase() + "/asJava/fileLightClass/" } diff --git a/idea/tests/org/jetbrains/kotlin/asJava/LightClassFromTextTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/LightClassFromTextTest.kt index fc2ad105fbd..ade9e549926 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/LightClassFromTextTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/LightClassFromTextTest.kt @@ -23,7 +23,9 @@ import com.intellij.testFramework.LightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtPsiFactory // see KtFileLightClassTest @@ -94,6 +96,14 @@ class LightClassFromTextTest : KotlinLightCodeInsightFixtureTestCase() { assertEquals(exampleClass, (f.returnType as PsiClassType).resolve()) } + fun testHeaderDeclarations() { + val contextFile = myFixture.configureByText("Header.kt", "platform class Foo\n\nplatform fun foo()\n") as KtFile + val headerClass = contextFile.declarations.single { it is KtClassOrObject } + assertEquals(0, headerClass.toLightElements().size) + val headerFunction = contextFile.declarations.single { it is KtNamedFunction } + assertEquals(0, headerFunction.toLightElements().size) + } + private fun classesFromText(text: String, fileName: String = "A.kt"): Array { val file = KtPsiFactory(project).createFileWithLightClassSupport(fileName, text, myFixture.file) val classes = file.classes