*/
package com.intellij.psi.impl.compiled;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiInvalidElementAccessException;
-import com.intellij.psi.PsiManager;
+import com.intellij.psi.*;
+import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.PsiFileStub;
import com.intellij.psi.stubs.StubElement;
import com.intellij.util.ArrayUtil;
import java.util.List;
-public abstract class ClsRepositoryPsiElement<T extends StubElement> extends ClsElementImpl {
+public abstract class ClsRepositoryPsiElement<T extends StubElement> extends ClsElementImpl implements StubBasedPsiElement<T> {
private final T myStub;
protected ClsRepositoryPsiElement(final T stub) {
myStub = stub;
}
+ public IStubElementType getElementType() {
+ return myStub.getStubType();
+ }
+
public PsiElement getParent() {
return myStub.getParentStub().getPsi();
}
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.impl.light.LightElement;
import com.intellij.psi.impl.source.PsiFileImpl;
+import com.intellij.psi.impl.source.PsiFileWithStubSupport;
import com.intellij.psi.stubs.StubBase;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubTree;
public abstract int getEndOffset();
public static PsiAnchor create(final PsiElement element) {
- if (element instanceof PsiCompiledElement || element instanceof PsiFile) {
+ if (element instanceof PsiFile) {
return new HardReference(element);
}
return new HardReference(element);
}
- if (element instanceof StubBasedPsiElement && element.isPhysical() && ((PsiFileImpl)file).getContentElementType() instanceof IStubFileElementType) {
+ if (element instanceof StubBasedPsiElement && element.isPhysical() && (element instanceof PsiCompiledElement || ((PsiFileImpl)file).getContentElementType() instanceof IStubFileElementType)) {
final StubBasedPsiElement elt = (StubBasedPsiElement)element;
if (elt.getStub() != null || elt.getElementType().shouldCreateStub(element.getNode())) {
return new StubIndexReference(file, calcStubIndex((StubBasedPsiElement)element));
public PsiElement retrieve() {
return ApplicationManager.getApplication().runReadAction(new NullableComputable<PsiElement>() {
public PsiElement compute() {
- PsiFileImpl fileImpl = (PsiFileImpl)myFile;
+ PsiFileWithStubSupport fileImpl = (PsiFileWithStubSupport)myFile;
StubTree tree = fileImpl.getStubTree();
boolean foreign = (tree == null);
if (foreign) {
- tree = fileImpl.calcStubTree();
+ if (fileImpl instanceof PsiFileImpl) {
+ tree = ((PsiFileImpl)fileImpl).calcStubTree();
+ }
+ else {
+ return null;
+ }
}
StubElement stub = tree.getPlainList().get(myIndex);