package cc.unitmesh.devti.language.parser import com.intellij.extapi.psi.ASTWrapperPsiElement import com.intellij.lang.ASTNode import com.intellij.openapi.util.TextRange import com.intellij.psi.ElementManipulators import com.intellij.psi.LiteralTextEscaper import com.intellij.psi.PsiLanguageInjectionHost import com.intellij.psi.impl.source.tree.injected.InjectionBackgroundSuppressor class PatternElement(node: ASTNode) : ASTWrapperPsiElement(node), PsiLanguageInjectionHost, InjectionBackgroundSuppressor { override fun isValidHost(): Boolean = true override fun updateText(text: String): PsiLanguageInjectionHost { return ElementManipulators.handleContentChange(this, text) } override fun createLiteralTextEscaper(): LiteralTextEscaper { return createSimple(this, false) } } fun createSimple(element: T, isOneLine: Boolean): LiteralTextEscaper { return object : LiteralTextEscaper(element) { override fun decode(rangeInsideHost: TextRange, outChars: StringBuilder): Boolean { outChars.append(rangeInsideHost.substring(myHost!!.text)) return true } override fun getOffsetInHost(offsetInDecoded: Int, rangeInsideHost: TextRange): Int { return rangeInsideHost.startOffset + offsetInDecoded } override fun isOneLine(): Boolean { return isOneLine } } }