IJPL-562 non-stub-element-type utility methods in StubBasedPsiElementBase

GitOrigin-RevId: 0bdae09a7e756af88b5364d9b926720d2e96c964
This commit is contained in:
Max Medvedev
2025-04-04 18:27:00 +02:00
committed by intellij-monorepo-bot
parent ee14516cf5
commit 917969bf26
3 changed files with 70 additions and 49 deletions

View File

@@ -2,7 +2,8 @@ c:com.intellij.extapi.psi.StubBasedPsiElementBase
- com.intellij.extapi.psi.ASTDelegatePsiElement
- *:<init>(com.intellij.psi.stubs.StubElement,com.intellij.psi.tree.IElementType):V
- *pf:getElementTypeImpl():com.intellij.psi.tree.IElementType
- *f:getNotNullStubOrPsiChild(com.intellij.psi.tree.IElementType,java.lang.Class):com.intellij.psi.PsiElement
- *f:getRequiredStubOrPsiChild(com.intellij.psi.tree.IElementType):com.intellij.psi.PsiElement
- *f:getRequiredStubOrPsiChild(com.intellij.psi.tree.IElementType,java.lang.Class):com.intellij.psi.PsiElement
- *f:getStubOrPsiChild(com.intellij.psi.tree.IElementType):com.intellij.psi.PsiElement
- *f:getStubOrPsiChild(com.intellij.psi.tree.IElementType,java.lang.Class):com.intellij.psi.PsiElement
*:com.intellij.ide.plugins.PluginEnabler

View File

@@ -280,12 +280,13 @@ c:com.intellij.extapi.psi.StubBasedPsiElementBase
- getParent():com.intellij.psi.PsiElement
- pf:getParentByStub():com.intellij.psi.PsiElement
- getProject():com.intellij.openapi.project.Project
- getRequiredStubOrPsiChild(com.intellij.psi.stubs.IStubElementType):com.intellij.psi.PsiElement
- f:getRequiredStubOrPsiChild(com.intellij.psi.stubs.IStubElementType):com.intellij.psi.PsiElement
- getStub():com.intellij.psi.stubs.StubElement
- getStubOrPsiChild(com.intellij.psi.stubs.IStubElementType):com.intellij.psi.PsiElement
- getStubOrPsiChildren(com.intellij.psi.stubs.IStubElementType,com.intellij.util.ArrayFactory):com.intellij.psi.PsiElement[]
- getStubOrPsiChildren(com.intellij.psi.stubs.IStubElementType,com.intellij.psi.PsiElement[]):com.intellij.psi.PsiElement[]
- getStubOrPsiChildren(com.intellij.psi.tree.IElementType,com.intellij.util.ArrayFactory):com.intellij.psi.PsiElement[]
- f:getStubOrPsiChildren(com.intellij.psi.stubs.IStubElementType,com.intellij.util.ArrayFactory):com.intellij.psi.PsiElement[]
- f:getStubOrPsiChildren(com.intellij.psi.stubs.IStubElementType,com.intellij.psi.PsiElement[]):com.intellij.psi.PsiElement[]
- f:getStubOrPsiChildren(com.intellij.psi.tree.IElementType,com.intellij.util.ArrayFactory):com.intellij.psi.PsiElement[]
- f:getStubOrPsiChildren(com.intellij.psi.tree.IElementType,com.intellij.psi.PsiElement[]):com.intellij.psi.PsiElement[]
- getStubOrPsiChildren(com.intellij.psi.tree.TokenSet,com.intellij.util.ArrayFactory):com.intellij.psi.PsiElement[]
- getStubOrPsiChildren(com.intellij.psi.tree.TokenSet,com.intellij.psi.PsiElement[]):com.intellij.psi.PsiElement[]
- p:getStubOrPsiParentOfType(java.lang.Class):com.intellij.psi.PsiElement

View File

@@ -374,7 +374,7 @@ public class StubBasedPsiElementBase<T extends StubElement> extends ASTDelegateP
}
/**
* @see #getNotNullStubOrPsiChild(IElementType, Class)
* @see #getRequiredStubOrPsiChild(IElementType, Class)
* @see #getStubOrPsiChild(IElementType, Class)
*
* @return a child of the specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
@@ -397,6 +397,21 @@ public class StubBasedPsiElementBase<T extends StubElement> extends ASTDelegateP
return null;
}
/**
* @return a not-null child of the specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
@ApiStatus.Experimental
public final @NotNull PsiElement getRequiredStubOrPsiChild(@NotNull IElementType elementType) {
PsiElement child = getStubOrPsiChild(elementType);
if (child == null) {
throw new IllegalStateException("Cannot find child of " + elementType + " in " + this);
}
return child;
}
/**
* @return a not-null child of the specified type and class, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
@ApiStatus.Experimental
public final <Psi extends PsiElement> @Nullable Psi getStubOrPsiChild(@NotNull IElementType elementType, @NotNull Class<Psi> psiClass) {
PsiElement child = getStubOrPsiChild(elementType);
@@ -404,48 +419,24 @@ public class StubBasedPsiElementBase<T extends StubElement> extends ASTDelegateP
}
@ApiStatus.Experimental
public final <Psi extends PsiElement> @NotNull Psi getNotNullStubOrPsiChild(@NotNull IElementType elementType,
@NotNull Class<Psi> psiClass) {
PsiElement child = getStubOrPsiChild(elementType);
if (child == null) {
throw new IllegalStateException("Cannot find child of " + elementType + " in " + this);
}
public final <Psi extends PsiElement> @NotNull Psi getRequiredStubOrPsiChild(@NotNull IElementType elementType,
@NotNull Class<Psi> psiClass) {
PsiElement child = getRequiredStubOrPsiChild(elementType);
return psiClass.cast(child);
}
/**
* @return a child of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
* @deprecated use {@link #getStubOrPsiChild(IElementType)} instead
*/
@Deprecated
public @Nullable <Psi extends PsiElement> Psi getStubOrPsiChild(@NotNull IStubElementType<? extends StubElement, Psi> elementType) {
//noinspection unchecked
return (Psi)getStubOrPsiChild((IElementType)elementType);
}
/**
* @return a not-null child of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
public @NotNull <S extends StubElement<?>, Psi extends PsiElement> Psi getRequiredStubOrPsiChild(@NotNull IStubElementType<S, Psi> elementType) {
Psi result = getStubOrPsiChild(elementType);
if (result == null) {
throw new AssertionError("Missing required child of type " + elementType + "; tree: " + DebugUtil.psiToString(this, true));
}
return result;
}
/**
* @return children of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
public <S extends StubElement<?>, Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IStubElementType<S, ? extends Psi> elementType, Psi @NotNull [] array) {
public final <Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IElementType elementType, @NotNull ArrayFactory<? extends Psi> f) {
T stub = getGreenStub();
if (stub != null) {
//noinspection unchecked
return (Psi[])stub.getChildrenByType(elementType, array);
return (Psi[])stub.getChildrenByType(elementType, f);
}
else {
final ASTNode[] nodes = SharedImplUtil.getChildrenOfType(getNode(), elementType);
Psi[] psiElements = ArrayUtil.newArray(ArrayUtil.getComponentType(array), nodes.length);
Psi[] psiElements = f.create(nodes.length);
for (int i = 0; i < nodes.length; i++) {
//noinspection unchecked
psiElements[i] = (Psi)nodes[i].getPsi();
@@ -455,27 +446,17 @@ public class StubBasedPsiElementBase<T extends StubElement> extends ASTDelegateP
}
/**
* @deprecated use {@link #getStubOrPsiChildren(IElementType, ArrayFactory)} instead
*
* @return children of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
@Deprecated
public <S extends StubElement<?>, Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IStubElementType<S, ? extends Psi> elementType, @NotNull ArrayFactory<? extends Psi> f) {
return getStubOrPsiChildren((IElementType)elementType, f);
}
/**
* @return children of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
public <S extends StubElement<?>, Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IElementType elementType, @NotNull ArrayFactory<? extends Psi> f) {
public final <Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IElementType elementType, Psi @NotNull [] array) {
T stub = getGreenStub();
if (stub != null) {
//noinspection unchecked
return (Psi[])stub.getChildrenByType(elementType, f);
return (Psi[])stub.getChildrenByType(elementType, array);
}
else {
final ASTNode[] nodes = SharedImplUtil.getChildrenOfType(getNode(), elementType);
Psi[] psiElements = f.create(nodes.length);
Psi[] psiElements = ArrayUtil.newArray(ArrayUtil.getComponentType(array), nodes.length);
for (int i = 0; i < nodes.length; i++) {
//noinspection unchecked
psiElements[i] = (Psi)nodes[i].getPsi();
@@ -542,4 +523,42 @@ public class StubBasedPsiElementBase<T extends StubElement> extends ASTDelegateP
copy.setSubstrateRef(SubstrateRef.createAstStrongRef(getNode()));
return copy;
}
/**
* @return a child of the specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
* @deprecated use {@link #getStubOrPsiChild(IElementType)} instead
*/
@Deprecated
public @Nullable <Psi extends PsiElement> Psi getStubOrPsiChild(@NotNull IStubElementType<? extends StubElement, Psi> elementType) {
//noinspection unchecked
return (Psi)getStubOrPsiChild((IElementType)elementType);
}
/**
* @return a not-null child of the specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
* @deprecated Use {@link #getRequiredStubOrPsiChild(IElementType)} or {@link #getRequiredStubOrPsiChild(IElementType, Class)}
*/
@Deprecated
public final @NotNull <S extends StubElement<?>, Psi extends PsiElement> Psi getRequiredStubOrPsiChild(@NotNull IStubElementType<S, Psi> elementType) {
return (Psi)getRequiredStubOrPsiChild((IElementType)elementType);
}
/**
* @deprecated use {@link #getStubOrPsiChildren(IElementType, ArrayFactory)} instead
*
* @return children of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
*/
@Deprecated
public final <S extends StubElement<?>, Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IStubElementType<S, ? extends Psi> elementType, @NotNull ArrayFactory<? extends Psi> f) {
return getStubOrPsiChildren((IElementType)elementType, f);
}
/**
* @return children of specified type, taken from stubs (if this element is currently stub-based) or AST (otherwise).
* @deprecated use {@link #getStubOrPsiChildren(IElementType, PsiElement[])}
*/
@Deprecated
public final <S extends StubElement<?>, Psi extends PsiElement> Psi @NotNull [] getStubOrPsiChildren(@NotNull IStubElementType<S, ? extends Psi> elementType, Psi @NotNull [] array) {
return getStubOrPsiChildren((IElementType)elementType, array);
}
}