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)