From 94d18581e3fe523ad4aca1634ac9fd4b9ebca4f6 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Thu, 1 Mar 2018 21:51:07 +0300 Subject: [PATCH] 181: FakeFileForLightClass made return "virtualFile" from "ktFile" --- .../elements/FakeFileForLightClass.kt.181 | 5 +++ .../kotlin/asJava/KtFileLightClassTest.kt.181 | 42 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt.181 b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt.181 index debfbb5698c..158f9ae7a82 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt.181 +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt.181 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.asJava.elements +import com.intellij.openapi.vfs.VirtualFile import com.intellij.pom.java.LanguageLevel import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor @@ -33,6 +34,10 @@ open class FakeFileForLightClass( private val stub: () -> PsiClassHolderFileStub<*>, private val packageFqName: FqName = ktFile.packageFqName ) : ClsFileImpl(ktFile.viewProvider) { + + override fun getVirtualFile(): VirtualFile = + ktFile.virtualFile ?: ktFile.originalFile.virtualFile ?: super.getVirtualFile() + override fun getPackageName() = packageFqName.asString() override fun getStub() = stub() diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt.181 b/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt.181 index 7fb17f689c1..8b64372ea99 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt.181 +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtFileLightClassTest.kt.181 @@ -17,9 +17,13 @@ package org.jetbrains.kotlin.asJava import com.intellij.injected.editor.EditorWindow +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile import com.intellij.psi.search.GlobalSearchScope import com.intellij.testFramework.LightProjectDescriptor -import org.intellij.lang.annotations.Language +import junit.framework.TestCase +import org.jetbrains.kotlin.asJava.elements.KtLightElement +import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor import org.jetbrains.kotlin.idea.test.PluginTestCaseBase @@ -92,4 +96,40 @@ class KtFileLightClassTest : KotlinLightCodeInsightFixtureTestCase() { assertEquals("Injected class should be `A`", "A", (injectedFile as KtFile).classes.single().name) } + + fun testSameVirtualFileForLightElement() { + + val psiFile = myFixture.addFileToProject( + "pkg/AnnotatedClass.kt", """ + package pkg + + class AnnotatedClass { + @Deprecated("a") + fun bar(param: String) = null + } + """.trimIndent() + ) + + fun lightElement(file: PsiFile): PsiElement = (file as KtFile).classes.single() + .methods.first { it.name == "bar" } + .annotations.first { it.qualifiedName == "kotlin.Deprecated" }.also { + // Otherwise following asserts have no sense + TestCase.assertTrue("psi element should be light ", it is KtLightElement<*, *>) + } + + + val copied = psiFile.copied() + TestCase.assertNull("virtual file for copy should be null", copied.virtualFile) + TestCase.assertNotNull("psi element in copy", lightElement(copied)) + TestCase.assertSame("copy.originalFile should be psiFile", copied.originalFile, psiFile) + + // virtual files should be the same for light and non-light element, + // otherwise we will not be able to find proper module by file from light element + TestCase.assertSame( + "virtualFiles of element and file itself should be the same", + lightElement(copied).containingFile.originalFile.virtualFile, + copied.originalFile.virtualFile + ) + } + }