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:
Nikolay Krasko
2017-01-25 12:49:28 +03:00
parent 1361d5e915
commit 370e7cd9f5
6 changed files with 26 additions and 6 deletions
@@ -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
+6
View File
@@ -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");