下面列出了怎么用com.intellij.psi.StubBuilder的API类实例代码及写法,或者点击链接到github查看源代码。
@NotNull
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@NotNull
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
if (file instanceof RmlFile) {
return new RmlFileStub((RmlFile) file, ((RmlFile) file).isComponent());
} else if (file instanceof RmlInterfaceFile) {
return new RmlFileStub((RmlInterfaceFile) file, ((RmlInterfaceFile) file).isComponent());
}
return super.createStubForFile(file);
}
};
}
private List<CompositeElement> calcStubbedDescendants(StubBuilder builder) {
List<CompositeElement> result = new ArrayList<>();
result.add(this);
acceptTree(new RecursiveTreeElementWalkingVisitor() {
@Override
public void visitComposite(CompositeElement node) {
CompositeElement parent = node.getTreeParent();
if (parent != null && builder.skipChildProcessingWhenBuildingStubs(parent, node)) {
return;
}
IElementType type = node.getElementType();
if (type instanceof IStubElementType && ((IStubElementType)type).shouldCreateStub(node)) {
result.add(node);
}
super.visitNode(node);
}
});
return result;
}
@NotNull
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@NotNull
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
if (file instanceof NASMFile) {
return new NASMFileStub((NASMFile)file);
}
return super.createStubForFile(file);
}
};
}
@NotNull
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@NotNull
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
if (file instanceof OclFile) {
return new OclFileStub((OclFile) file);
}
return super.createStubForFile(file);
}
};
}
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
return new FileStub((SoyFile) file);
}
};
}
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@NotNull
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
return new FusionFileStub((FusionFile) file);
}
};
}
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
return new FileStub((ProtoPsiFileRoot) file);
}
};
}
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@NotNull
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
if (file instanceof BashFile) {
return new BashFileStubImpl((BashFile) file);
}
return super.createStubForFile(file);
}
};
}
@Override
public StubBuilder getBuilder() {
return new DefaultStubBuilder() {
@NotNull
@Override
protected StubElement createStubForFile(@NotNull PsiFile file) {
if (file instanceof HaskellFile) {
return new HaskellFileStub((HaskellFile)file);
}
return super.createStubForFile(file);
}
};
}
@Override
public StubBuilder getBuilder()
{
return new DefaultStubBuilder()
{
@Nonnull
@Override
protected StubElement createStubForFile(@Nonnull PsiFile file)
{
if(file instanceof CSharpFileImpl)
{
return new CSharpFileStub((CSharpFileImpl) file);
}
return super.createStubForFile(file);
}
@Override
public boolean skipChildProcessingWhenBuildingStubs(@Nonnull ASTNode parent, @Nonnull ASTNode node)
{
// skip any lazy parseable elements, like preprocessors or code blocks etc
if(node.getElementType() instanceof ILazyParseableElementType)
{
return true;
}
return false;
}
};
}
public StubBuilder getBuilder() {
return new DefaultStubBuilder();
}
@Nullable
public static Stub buildStubTree(final FileContent inputData) {
Stub data = inputData.getUserData(stubElementKey);
if (data != null) return data;
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (inputData) {
data = inputData.getUserData(stubElementKey);
if (data != null) return data;
final FileType fileType = inputData.getFileType();
final BinaryFileStubBuilder builder = BinaryFileStubBuilders.INSTANCE.forFileType(fileType);
if (builder != null) {
data = builder.buildStubTree(inputData);
if (data instanceof PsiFileStubImpl && !((PsiFileStubImpl)data).rootsAreSet()) {
((PsiFileStubImpl)data).setStubRoots(new PsiFileStub[]{(PsiFileStubImpl)data});
}
}
else {
CharSequence contentAsText = inputData.getContentAsText();
PsiDependentFileContent fileContent = (PsiDependentFileContent)inputData;
PsiFile psi = fileContent.getPsiFile();
final FileViewProvider viewProvider = psi.getViewProvider();
psi = viewProvider.getStubBindingRoot();
psi.putUserData(IndexingDataKeys.FILE_TEXT_CONTENT_KEY, contentAsText);
// if we load AST, it should be easily gc-able. See PsiFileImpl.createTreeElementPointer()
psi.getManager().startBatchFilesProcessingMode();
try {
IStubFileElementType stubFileElementType = ((PsiFileImpl)psi).getElementTypeForStubBuilder();
if (stubFileElementType != null) {
final StubBuilder stubBuilder = stubFileElementType.getBuilder();
if (stubBuilder instanceof LightStubBuilder) {
LightStubBuilder.FORCED_AST.set(fileContent.getLighterAST());
}
data = stubBuilder.buildStubTree(psi);
final List<Pair<IStubFileElementType, PsiFile>> stubbedRoots = getStubbedRoots(viewProvider);
final List<PsiFileStub> stubs = new ArrayList<>(stubbedRoots.size());
stubs.add((PsiFileStub)data);
for (Pair<IStubFileElementType, PsiFile> stubbedRoot : stubbedRoots) {
final PsiFile secondaryPsi = stubbedRoot.second;
if (psi == secondaryPsi) continue;
final StubBuilder stubbedRootBuilder = stubbedRoot.first.getBuilder();
if (stubbedRootBuilder instanceof LightStubBuilder) {
LightStubBuilder.FORCED_AST.set(new TreeBackedLighterAST(secondaryPsi.getNode()));
}
final StubElement element = stubbedRootBuilder.buildStubTree(secondaryPsi);
if (element instanceof PsiFileStub) {
stubs.add((PsiFileStub)element);
}
ensureNormalizedOrder(element);
}
final PsiFileStub[] stubsArray = stubs.toArray(PsiFileStub.EMPTY_ARRAY);
for (PsiFileStub stub : stubsArray) {
if (stub instanceof PsiFileStubImpl) {
((PsiFileStubImpl)stub).setStubRoots(stubsArray);
}
}
}
}
finally {
psi.putUserData(IndexingDataKeys.FILE_TEXT_CONTENT_KEY, null);
psi.getManager().finishBatchFilesProcessingMode();
}
}
ensureNormalizedOrder(data);
inputData.putUserData(stubElementKey, data);
return data;
}
}