Register mock injection language manager in compiler

In 192 it's important to have service registered since
https://github.com/JetBrains/intellij-community/commit/f204718c885034bc2fa4be4b281ff4bbd5fa4ef4

Caused by: java.lang.IllegalArgumentException: Argument for @NotNull parameter 'value' of com/intellij/openapi/util/UserDataHolderBase.putUserDataIfAbsent must not be null
	at com.intellij.openapi.util.UserDataHolderBase.$$$reportNull$$$0(UserDataHolderBase.java)
	at com.intellij.openapi.util.UserDataHolderBase.putUserDataIfAbsent(UserDataHolderBase.java)
	at com.intellij.openapi.util.NotNullLazyKey.getValue(NotNullLazyKey.java:41)
	at com.intellij.lang.injection.InjectedLanguageManager.getInstance(InjectedLanguageManager.java:41)
	at com.intellij.psi.impl.PsiCachedValue.isVeryPhysical(PsiCachedValue.java:74)
	at com.intellij.psi.impl.PsiCachedValue.anyChangeImpliesPsiCounterChange(PsiCachedValue.java:57)

Reproduced with Fir2IrTextTestGenerated
This commit is contained in:
Nikolay Krasko
2019-06-18 17:33:59 +03:00
parent ebcf306ecc
commit 674badc692
3 changed files with 106 additions and 0 deletions
@@ -26,6 +26,7 @@ import com.intellij.core.JavaCoreApplicationEnvironment
import com.intellij.core.JavaCoreProjectEnvironment
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.lang.MetaLanguage
import com.intellij.lang.injection.InjectedLanguageManager
import com.intellij.lang.java.JavaParserDefinition
import com.intellij.mock.MockProject
import com.intellij.openapi.Disposable
@@ -158,6 +159,7 @@ class KotlinCoreEnvironment private constructor(
registerService(ExternalAnnotationsManager::class.java, MockExternalAnnotationsManager())
registerService(InferredAnnotationsManager::class.java, MockInferredAnnotationsManager())
registerService(InjectedLanguageManager::class.java, MockInjectedLanguageManager())
}
super.registerJavaPsiFacade()
@@ -0,0 +1,54 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.cli.jvm.compiler
import com.intellij.injected.editor.DocumentWindow
import com.intellij.lang.injection.InjectedLanguageManager
import com.intellij.lang.injection.MultiHostInjector
import com.intellij.openapi.Disposable
import com.intellij.openapi.editor.Document
import com.intellij.openapi.util.Pair
import com.intellij.openapi.util.TextRange
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiLanguageInjectionHost
class MockInjectedLanguageManager : InjectedLanguageManager() {
override fun mightHaveInjectedFragmentAtOffset(hostDocument: Document, hostOffset: Int): Boolean = false
override fun getTopLevelFile(element: PsiElement): PsiFile? = null
override fun getUnescapedText(injectedNode: PsiElement): String = ""
override fun getInjectionHost(injectedProvider: FileViewProvider): PsiLanguageInjectionHost? = null
override fun getInjectionHost(injectedElement: PsiElement): PsiLanguageInjectionHost? = null
override fun getInjectedPsiFiles(host: PsiElement): List<Pair<PsiElement, TextRange>> = emptyList()
override fun enumerate(host: PsiElement, visitor: PsiLanguageInjectionHost.InjectedPsiVisitor) {}
override fun enumerateEx(
host: PsiElement, containingFile: PsiFile, probeUp: Boolean, visitor: PsiLanguageInjectionHost.InjectedPsiVisitor) {}
override fun getCachedInjectedDocumentsInRange(hostPsiFile: PsiFile, range: TextRange): List<DocumentWindow> = emptyList()
override fun dropFileCaches(file: PsiFile) {}
override fun getNonEditableFragments(window: DocumentWindow): List<TextRange> = emptyList()
override fun registerMultiHostInjector(injector: MultiHostInjector) {}
override fun registerMultiHostInjector(injector: MultiHostInjector, parentDisposable: Disposable) {}
override fun isInjectedFragment(injectedFile: PsiFile): Boolean = false
override fun intersectWithAllEditableFragments(injectedPsi: PsiFile, rangeToEdit: TextRange): List<TextRange> = emptyList()
override fun freezeWindow(document: DocumentWindow): DocumentWindow = document
override fun findInjectedElementAt(hostFile: PsiFile, hostDocumentOffset: Int): PsiElement? = null
override fun injectedToHost(injectedContext: PsiElement, injectedTextRange: TextRange): TextRange = injectedTextRange
override fun injectedToHost(injectedContext: PsiElement, injectedOffset: Int): Int = injectedOffset
// BUNCH: 183
@Suppress("MissingRecentApi")
override fun injectedToHost(injectedContext: PsiElement, injectedOffset: Int, minHostOffset: Boolean): Int = injectedOffset
}
@@ -0,0 +1,50 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.cli.jvm.compiler
import com.intellij.injected.editor.DocumentWindow
import com.intellij.lang.injection.InjectedLanguageManager
import com.intellij.lang.injection.MultiHostInjector
import com.intellij.openapi.Disposable
import com.intellij.openapi.editor.Document
import com.intellij.openapi.util.Pair
import com.intellij.openapi.util.TextRange
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiLanguageInjectionHost
class MockInjectedLanguageManager : InjectedLanguageManager() {
override fun mightHaveInjectedFragmentAtOffset(hostDocument: Document, hostOffset: Int): Boolean = false
override fun getTopLevelFile(element: PsiElement): PsiFile? = null
override fun getUnescapedText(injectedNode: PsiElement): String = ""
override fun getInjectionHost(injectedProvider: FileViewProvider): PsiLanguageInjectionHost? = null
override fun getInjectionHost(injectedElement: PsiElement): PsiLanguageInjectionHost? = null
override fun getInjectedPsiFiles(host: PsiElement): List<Pair<PsiElement, TextRange>> = emptyList()
override fun enumerate(host: PsiElement, visitor: PsiLanguageInjectionHost.InjectedPsiVisitor) {}
override fun enumerateEx(
host: PsiElement, containingFile: PsiFile, probeUp: Boolean, visitor: PsiLanguageInjectionHost.InjectedPsiVisitor) {}
override fun getCachedInjectedDocumentsInRange(hostPsiFile: PsiFile, range: TextRange): List<DocumentWindow> = emptyList()
override fun dropFileCaches(file: PsiFile) {}
override fun getNonEditableFragments(window: DocumentWindow): List<TextRange> = emptyList()
override fun registerMultiHostInjector(injector: MultiHostInjector) {}
override fun registerMultiHostInjector(injector: MultiHostInjector, parentDisposable: Disposable) {}
override fun isInjectedFragment(injectedFile: PsiFile): Boolean = false
override fun intersectWithAllEditableFragments(injectedPsi: PsiFile, rangeToEdit: TextRange): List<TextRange> = emptyList()
override fun freezeWindow(document: DocumentWindow): DocumentWindow = document
override fun findInjectedElementAt(hostFile: PsiFile, hostDocumentOffset: Int): PsiElement? = null
override fun injectedToHost(injectedContext: PsiElement, injectedTextRange: TextRange): TextRange = injectedTextRange
override fun injectedToHost(injectedContext: PsiElement, injectedOffset: Int): Int = injectedOffset
}