Don't create light classes for platform declarations

#KT-15137 Fixed
This commit is contained in:
Dmitry Jemerov
2016-12-12 17:27:38 +01:00
parent b4dd54f874
commit 7e92cf2af7
4 changed files with 22 additions and 3 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -69,10 +70,10 @@ object PackagePartClassUtils {
@JvmStatic fun fileHasTopLevelCallables(file: KtFile): Boolean = @JvmStatic fun fileHasTopLevelCallables(file: KtFile): Boolean =
file.declarations.any { file.declarations.any {
it is KtProperty || (it is KtProperty ||
it is KtNamedFunction || it is KtNamedFunction ||
it is KtScript || it is KtScript ||
it is KtTypeAlias it is KtTypeAlias) && !it.hasModifier(KtTokens.PLATFORM_KEYWORD)
} }
@JvmStatic fun getFilePartShortName(fileName: String): String = @JvmStatic fun getFilePartShortName(fileName: String): String =
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightPsiReferenceList
import org.jetbrains.kotlin.asJava.hasInterfaceDefaultImpls import org.jetbrains.kotlin.asJava.hasInterfaceDefaultImpls
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -351,7 +352,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? { fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? {
if (classOrObject.getContainingKtFile().isScript) { if (classOrObject.getContainingKtFile().isScript || classOrObject.hasModifier(KtTokens.PLATFORM_KEYWORD)) {
return null return null
} }
@@ -62,6 +62,13 @@ class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() {
assertEquals(0, facadeFiles.size) 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? { override fun getTestDataPath(): String? {
return PluginTestCaseBase.getTestDataPathBase() + "/asJava/fileLightClass/" return PluginTestCaseBase.getTestDataPathBase() + "/asJava/fileLightClass/"
} }
@@ -23,7 +23,9 @@ import com.intellij.testFramework.LightProjectDescriptor
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.KtPsiFactory
// see KtFileLightClassTest // see KtFileLightClassTest
@@ -94,6 +96,14 @@ class LightClassFromTextTest : KotlinLightCodeInsightFixtureTestCase() {
assertEquals(exampleClass, (f.returnType as PsiClassType).resolve()) 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<out PsiClass> { private fun classesFromText(text: String, fileName: String = "A.kt"): Array<out PsiClass> {
val file = KtPsiFactory(project).createFileWithLightClassSupport(fileName, text, myFixture.file) val file = KtPsiFactory(project).createFileWithLightClassSupport(fileName, text, myFixture.file)
val classes = file.classes val classes = file.classes