Stop considering injected files as Kotlin source roots (KT-15032)
We should have a special facade for them as descriptors are not present in ordinal project facade. Caused by change in idea 171 (https://github.com/JetBrains/intellij-community/commit/b3527d9a20f4b9391e98b426beb2548fb3efc0fe) #KT-15032 Fixed
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.psi.psiUtil
|
||||
|
||||
import com.intellij.injected.editor.VirtualFileWindow
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.search.PsiSearchScopeUtil
|
||||
@@ -329,9 +330,10 @@ fun PsiElement.getElementTextWithContext(): String {
|
||||
val inFileParentOffset = elementContextOffset - startContextOffset
|
||||
|
||||
|
||||
val isInjected = containingFile is VirtualFileWindow
|
||||
return StringBuilder(topLevelElement.text)
|
||||
.insert(inFileParentOffset, "<caret>")
|
||||
.insert(0, "File name: ${containingFile.name} Physical: ${containingFile.isPhysical}\n")
|
||||
.insert(0, "File name: ${containingFile.name} Physical: ${containingFile.isPhysical} Injected: $isInjected\n")
|
||||
.toString()
|
||||
}
|
||||
|
||||
|
||||
@@ -30,11 +30,10 @@ import com.intellij.psi.util.CachedValuesManager
|
||||
import com.intellij.util.SmartList
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.idea.util.isInSourceContentWithoutInjected
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.jvm.GlobalSearchScopeWithModuleSources
|
||||
import org.jetbrains.kotlin.utils.alwaysNull
|
||||
import org.jetbrains.kotlin.utils.emptyOrSingletonList
|
||||
import java.lang.reflect.Method
|
||||
import java.util.*
|
||||
|
||||
interface IdeaModuleInfo : ModuleInfo {
|
||||
@@ -155,7 +154,7 @@ private class ModuleProductionSourceScope(module: Module) : ModuleSourceScope(mo
|
||||
// KT-6206
|
||||
override fun hashCode(): Int = 31 * module.hashCode()
|
||||
|
||||
override fun contains(file: VirtualFile) = moduleFileIndex.isInSourceContent(file) && !moduleFileIndex.isInTestSourceContent(file)
|
||||
override fun contains(file: VirtualFile) = moduleFileIndex.isInSourceContentWithoutInjected(file) && !moduleFileIndex.isInTestSourceContent(file)
|
||||
|
||||
override fun toString() = "ModuleProductionSourceScope($module)"
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
||||
import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
import org.jetbrains.kotlin.idea.util.isInSourceContentWithoutInjected
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||
import org.jetbrains.kotlin.script.getScriptDefinition
|
||||
@@ -95,7 +96,7 @@ private fun getModuleInfoByVirtualFile(project: Project, virtualFile: VirtualFil
|
||||
warnIfDecompiled()
|
||||
return module.testSourceInfo()
|
||||
}
|
||||
else if (moduleFileIndex.isInSourceContent(virtualFile)) {
|
||||
else if (moduleFileIndex.isInSourceContentWithoutInjected(virtualFile)) {
|
||||
warnIfDecompiled()
|
||||
return module.productionSourceInfo()
|
||||
}
|
||||
|
||||
@@ -18,7 +18,9 @@ package org.jetbrains.kotlin.idea.util
|
||||
|
||||
import com.intellij.ide.highlighter.ArchiveFileType
|
||||
import com.intellij.ide.highlighter.JavaClassFileType
|
||||
import com.intellij.injected.editor.VirtualFileWindow
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.roots.FileIndex
|
||||
import com.intellij.openapi.roots.ProjectFileIndex
|
||||
import com.intellij.openapi.util.Ref
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
@@ -32,6 +34,10 @@ import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||
|
||||
private val classFileLike = listOf(JavaClassFileType.INSTANCE, KotlinBuiltInFileType, KotlinModuleFileType.INSTANCE)
|
||||
|
||||
fun FileIndex.isInSourceContentWithoutInjected(file: VirtualFile): Boolean {
|
||||
return file !is VirtualFileWindow && isInSourceContent(file)
|
||||
}
|
||||
|
||||
object ProjectRootsUtil {
|
||||
@JvmStatic fun isInContent(project: Project, file: VirtualFile, includeProjectSource: Boolean,
|
||||
includeLibrarySource: Boolean, includeLibraryClasses: Boolean,
|
||||
@@ -39,7 +45,7 @@ object ProjectRootsUtil {
|
||||
fileIndex: ProjectFileIndex = ProjectFileIndex.SERVICE.getInstance(project),
|
||||
isJsProjectRef: Ref<Boolean?>? = null): Boolean {
|
||||
|
||||
if (includeProjectSource && fileIndex.isInSourceContent(file)) return true
|
||||
if (includeProjectSource && fileIndex.isInSourceContentWithoutInjected(file)) return true
|
||||
|
||||
if (!includeLibraryClasses && !includeLibrarySource) return false
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package language_injection
|
||||
|
||||
<info descr="null">import</info> org.intellij.lang.annotations.<info descr="null">Language</info>
|
||||
|
||||
<info descr="null">@Language</info>("kotlin")
|
||||
val <info descr="null">test</info> = "<inject descr="null">fun test2() {}</inject>"
|
||||
@@ -78,6 +78,12 @@ public class HighlightingTestGenerated extends AbstractHighlightingTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("KotlinInjection.kt")
|
||||
public void testKotlinInjection() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/highlighter/KotlinInjection.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("Labels.kt")
|
||||
public void testLabels() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/highlighter/Labels.kt");
|
||||
|
||||
Reference in New Issue
Block a user