IJPL-189507 Decouple TypeScript/JavaScript PSI from stubs: XML

GitOrigin-RevId: f798cc2b6cdb038751d9820bc509873105191a3c
This commit is contained in:
Vyacheslav Karpukhin
2025-06-13 18:56:30 +00:00
committed by intellij-monorepo-bot
parent 39084905e9
commit 76126e7179
25 changed files with 244 additions and 151 deletions
@@ -40,6 +40,9 @@
<lang.parserDefinition language="HTML" implementationClass="com.intellij.lang.html.HTMLParserDefinition"/>
<lang.parserDefinition language="XHTML" implementationClass="com.intellij.lang.xhtml.XHTMLParserDefinition"/>
<languageStubDefinition language="HTML" implementationClass="com.intellij.psi.xml.HtmlLanguageStubDefinition"/>
<stubElementRegistryExtension implementation="com.intellij.psi.xml.HtmlStubRegistryExtension"/>
<syntax.elementTypeConverter language="XML" implementationClass="com.intellij.psi.xml.XmlElementTypeConverterExtension"/>
<syntaxHighlighter key="IDEA_PROJECT" implementationClass="com.intellij.ide.highlighter.XmlFileHighlighter"/>
@@ -3,51 +3,18 @@ package com.intellij.psi.xml
import com.intellij.lang.Language
import com.intellij.lang.html.HTMLLanguage
import com.intellij.psi.stubs.PsiFileStub
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.tree.IStubFileElementType
import kotlin.concurrent.Volatile
open class HtmlFileElementType(
debugName: String,
language: Language,
) : IStubFileElementType<PsiFileStub<*>?>(debugName, language) {
) : IFileElementType(debugName, language) {
protected constructor() :
this("html", HTMLLanguage.INSTANCE)
override fun getStubVersion(): Int =
getHtmlStubVersion() + 3
companion object {
@JvmField
val INSTANCE: IFileElementType = HtmlFileElementType()
@Volatile
private var stubVersion = -1
@JvmStatic
fun getHtmlStubVersion(): Int {
val version = stubVersion
if (version != -1)
return version
val result = enumerate { it is IStubFileElementType<*> && isAcceptable(it) }
.sumOf { (it as IStubFileElementType<*>).stubVersion }
stubVersion = result
return result
}
@JvmStatic
fun isAcceptable(elementType: IElementType): Boolean {
val id = elementType.language.id
//hardcoded values as in BaseHtmlLexer
//js and css dialect uses the same stub id as the parent language
return id == "JavaScript" || id == "CSS"
}
}
}
@@ -0,0 +1,47 @@
// 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.psi.xml
import com.intellij.psi.StubBuilder
import com.intellij.psi.stubs.DefaultStubBuilder
import com.intellij.psi.stubs.LanguageStubDefinition
import com.intellij.psi.stubs.StubElementRegistryService
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.IElementType.enumerate
import com.intellij.psi.tree.IFileElementType
class HtmlLanguageStubDefinition : LanguageStubDefinition {
override val stubVersion: Int
get() = getHtmlStubVersion() + 3
override val builder: StubBuilder
get() = DefaultStubBuilder()
companion object {
@Volatile
private var stubVersion = -1
@JvmStatic
fun getHtmlStubVersion(): Int {
val version = stubVersion
if (version != -1)
return version
val result = enumerate { it is IFileElementType && isAcceptable(it) }
.mapNotNull { StubElementRegistryService.getInstance().getStubDescriptor(it.language)?.stubDefinition }
.sumOf { it.stubVersion }
stubVersion = result
return result
}
@JvmStatic
fun isAcceptable(elementType: IElementType): Boolean {
val id = elementType.language.id
//hardcoded values as in BaseHtmlLexer
//js and css dialect uses the same stub id as the parent language
return id == "JavaScript" || id == "CSS"
}
}
}
@@ -0,0 +1,36 @@
// 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.psi.xml
import com.intellij.psi.stubs.IndexSink
import com.intellij.psi.stubs.PsiFileStub
import com.intellij.psi.stubs.PsiFileStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubInputStream
import com.intellij.psi.stubs.StubOutputStream
import com.intellij.psi.stubs.StubRegistry
import com.intellij.psi.stubs.StubRegistryExtension
import com.intellij.psi.stubs.StubSerializer
import com.intellij.psi.stubs.StubSerializerId
import com.intellij.psi.xml.XmlElementType.HTML_FILE
class HtmlStubRegistryExtension : StubRegistryExtension {
override fun register(registry: StubRegistry) {
registry.registerStubSerializer(HTML_FILE, HtmlFileStubSerializer())
}
private class HtmlFileStubSerializer : StubSerializer<PsiFileStub<*>> {
override fun getExternalId(): String {
return StubSerializerId.DEFAULT_EXTERNAL_ID
}
override fun serialize(stub: PsiFileStub<*>, dataStream: StubOutputStream) {
}
override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): PsiFileStub<*> {
return PsiFileStubImpl(null)
}
override fun indexStub(stub: PsiFileStub<*>, sink: IndexSink) {
}
}
}
@@ -24,7 +24,7 @@ class BackendHtmlElementFactory:
val elementType = node.elementType
return when {
elementType is XmlStubBasedElementType<*, *>
elementType is XmlStubBasedElementType<*>
-> elementType.createPsi(node)
elementType is HtmlCustomEmbeddedContentTokenType
@@ -0,0 +1,17 @@
// 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.stubs
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.source.html.HtmlStubBasedTagImpl
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubElementFactory
import com.intellij.psi.tree.IElementType
open class HtmlStubBasedTagStubFactory(val elementType: IElementType) : StubElementFactory<XmlTagStubImpl, HtmlStubBasedTagImpl> {
override fun createStub(psi: HtmlStubBasedTagImpl, parentStub: StubElement<out PsiElement>?): XmlTagStubImpl =
XmlTagStubImpl(psi, parentStub, elementType)
override fun createPsi(stub: XmlTagStubImpl): HtmlStubBasedTagImpl =
HtmlStubBasedTagImpl(stub, elementType)
}
@@ -0,0 +1,17 @@
// 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.stubs
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubInputStream
import com.intellij.psi.stubs.StubOutputStream
import com.intellij.psi.tree.IElementType
open class HtmlStubBasedTagStubSerializer(elementType: IElementType) : XmlStubBasedStubSerializer<XmlTagStubImpl>(elementType) {
override fun serialize(stub: XmlTagStubImpl, dataStream: StubOutputStream) {
stub.serialize(dataStream)
}
override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): XmlTagStubImpl =
XmlTagStubImpl(parentStub, dataStream, elementType)
}
@@ -0,0 +1,17 @@
// 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.stubs
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.source.xml.XmlStubBasedAttribute
import com.intellij.psi.impl.source.xml.stub.XmlAttributeStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubElementFactory
import com.intellij.psi.tree.IElementType
open class XmlStubBasedAttributeStubFactory(val elementType: IElementType) : StubElementFactory<XmlAttributeStubImpl, XmlStubBasedAttribute> {
override fun createStub(psi: XmlStubBasedAttribute, parentStub: StubElement<out PsiElement>?): XmlAttributeStubImpl =
XmlAttributeStubImpl(psi, parentStub, elementType)
override fun createPsi(stub: XmlAttributeStubImpl): XmlStubBasedAttribute =
XmlStubBasedAttribute(stub, elementType)
}
@@ -0,0 +1,17 @@
// 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.stubs
import com.intellij.psi.impl.source.xml.stub.XmlAttributeStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubInputStream
import com.intellij.psi.stubs.StubOutputStream
import com.intellij.psi.tree.IElementType
open class XmlStubBasedAttributeStubSerializer(elementType: IElementType) : XmlStubBasedStubSerializer<XmlAttributeStubImpl>(elementType) {
override fun serialize(stub: XmlAttributeStubImpl, dataStream: StubOutputStream) {
stub.serialize(dataStream)
}
override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): XmlAttributeStubImpl =
XmlAttributeStubImpl(parentStub, dataStream, elementType)
}
@@ -0,0 +1,15 @@
// 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.stubs
import com.intellij.psi.stubs.IndexSink
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubSerializer
import com.intellij.psi.tree.IElementType
abstract class XmlStubBasedStubSerializer<T : StubElement<*>>(val elementType: IElementType) : StubSerializer<T> {
override fun getExternalId(): String =
elementType.toString()
override fun indexStub(stub: T, sink: IndexSink) {
}
}
@@ -0,0 +1,17 @@
// 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.stubs
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.source.xml.XmlStubBasedTag
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubElementFactory
import com.intellij.psi.tree.IElementType
open class XmlStubBasedTagStubFactory(val elementType: IElementType) : StubElementFactory<XmlTagStubImpl, XmlStubBasedTag> {
override fun createStub(psi: XmlStubBasedTag, parentStub: StubElement<out PsiElement>?): XmlTagStubImpl =
XmlTagStubImpl(psi, parentStub, elementType)
override fun createPsi(stub: XmlTagStubImpl): XmlStubBasedTag =
XmlStubBasedTag(stub, elementType)
}
@@ -0,0 +1,18 @@
// 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.stubs
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.stubs.StubInputStream
import com.intellij.psi.stubs.StubOutputStream
import com.intellij.psi.tree.IElementType
open class XmlStubBasedTagStubSerializer(elementType: IElementType) : XmlStubBasedStubSerializer<XmlTagStubImpl>(elementType) {
override fun serialize(stub: XmlTagStubImpl, dataStream: StubOutputStream) {
stub.serialize(dataStream)
}
override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): XmlTagStubImpl {
return XmlTagStubImpl(parentStub, dataStream, elementType)
}
}
@@ -22,7 +22,7 @@ class BackendXmlElementFactory :
val elementType = node.elementType
return when (elementType) {
is XmlStubBasedElementType<*, *>,
is XmlStubBasedElementType<*>,
-> elementType.createPsi(node)
else -> throw UnsupportedNodeElementTypeException(node)
@@ -4,47 +4,20 @@ package com.intellij.psi.impl.source.html;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.psi.impl.source.xml.stub.XmlStubBasedElementType;
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.psi.tree.ICompositeElementType;
import com.intellij.psi.xml.IXmlTagElementType;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
public class HtmlStubBasedTagElementType
extends XmlStubBasedElementType<XmlTagStubImpl, HtmlStubBasedTagImpl> implements ICompositeElementType, IXmlTagElementType {
extends XmlStubBasedElementType<HtmlStubBasedTagImpl> implements ICompositeElementType, IXmlTagElementType {
public HtmlStubBasedTagElementType(@NotNull String debugName,
@NotNull Language language) {
super(debugName, language);
}
@Override
public void serialize(@NotNull XmlTagStubImpl stub, @NotNull StubOutputStream dataStream) throws IOException {
stub.serialize(dataStream);
}
@Override
public @NotNull XmlTagStubImpl deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
return new XmlTagStubImpl(parentStub, dataStream, this);
}
@Override
public @NotNull HtmlStubBasedTagImpl createPsi(@NotNull XmlTagStubImpl stub) {
return new HtmlStubBasedTagImpl(stub, this);
}
@Override
public @NotNull HtmlStubBasedTagImpl createPsi(@NotNull ASTNode node) {
return new HtmlStubBasedTagImpl(node);
}
@Override
public @NotNull XmlTagStubImpl createStub(@NotNull HtmlStubBasedTagImpl psi, StubElement parentStub) {
return new XmlTagStubImpl(psi, parentStub, this);
}
}
@@ -7,7 +7,7 @@ import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.impl.source.xml.XmlStubBasedTag;
import com.intellij.psi.impl.source.xml.XmlTagDelegate;
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlTag;
import com.intellij.xml.util.XmlUtil;
@@ -17,7 +17,7 @@ import org.jetbrains.annotations.Nullable;
public class HtmlStubBasedTagImpl extends XmlStubBasedTag implements HtmlTag {
public HtmlStubBasedTagImpl(@NotNull XmlTagStubImpl stub,
@NotNull IStubElementType<? extends XmlTagStubImpl, ? extends HtmlStubBasedTagImpl> nodeType) {
@NotNull IElementType nodeType) {
super(stub, nodeType);
}
@@ -3,14 +3,14 @@ package com.intellij.psi.impl.source.xml;
import com.intellij.lang.ASTNode;
import com.intellij.psi.impl.source.xml.stub.XmlAttributeStubImpl;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class XmlStubBasedAttribute extends XmlStubBasedAttributeBase<XmlAttributeStubImpl> {
public XmlStubBasedAttribute(@NotNull XmlAttributeStubImpl stub,
@NotNull IStubElementType<? extends XmlAttributeStubImpl, ? extends XmlStubBasedAttribute> nodeType) {
@NotNull IElementType nodeType) {
super(stub, nodeType);
}
@@ -5,8 +5,8 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.xml.stub.XmlAttributeStub;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.PsiFileStub;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.xml.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
@@ -26,7 +26,7 @@ public class XmlStubBasedAttributeBase<StubT extends XmlAttributeStub<?>>
private volatile @Nullable XmlAttributeDelegate myImpl;
public XmlStubBasedAttributeBase(@NotNull StubT stub,
@NotNull IStubElementType<? extends StubT, ? extends XmlAttribute> nodeType) {
@NotNull IElementType nodeType) {
super(stub, nodeType);
}
@@ -47,6 +47,11 @@ public class XmlStubBasedAttributeBase<StubT extends XmlAttributeStub<?>>
return new XmlStubBasedAttributeBaseDelegate();
}
@Override
public IElementType getIElementType() {
return getElementTypeImpl();
}
@Override
public XmlAttributeValue getValueElement() {
return (XmlAttributeValue)XmlChildRole.ATTRIBUTE_VALUE_FINDER.findChild(this.getNode());
@@ -8,8 +8,8 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlTag;
@@ -30,7 +30,7 @@ import java.util.List;
public abstract class XmlStubBasedElement<T extends StubElement<?>> extends StubBasedPsiElementBase<T> implements XmlElement {
XmlStubBasedElement(@NotNull T stub,
@NotNull IStubElementType nodeType) {
@NotNull IElementType nodeType) {
super(stub, nodeType);
}
@@ -123,6 +123,6 @@ public abstract class XmlStubBasedElement<T extends StubElement<?>> extends Stub
@Override
public String toString() {
return "PsiElement" + "(" + getElementType() + ")";
return "PsiElement" + "(" + getElementTypeImpl() + ")";
}
}
@@ -3,13 +3,13 @@ package com.intellij.psi.impl.source.xml;
import com.intellij.lang.ASTNode;
import com.intellij.psi.impl.source.xml.stub.XmlTagStubImpl;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
public class XmlStubBasedTag extends XmlStubBasedTagBase<XmlTagStubImpl> {
public XmlStubBasedTag(@NotNull XmlTagStubImpl stub,
@NotNull IStubElementType<? extends XmlTagStubImpl, ? extends XmlStubBasedTag> nodeType) {
@NotNull IElementType nodeType) {
super(stub, nodeType);
}
@@ -7,8 +7,8 @@ import com.intellij.psi.impl.meta.MetaRegistry;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.impl.source.xml.stub.XmlTagStub;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.PsiFileStub;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.CachedValueProvider.Result;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
@@ -39,7 +39,7 @@ public class XmlStubBasedTagBase<StubT extends XmlTagStub<?>>
private volatile XmlTagValue myValue;
private volatile XmlAttribute[] myAttributes;
XmlStubBasedTagBase(@NotNull StubT stub, @NotNull IStubElementType nodeType) {
XmlStubBasedTagBase(@NotNull StubT stub, @NotNull IElementType nodeType) {
super(stub, nodeType);
}
@@ -282,6 +282,11 @@ public class XmlStubBasedTagBase<StubT extends XmlTagStub<?>>
}
}
@Override
public IElementType getIElementType() {
return getElementTypeImpl();
}
@Override
public String toString() {
return "XmlTag:" + getName();
@@ -3,6 +3,7 @@ package com.intellij.psi.impl.source.xml.stub;
import com.intellij.psi.impl.source.xml.XmlStubBasedAttribute;
import com.intellij.psi.stubs.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -18,7 +19,7 @@ public class XmlAttributeStubImpl extends StubBase<XmlStubBasedAttribute> implem
public XmlAttributeStubImpl(@Nullable StubElement<?> parent,
@NotNull StubInputStream dataStream,
@NotNull IStubElementType<? extends XmlAttributeStubImpl, ? extends XmlStubBasedAttribute> elementType)
@NotNull IElementType elementType)
throws IOException {
super(parent, elementType);
name = notNull(StringRef.toString(dataStream.readName()), "");
@@ -27,13 +28,13 @@ public class XmlAttributeStubImpl extends StubBase<XmlStubBasedAttribute> implem
public XmlAttributeStubImpl(@NotNull XmlStubBasedAttribute psi,
@Nullable StubElement<?> parent,
@NotNull IStubElementType<? extends XmlAttributeStubImpl, ? extends XmlStubBasedAttribute> elementType) {
@NotNull IElementType elementType) {
super(parent, elementType);
name = psi.getName();
value = psi.getValue();
}
void serialize(StubOutputStream stream) throws IOException {
public void serialize(StubOutputStream stream) throws IOException {
stream.writeName(name);
stream.writeName(value);
}
@@ -4,17 +4,12 @@ package com.intellij.psi.impl.source.xml.stub;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.psi.impl.source.xml.XmlStubBasedAttribute;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.psi.tree.ICompositeElementType;
import com.intellij.psi.xml.IXmlAttributeElementType;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
public class XmlStubBasedAttributeElementType
extends XmlStubBasedElementType<XmlAttributeStubImpl, XmlStubBasedAttribute> implements ICompositeElementType, IXmlAttributeElementType {
extends XmlStubBasedElementType<XmlStubBasedAttribute> implements ICompositeElementType, IXmlAttributeElementType {
public XmlStubBasedAttributeElementType(@NotNull String debugName,
@@ -22,29 +17,8 @@ public class XmlStubBasedAttributeElementType
super(debugName, language);
}
@Override
public void serialize(@NotNull XmlAttributeStubImpl stub, @NotNull StubOutputStream dataStream) throws IOException {
stub.serialize(dataStream);
}
@Override
public @NotNull XmlAttributeStubImpl deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
return new XmlAttributeStubImpl(parentStub, dataStream, this);
}
@Override
public @NotNull XmlStubBasedAttribute createPsi(@NotNull XmlAttributeStubImpl stub) {
return new XmlStubBasedAttribute(stub, this);
}
@Override
public @NotNull XmlStubBasedAttribute createPsi(@NotNull ASTNode node) {
return new XmlStubBasedAttribute(node);
}
@Override
public @NotNull XmlAttributeStubImpl createStub(@NotNull XmlStubBasedAttribute psi, StubElement parentStub) {
return new XmlAttributeStubImpl(psi, parentStub, this);
}
}
@@ -6,16 +6,14 @@ import com.intellij.lang.Language;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.IndexSink;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.ICompositeElementType;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import java.util.Locale;
public abstract class XmlStubBasedElementType<StubT extends StubElement<?>, PsiT extends PsiElement>
extends IStubElementType<StubT, PsiT> implements ICompositeElementType {
public abstract class XmlStubBasedElementType<PsiT extends PsiElement>
extends IElementType implements ICompositeElementType {
private String externalId = null;
@@ -25,22 +23,13 @@ public abstract class XmlStubBasedElementType<StubT extends StubElement<?>, PsiT
}
@Override
public @NotNull String getExternalId() {
public @NotNull String toString() {
if (externalId == null) {
externalId = (getLanguage() == XMLLanguage.INSTANCE ? "" : getLanguage().getID().toUpperCase(Locale.ENGLISH) + ":") + getDebugName();
}
return externalId;
}
@Override
public String toString() {
return getExternalId();
}
@Override
public void indexStub(@NotNull StubT stub, @NotNull IndexSink sink) {
}
public abstract @NotNull PsiT createPsi(@NotNull ASTNode node);
@Override
@@ -4,46 +4,20 @@ package com.intellij.psi.impl.source.xml.stub;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.psi.impl.source.xml.XmlStubBasedTag;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.psi.tree.ICompositeElementType;
import com.intellij.psi.xml.IXmlTagElementType;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
public class XmlStubBasedTagElementType
extends XmlStubBasedElementType<XmlTagStubImpl, XmlStubBasedTag> implements ICompositeElementType, IXmlTagElementType {
extends XmlStubBasedElementType<XmlStubBasedTag> implements ICompositeElementType, IXmlTagElementType {
public XmlStubBasedTagElementType(@NotNull String debugName,
@NotNull Language language) {
super(debugName, language);
}
@Override
public void serialize(@NotNull XmlTagStubImpl stub, @NotNull StubOutputStream dataStream) throws IOException {
stub.serialize(dataStream);
}
@Override
public @NotNull XmlTagStubImpl deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
return new XmlTagStubImpl(parentStub, dataStream, this);
}
@Override
public @NotNull XmlStubBasedTag createPsi(@NotNull XmlTagStubImpl stub) {
return new XmlStubBasedTag(stub, this);
}
@Override
public @NotNull XmlStubBasedTag createPsi(@NotNull ASTNode node) {
return new XmlStubBasedTag(node);
}
@Override
public @NotNull XmlTagStubImpl createStub(@NotNull XmlStubBasedTag psi, StubElement parentStub) {
return new XmlTagStubImpl(psi, parentStub, this);
}
}
@@ -3,6 +3,7 @@ package com.intellij.psi.impl.source.xml.stub;
import com.intellij.psi.impl.source.xml.XmlStubBasedTag;
import com.intellij.psi.stubs.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -17,7 +18,7 @@ public class XmlTagStubImpl extends StubBase<XmlStubBasedTag> implements XmlTagS
public XmlTagStubImpl(@Nullable StubElement<?> parent,
@NotNull StubInputStream dataStream,
@NotNull IStubElementType<? extends XmlTagStubImpl, ? extends XmlStubBasedTag> elementType)
@NotNull IElementType elementType)
throws IOException {
super(parent, elementType);
name = notNull(StringRef.toString(dataStream.readName()), "");
@@ -25,7 +26,7 @@ public class XmlTagStubImpl extends StubBase<XmlStubBasedTag> implements XmlTagS
public XmlTagStubImpl(@NotNull XmlStubBasedTag psi,
@Nullable StubElement<?> parent,
@NotNull IStubElementType<? extends XmlTagStubImpl, ? extends XmlStubBasedTag> elementType) {
@NotNull IElementType elementType) {
super(parent, elementType);
name = psi.getName();
}