diff --git a/xml/testFramework/src/com/intellij/xml/testFramework/XmlElementTypeServiceHelper.kt b/xml/testFramework/src/com/intellij/xml/testFramework/XmlElementTypeServiceHelper.kt
index c2cb492cc268..17e5e5d57302 100644
--- a/xml/testFramework/src/com/intellij/xml/testFramework/XmlElementTypeServiceHelper.kt
+++ b/xml/testFramework/src/com/intellij/xml/testFramework/XmlElementTypeServiceHelper.kt
@@ -2,10 +2,7 @@
package com.intellij.xml.testFramework
import com.intellij.html.embedding.BasicHtmlRawTextElementFactory
-import com.intellij.lang.html.BackendHtmlElementFactory
-import com.intellij.lang.html.BasicHtmlElementFactory
-import com.intellij.lang.xml.BackendXmlElementFactory
-import com.intellij.lang.xml.BasicXmlElementFactory
+import com.intellij.lang.html.HtmlRawTextElementFactoryImpl
import com.intellij.mock.MockApplication
import com.intellij.openapi.Disposable
@@ -15,21 +12,9 @@ object XmlElementTypeServiceHelper {
application: MockApplication,
testRootDisposable: Disposable,
) {
- application.registerService(
- BasicXmlElementFactory::class.java,
- BackendXmlElementFactory(),
- testRootDisposable,
- )
-
- application.registerService(
- BasicHtmlElementFactory::class.java,
- BackendHtmlElementFactory(),
- testRootDisposable,
- )
-
application.registerService(
BasicHtmlRawTextElementFactory::class.java,
- BackendHtmlElementFactory(),
+ HtmlRawTextElementFactoryImpl(),
testRootDisposable,
)
}
diff --git a/xml/xml-frontback-impl/src/com/intellij/lang/html/BasicHtmlElementFactory.kt b/xml/xml-frontback-impl/src/com/intellij/lang/html/BasicHtmlElementFactory.kt
deleted file mode 100644
index 66721bececd3..000000000000
--- a/xml/xml-frontback-impl/src/com/intellij/lang/html/BasicHtmlElementFactory.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.intellij.lang.html
-
-import com.intellij.lang.ASTNode
-import com.intellij.psi.FileViewProvider
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiFile
-
-interface BasicHtmlElementFactory {
- fun createFile(viewProvider: FileViewProvider): PsiFile
-
- fun createElement(node: ASTNode): PsiElement
-}
diff --git a/xml/xml-frontback-impl/src/com/intellij/lang/xml/BasicXmlElementFactory.kt b/xml/xml-frontback-impl/src/com/intellij/lang/xml/BasicXmlElementFactory.kt
deleted file mode 100644
index 81f9fd1eb5b5..000000000000
--- a/xml/xml-frontback-impl/src/com/intellij/lang/xml/BasicXmlElementFactory.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.intellij.lang.xml
-
-import com.intellij.lang.ASTNode
-import com.intellij.psi.FileViewProvider
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiFile
-import com.intellij.psi.tree.IElementType
-
-interface BasicXmlElementFactory {
- fun createFile(
- viewProvider: FileViewProvider,
- elementType: IElementType,
- ): PsiFile
-
- fun createElement(node: ASTNode): PsiElement
-}
diff --git a/xml/xml-psi-impl/resources/intellij.xml.psi.impl.xml b/xml/xml-psi-impl/resources/intellij.xml.psi.impl.xml
index 69b03fe1f6a0..5a7fa79e7778 100644
--- a/xml/xml-psi-impl/resources/intellij.xml.psi.impl.xml
+++ b/xml/xml-psi-impl/resources/intellij.xml.psi.impl.xml
@@ -31,12 +31,8 @@
-
-
+ serviceImplementation="com.intellij.lang.html.HtmlRawTextElementFactoryImpl"/>
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/dtd/DTDParserDefinition.kt b/xml/xml-psi-impl/src/com/intellij/lang/dtd/DTDParserDefinition.kt
index d43bbd8f4820..34623cd2ea2d 100644
--- a/xml/xml-psi-impl/src/com/intellij/lang/dtd/DTDParserDefinition.kt
+++ b/xml/xml-psi-impl/src/com/intellij/lang/dtd/DTDParserDefinition.kt
@@ -12,6 +12,7 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.source.parsing.xml.DtdParsing
+import com.intellij.psi.impl.source.xml.XmlFileImpl
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.xml.XmlElementType
import com.intellij.psi.xml.XmlEntityContextType
@@ -22,8 +23,7 @@ class DTDParserDefinition :
override fun spaceExistenceTypeBetweenTokens(left: ASTNode, right: ASTNode): SpaceRequirements =
LanguageUtil.canStickTokensTogetherByLexer(left, right, DtdLexer(false))
- override fun createFile(viewProvider: FileViewProvider): PsiFile =
- elementFactory.createFile(viewProvider, XmlElementType.DTD_FILE)
+ override fun createFile(viewProvider: FileViewProvider): PsiFile = XmlFileImpl(viewProvider, XmlElementType.DTD_FILE)
override fun createParser(project: Project?): PsiParser =
PsiParser { root, builder ->
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/html/BackendHtmlElementFactory.kt b/xml/xml-psi-impl/src/com/intellij/lang/html/BackendHtmlElementFactory.kt
deleted file mode 100644
index 2ae607b77c8d..000000000000
--- a/xml/xml-psi-impl/src/com/intellij/lang/html/BackendHtmlElementFactory.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.intellij.lang.html
-
-import com.intellij.html.embedding.BasicHtmlRawTextElementFactory
-import com.intellij.html.embedding.HtmlCustomEmbeddedContentTokenType
-import com.intellij.lang.ASTNode
-import com.intellij.psi.FileViewProvider
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiFile
-import com.intellij.psi.impl.source.html.HtmlEmbeddedContentImpl
-import com.intellij.psi.impl.source.html.HtmlFileImpl
-import com.intellij.psi.impl.source.html.HtmlRawTextImpl
-import com.intellij.psi.impl.source.xml.stub.XmlStubBasedElementType
-import com.intellij.psi.util.UnsupportedNodeElementTypeException
-import com.intellij.psi.xml.XmlElementType
-
-class BackendHtmlElementFactory:
- BasicHtmlElementFactory,
- BasicHtmlRawTextElementFactory {
-
- override fun createFile(viewProvider: FileViewProvider): PsiFile =
- HtmlFileImpl(viewProvider)
-
- override fun createElement(node: ASTNode): PsiElement {
- val elementType = node.elementType
-
- return when {
- elementType is XmlStubBasedElementType<*>
- -> elementType.createPsi(node)
-
- elementType is HtmlCustomEmbeddedContentTokenType
- -> elementType.createPsi(node)
-
- elementType === XmlElementType.HTML_EMBEDDED_CONTENT
- -> HtmlEmbeddedContentImpl(node)
-
- else -> throw UnsupportedNodeElementTypeException(node)
- }
- }
-
- override fun createRawTextElement(node: ASTNode): PsiElement =
- HtmlRawTextImpl(node)
-}
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/html/HTMLParserDefinition.kt b/xml/xml-psi-impl/src/com/intellij/lang/html/HTMLParserDefinition.kt
index 219ec98c2bec..345450253766 100644
--- a/xml/xml-psi-impl/src/com/intellij/lang/html/HTMLParserDefinition.kt
+++ b/xml/xml-psi-impl/src/com/intellij/lang/html/HTMLParserDefinition.kt
@@ -1,6 +1,9 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.lang.html
+import com.intellij.extapi.psi.ASTWrapperPsiElement
+import com.intellij.html.embedding.HtmlCustomEmbeddedContentTokenType
+import com.intellij.idea.AppModeAssertions
import com.intellij.lang.ASTNode
import com.intellij.lang.ParserDefinition
import com.intellij.lang.ParserDefinition.SpaceRequirements
@@ -8,23 +11,22 @@ import com.intellij.lang.PsiParser
import com.intellij.lang.xml.canStickTokensTogether
import com.intellij.lexer.HtmlLexer
import com.intellij.lexer.Lexer
-import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
+import com.intellij.psi.impl.source.html.HtmlEmbeddedContentImpl
+import com.intellij.psi.impl.source.html.HtmlFileImpl
+import com.intellij.psi.impl.source.xml.stub.XmlStubBasedElementType
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.tree.TokenSet
+import com.intellij.psi.util.UnsupportedNodeElementTypeException
import com.intellij.psi.xml.XmlElementType
import com.intellij.psi.xml.XmlTokenType
open class HTMLParserDefinition :
ParserDefinition {
- private val elementFactory: BasicHtmlElementFactory by lazy {
- service()
- }
-
override fun createLexer(project: Project?): Lexer =
HtmlLexer()
@@ -43,11 +45,23 @@ open class HTMLParserDefinition :
override fun createParser(project: Project?): PsiParser =
HTMLParser()
- override fun createElement(node: ASTNode): PsiElement =
- elementFactory.createElement(node)
+ override fun createElement(node: ASTNode): PsiElement {
+ val elementType = node.elementType
- override fun createFile(viewProvider: FileViewProvider): PsiFile =
- elementFactory.createFile(viewProvider)
+ return when {
+ elementType is XmlStubBasedElementType<*> -> elementType.createPsi(node)
+
+ elementType is HtmlCustomEmbeddedContentTokenType -> elementType.createPsi(node)
+
+ elementType === XmlElementType.HTML_EMBEDDED_CONTENT -> HtmlEmbeddedContentImpl(node)
+
+ AppModeAssertions.isFrontend() -> ASTWrapperPsiElement(node)
+
+ else -> throw UnsupportedNodeElementTypeException(node)
+ }
+ }
+
+ override fun createFile(viewProvider: FileViewProvider): PsiFile = HtmlFileImpl(viewProvider)
override fun spaceExistenceTypeBetweenTokens(left: ASTNode, right: ASTNode): SpaceRequirements =
canStickTokensTogether(left, right)
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/html/HtmlRawTextElementFactoryImpl.kt b/xml/xml-psi-impl/src/com/intellij/lang/html/HtmlRawTextElementFactoryImpl.kt
new file mode 100644
index 000000000000..fa3597106355
--- /dev/null
+++ b/xml/xml-psi-impl/src/com/intellij/lang/html/HtmlRawTextElementFactoryImpl.kt
@@ -0,0 +1,10 @@
+package com.intellij.lang.html
+
+import com.intellij.html.embedding.BasicHtmlRawTextElementFactory
+import com.intellij.lang.ASTNode
+import com.intellij.psi.PsiElement
+import com.intellij.psi.impl.source.html.HtmlRawTextImpl
+
+class HtmlRawTextElementFactoryImpl: BasicHtmlRawTextElementFactory {
+ override fun createRawTextElement(node: ASTNode): PsiElement = HtmlRawTextImpl(node)
+}
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/xhtml/XHTMLParserDefinition.kt b/xml/xml-psi-impl/src/com/intellij/lang/xhtml/XHTMLParserDefinition.kt
index a14271eba197..e64f0a724a03 100644
--- a/xml/xml-psi-impl/src/com/intellij/lang/xhtml/XHTMLParserDefinition.kt
+++ b/xml/xml-psi-impl/src/com/intellij/lang/xhtml/XHTMLParserDefinition.kt
@@ -7,6 +7,7 @@ import com.intellij.lexer.XHtmlLexer
import com.intellij.openapi.project.Project
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiFile
+import com.intellij.psi.impl.source.xml.XmlFileImpl
import com.intellij.psi.xml.XmlElementType
class XHTMLParserDefinition :
@@ -15,6 +16,7 @@ class XHTMLParserDefinition :
override fun createLexer(project: Project?): Lexer =
XHtmlLexer()
- override fun createFile(viewProvider: FileViewProvider): PsiFile =
- elementFactory.createFile(viewProvider, XmlElementType.XHTML_FILE)
+ override fun createFile(viewProvider: FileViewProvider): PsiFile {
+ return XmlFileImpl(viewProvider, XmlElementType.XHTML_FILE)
+ }
}
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/xml/BackendXmlElementFactory.kt b/xml/xml-psi-impl/src/com/intellij/lang/xml/BackendXmlElementFactory.kt
deleted file mode 100644
index bc46e9ad8a71..000000000000
--- a/xml/xml-psi-impl/src/com/intellij/lang/xml/BackendXmlElementFactory.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.intellij.lang.xml
-
-import com.intellij.lang.ASTNode
-import com.intellij.psi.FileViewProvider
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiFile
-import com.intellij.psi.impl.source.xml.XmlFileImpl
-import com.intellij.psi.impl.source.xml.stub.XmlStubBasedElementType
-import com.intellij.psi.tree.IElementType
-import com.intellij.psi.util.UnsupportedNodeElementTypeException
-
-class BackendXmlElementFactory :
- BasicXmlElementFactory {
-
- override fun createFile(
- viewProvider: FileViewProvider,
- elementType: IElementType,
- ): PsiFile =
- XmlFileImpl(viewProvider, elementType)
-
- override fun createElement(node: ASTNode): PsiElement {
- val elementType = node.elementType
-
- return when (elementType) {
- is XmlStubBasedElementType<*>,
- -> elementType.createPsi(node)
-
- else -> throw UnsupportedNodeElementTypeException(node)
- }
- }
-}
diff --git a/xml/xml-psi-impl/src/com/intellij/lang/xml/XMLParserDefinition.kt b/xml/xml-psi-impl/src/com/intellij/lang/xml/XMLParserDefinition.kt
index 831af20135c0..af453f06d560 100644
--- a/xml/xml-psi-impl/src/com/intellij/lang/xml/XMLParserDefinition.kt
+++ b/xml/xml-psi-impl/src/com/intellij/lang/xml/XMLParserDefinition.kt
@@ -1,30 +1,30 @@
-// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.lang.xml
+import com.intellij.extapi.psi.ASTWrapperPsiElement
+import com.intellij.idea.AppModeAssertions
import com.intellij.lang.ASTNode
import com.intellij.lang.ParserDefinition
import com.intellij.lang.ParserDefinition.SpaceRequirements
import com.intellij.lang.PsiParser
import com.intellij.lexer.Lexer
import com.intellij.lexer.XmlLexer
-import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.source.parsing.xml.XmlParser
+import com.intellij.psi.impl.source.xml.XmlFileImpl
+import com.intellij.psi.impl.source.xml.stub.XmlStubBasedElementType
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.tree.TokenSet
+import com.intellij.psi.util.UnsupportedNodeElementTypeException
import com.intellij.psi.xml.XmlElementType
import com.intellij.psi.xml.XmlTokenType
open class XMLParserDefinition :
ParserDefinition {
- protected val elementFactory: BasicXmlElementFactory by lazy {
- service()
- }
-
override fun createLexer(project: Project?): Lexer =
XmlLexer()
@@ -43,11 +43,18 @@ open class XMLParserDefinition :
override fun createParser(project: Project?): PsiParser =
XmlParser()
- override fun createElement(node: ASTNode): PsiElement =
- elementFactory.createElement(node)
+ override fun createElement(node: ASTNode): PsiElement {
+ val elementType = node.elementType
- override fun createFile(viewProvider: FileViewProvider): PsiFile =
- elementFactory.createFile(viewProvider, XmlElementType.XML_FILE)
+ return when {
+ elementType is XmlStubBasedElementType<*> -> elementType.createPsi(node)
+ AppModeAssertions.isFrontend() -> ASTWrapperPsiElement(node)
+
+ else -> throw UnsupportedNodeElementTypeException(node)
+ }
+ }
+
+ override fun createFile(viewProvider: FileViewProvider): PsiFile = XmlFileImpl(viewProvider, XmlElementType.XML_FILE)
override fun spaceExistenceTypeBetweenTokens(left: ASTNode, right: ASTNode): SpaceRequirements =
canStickTokensTogether(left, right)