下面列出了怎么用com.intellij.psi.impl.source.SourceTreeToPsiMap的API类实例代码及写法,或者点击链接到github查看源代码。
private void init(final ASTNode child) {
if (child == null) {
return;
}
ASTNode treePrev = child.getTreePrev();
while (treePrev != null && SpacingUtil.isWhiteSpace(treePrev)) {
treePrev = treePrev.getTreePrev();
}
if (treePrev == null) {
init(child.getTreeParent());
} else {
myChild2 = child;
myChild1 = treePrev;
final CompositeElement parent = (CompositeElement) treePrev.getTreeParent();
myParent = SourceTreeToPsiMap.treeElementToPsi(parent);
}
}
@Override
@Nonnull
public PsiElement reformat(@Nonnull PsiElement element, boolean canChangeWhiteSpacesOnly) throws IncorrectOperationException {
CheckUtil.checkWritable(element);
if (!SourceTreeToPsiMap.hasTreeElement(element)) {
return element;
}
ASTNode treeElement = element.getNode();
final PsiFile file = element.getContainingFile();
if (ExternalFormatProcessor.useExternalFormatter(file)) {
return ExternalFormatProcessor.formatElement(element, element.getTextRange(), canChangeWhiteSpacesOnly);
}
final PsiElement formatted = new CodeFormatterFacade(getSettings(file), element.getLanguage(), canChangeWhiteSpacesOnly).processElement(treeElement).getPsi();
if (!canChangeWhiteSpacesOnly) {
return postProcessElement(file, formatted);
}
return formatted;
}
private static PsiElement reformatRangeImpl(final @Nonnull PsiElement element, final int startOffset, final int endOffset, boolean canChangeWhiteSpacesOnly) throws IncorrectOperationException {
LOG.assertTrue(element.isValid());
CheckUtil.checkWritable(element);
if (!SourceTreeToPsiMap.hasTreeElement(element)) {
return element;
}
ASTNode treeElement = element.getNode();
final PsiFile file = element.getContainingFile();
if (ExternalFormatProcessor.useExternalFormatter(file)) {
return ExternalFormatProcessor.formatElement(element, TextRange.create(startOffset, endOffset), canChangeWhiteSpacesOnly);
}
final CodeFormatterFacade codeFormatter = new CodeFormatterFacade(getSettings(file), element.getLanguage());
final PsiElement formatted = codeFormatter.processRange(treeElement, startOffset, endOffset).getPsi();
return canChangeWhiteSpacesOnly ? formatted : postProcessElement(file, formatted);
}
@Nonnull
private static Pair<PsiElement, CharTable> doFindWhiteSpaceNode(@Nonnull PsiFile file, int offset) {
ASTNode astNode = SourceTreeToPsiMap.psiElementToTree(file);
if (!(astNode instanceof FileElement)) {
return new Pair<>(null, null);
}
PsiElement elementAt = InjectedLanguageManager.getInstance(file.getProject()).findInjectedElementAt(file, offset);
final CharTable charTable = ((FileElement)astNode).getCharTable();
if (elementAt == null) {
elementAt = findElementInTreeWithFormatterEnabled(file, offset);
}
if (elementAt == null) {
return new Pair<>(null, charTable);
}
ASTNode node = elementAt.getNode();
if (node == null || node.getElementType() != TokenType.WHITE_SPACE) {
return new Pair<>(null, charTable);
}
return Pair.create(elementAt, charTable);
}
private static TextRange getSignificantRange(final PsiFile file, final int offset) {
final ASTNode elementAtOffset = SourceTreeToPsiMap.psiElementToTree(CodeStyleManagerImpl.findElementInTreeWithFormatterEnabled(file, offset));
if (elementAtOffset == null) {
int significantRangeStart = CharArrayUtil.shiftBackward(file.getText(), offset - 1, "\n\r\t ");
return new TextRange(Math.max(significantRangeStart, 0), offset);
}
final FormattingModelBuilder builder = LanguageFormatting.INSTANCE.forContext(file);
if (builder != null) {
final TextRange textRange = builder.getRangeAffectingIndent(file, offset, elementAtOffset);
if (textRange != null) {
return textRange;
}
}
final TextRange elementRange = elementAtOffset.getTextRange();
if (isWhiteSpace(elementAtOffset)) {
return extendRangeAtStartOffset(file, elementRange);
}
return elementRange;
}
@Nullable
@Override
public TreeElement generateTreeFor(PsiElement original, CharTable table, PsiManager manager) {
TreeElement result = null;
if (original instanceof SqliteMagicLightMethodBuilder) {
result = ChangeUtil.copyElement((TreeElement) SourceTreeToPsiMap.psiElementToTree(original), table);
}
return result;
}
@Override
public PsiElement setName(@NotNull String newName) throws IncorrectOperationException {
final GraphQLIdentifier nameIdentifier = getNameIdentifier();
if (nameIdentifier != null) {
final LeafElement renamedLeaf = Factory.createSingleLeafElement(GraphQLElementTypes.NAME, newName, null, nameIdentifier.getManager());
final PsiElement renamedPsiElement = SourceTreeToPsiMap.treeElementToPsi(renamedLeaf);
if (renamedPsiElement != null) {
nameIdentifier.getFirstChild().replace(renamedPsiElement);
}
}
return this;
}
@Override
public GraphQLIdentifierImpl handleContentChange(@NotNull GraphQLIdentifierImpl element, @NotNull TextRange range, String newContent) throws IncorrectOperationException {
// replace the NAME leaf element inside the identifier
final LeafElement renamedLeaf = Factory.createSingleLeafElement(GraphQLElementTypes.NAME, newContent, null, element.getManager());
final PsiElement renamedPsiElement = SourceTreeToPsiMap.treeElementToPsi(renamedLeaf);
if (renamedPsiElement != null) {
element.getFirstChild().replace(renamedPsiElement);
}
return element;
}
@Override
public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
final PsiElement nameIdentifier = getNameIdentifier();
if(nameIdentifier != null) {
final LeafElement renamedLeaf = Factory.createSingleLeafElement(JSGraphQLEndpointTokenTypes.STRING_BODY, name, null, getManager());
final PsiElement renamedPsiElement = SourceTreeToPsiMap.treeElementToPsi(renamedLeaf);
if (renamedPsiElement != null) {
nameIdentifier.replace(renamedPsiElement);
}
}
return this;
}
/**
* Renames an identifier, e.g. during a refactoring
*/
public static PsiElement renameIdentifier(PsiNameIdentifierOwner owner, String name) throws IncorrectOperationException {
final PsiElement identifier = owner.getNameIdentifier();
if (identifier == null) {
throw new IncorrectOperationException();
}
final LeafElement renamedLeaf = Factory.createSingleLeafElement(JSGraphQLEndpointTokenTypes.IDENTIFIER, name, null, identifier.getManager());
final PsiElement renamedPsiElement = SourceTreeToPsiMap.treeElementToPsi(renamedLeaf);
if (renamedPsiElement != null) {
identifier.replace(renamedPsiElement);
}
return owner;
}
@Nullable
public TreeElement generateTreeFor(PsiElement original, CharTable table, PsiManager manager) {
TreeElement result = null;
if (original instanceof LombokLightMethodBuilder) {
result = ChangeUtil.copyElement((TreeElement) SourceTreeToPsiMap.psiElementToTree(original), table);
}
return result;
}
@SuppressWarnings("SimplifiableIfStatement")
@Override
protected boolean isRegionCollapsedByDefault(@NotNull ASTNode node) {
final PsiElement element = SourceTreeToPsiMap.treeElementToPsi(node);
if (element == null) return false;
ANTLRv4FoldingSettings settings = ANTLRv4FoldingSettings.getInstance();
if (RULE_BLOCKS.contains(node.getElementType())) return settings.isCollapseRuleBlocks();
if (node.getElementType() == TOKENSSPEC) return settings.isCollapseTokens();
if (element instanceof AtAction) return settings.isCollapseActions();
if (element instanceof ANTLRv4FileRoot) {
return settings.isCollapseFileHeader();
}
if (node.getElementType() == DOC_COMMENT_TOKEN) {
PsiElement parent = element.getParent();
if (parent instanceof ANTLRv4FileRoot) {
PsiElement firstChild = parent.getFirstChild();
if (firstChild instanceof PsiWhiteSpace) {
firstChild = firstChild.getNextSibling();
}
if (element.equals(firstChild)) {
return settings.isCollapseFileHeader();
}
}
return settings.isCollapseDocComments();
}
if (isComment(element)) {
return settings.isCollapseComments();
}
return false;
}
/**
* @return the parent of this element. Uses stub hierarchy if possible, but might cause an expensive switch to AST
* if the parent stub doesn't correspond to the parent AST node.
*/
@Override
public PsiElement getParent() {
T stub = getGreenStub();
if (stub != null && !((ObjectStubBase<?>)stub).isDangling()) {
return stub.getParentStub().getPsi();
}
return SourceTreeToPsiMap.treeElementToPsi(getNode().getTreeParent());
}
private PsiElement addInnerBefore(final PsiElement element, final PsiElement anchor) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(element);
ASTNode treeElement = addInternal(elementCopy, elementCopy, SourceTreeToPsiMap.psiElementToTree(anchor), Boolean.TRUE);
if (treeElement != null) {
if (treeElement instanceof TreeElement) {
return ChangeUtil.decodeInformation((TreeElement) treeElement).getPsi();
}
return treeElement.getPsi();
}
throw new IncorrectOperationException("Element cannot be added");
}
@Override
public PsiElement addAfter(@Nonnull PsiElement element, PsiElement anchor) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(element);
ASTNode treeElement = addInternal(elementCopy, elementCopy, SourceTreeToPsiMap.psiElementToTree(anchor), Boolean.FALSE);
if (treeElement instanceof TreeElement) {
return ChangeUtil.decodeInformation((TreeElement) treeElement).getPsi();
}
return treeElement.getPsi();
}
@Override
public void deleteChildRange(final PsiElement first, final PsiElement last) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
ASTNode firstElement = SourceTreeToPsiMap.psiElementToTree(first);
ASTNode lastElement = SourceTreeToPsiMap.psiElementToTree(last);
LOG.assertTrue(firstElement.getTreeParent() == getNode());
LOG.assertTrue(lastElement.getTreeParent() == getNode());
CodeEditUtil.removeChildren(getNode(), firstElement, lastElement);
}
@Override
public PsiElement replace(@Nonnull final PsiElement newElement) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(newElement);
if (getParent() instanceof ASTDelegatePsiElement) {
final ASTDelegatePsiElement parentElement = (ASTDelegatePsiElement)getParent();
parentElement.replaceChildInternal(this, elementCopy);
}
else {
CodeEditUtil.replaceChild(getParent().getNode(), getNode(), elementCopy);
}
elementCopy = ChangeUtil.decodeInformation(elementCopy);
return SourceTreeToPsiMap.treeElementToPsi(elementCopy);
}
private PsiComment findPsiCommentChild(PsiFile aFile) {
PsiElement[] children = aFile.getChildren();
for (PsiElement aChildren : children) {
if (aChildren instanceof PsiComment) {
PsiComment comment = (PsiComment)aChildren;
DummyHolderFactory.createHolder(myManager, (TreeElement)SourceTreeToPsiMap.psiElementToTree(comment), null);
return comment;
}
}
throw new IncorrectOperationException("Incorrect comment \"" + aFile.getText() + "\".");
}
public static PsiElement addRange(PsiElement thisElement,
PsiElement first,
PsiElement last,
ASTNode anchor,
Boolean before) throws IncorrectOperationException {
CheckUtil.checkWritable(thisElement);
final CharTable table = findCharTableByTree(SourceTreeToPsiMap.psiElementToTree(thisElement));
TreeElement copyFirst = null;
ASTNode copyLast = null;
ASTNode next = SourceTreeToPsiMap.psiElementToTree(last).getTreeNext();
ASTNode parent = null;
for (ASTNode element = SourceTreeToPsiMap.psiElementToTree(first); element != next; element = element.getTreeNext()) {
TreeElement elementCopy = ChangeUtil.copyElement((TreeElement)element, table);
if (element == first.getNode()) {
copyFirst = elementCopy;
}
if (element == last.getNode()) {
copyLast = elementCopy;
}
if (parent == null) {
parent = elementCopy.getTreeParent();
}
else {
if(elementCopy.getElementType() == TokenType.WHITE_SPACE)
CodeEditUtil.setNodeGenerated(elementCopy, true);
parent.addChild(elementCopy, null);
}
}
if (copyFirst == null) return null;
copyFirst = ((CompositeElement)SourceTreeToPsiMap.psiElementToTree(thisElement)).addInternal(copyFirst, copyLast, anchor, before);
for (TreeElement element = copyFirst; element != null; element = element.getTreeNext()) {
element = ChangeUtil.decodeInformation(element);
if (element.getTreePrev() == null) {
copyFirst = element;
}
}
return SourceTreeToPsiMap.treeElementToPsi(copyFirst);
}
public static PsiElement doReplace(PsiElement psiElement, TreeElement treeElement, PsiElement newElement) {
CompositeElement treeParent = treeElement.getTreeParent();
LOG.assertTrue(treeParent != null);
CheckUtil.checkWritable(psiElement);
TreeElement elementCopy = ChangeUtil.copyToElement(newElement);
treeParent.replaceChildInternal(treeElement, elementCopy);
elementCopy = ChangeUtil.decodeInformation(elementCopy);
final PsiElement result = SourceTreeToPsiMap.treeElementToPsi(elementCopy);
treeElement.invalidate();
return result;
}
@Override
public PsiElement addAfter(@Nonnull PsiElement element, PsiElement anchor) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(element);
TreeElement treeElement = addInternal(elementCopy, elementCopy, SourceTreeToPsiMap.psiElementToTree(anchor), Boolean.FALSE);
return ChangeUtil.decodeInformation(treeElement).getPsi();
}
@Override
public void deleteChildRange(PsiElement first, PsiElement last) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
ASTNode firstElement = SourceTreeToPsiMap.psiElementToTree(first);
ASTNode lastElement = SourceTreeToPsiMap.psiElementToTree(last);
LOG.assertTrue(firstElement.getTreeParent() == this);
LOG.assertTrue(lastElement.getTreeParent() == this);
CodeEditUtil.removeChildren(this, firstElement, lastElement);
}
private PsiElement addInnerBefore(final PsiElement element, final PsiElement anchor) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(element);
TreeElement treeElement = addInternal(elementCopy, elementCopy, SourceTreeToPsiMap.psiElementToTree(anchor), Boolean.TRUE);
if (treeElement != null) return ChangeUtil.decodeInformation(treeElement).getPsi();
throw new IncorrectOperationException("Element cannot be added");
}
@Override
public PsiElement addAfter(@Nonnull PsiElement element, PsiElement anchor) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(element);
TreeElement treeElement = addInternal(elementCopy, elementCopy, SourceTreeToPsiMap.psiElementToTree(anchor), Boolean.FALSE);
return ChangeUtil.decodeInformation(treeElement).getPsi();
}
private PsiElement addInnerBefore(final PsiElement element, final PsiElement anchor) throws IncorrectOperationException {
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(element);
TreeElement treeElement = addInternal(elementCopy, elementCopy, SourceTreeToPsiMap.psiElementToTree(anchor), Boolean.TRUE);
if (treeElement != null) return ChangeUtil.decodeInformation(treeElement).getPsi();
throw new IncorrectOperationException("Element cannot be added");
}
@Nullable
public static TreeElement generateTreeElement(@Nullable PsiElement original, @Nonnull CharTable table, @Nonnull final PsiManager manager) {
if (original == null) return null;
PsiUtilCore.ensureValid(original);
if (SourceTreeToPsiMap.hasTreeElement(original)) {
return copyElement((TreeElement)SourceTreeToPsiMap.psiElementToTree(original), table);
}
else {
for (TreeGenerator generator : TreeGenerator.EP_NAME.getExtensionList()) {
final TreeElement element = generator.generateTreeFor(original, table, manager);
if (element != null) return element;
}
return null;
}
}
private static void updateAddedFile(PsiFile copyPsi) throws IncorrectOperationException {
final UpdateAddedFileProcessor processor = UpdateAddedFileProcessor.forElement(copyPsi);
if (processor != null) {
final TreeElement tree = (TreeElement)SourceTreeToPsiMap.psiElementToTree(copyPsi);
if (tree != null) {
ChangeUtil.encodeInformation(tree);
}
processor.update(copyPsi, null);
if (tree != null) {
ChangeUtil.decodeInformation(tree);
}
}
}
@Nullable
private static ASTNode findPreviousWhiteSpace(final ASTNode leafElement, final IElementType whiteSpaceTokenType) {
final int offset = leafElement.getTextRange().getStartOffset() - 1;
if (offset < 0) return null;
final PsiElement psiElement = SourceTreeToPsiMap.treeElementToPsi(leafElement);
if (psiElement == null) {
return null;
}
final PsiElement found = psiElement.getContainingFile().findElementAt(offset);
if (found == null) return null;
final ASTNode treeElement = found.getNode();
if (treeElement != null && treeElement.getElementType() == whiteSpaceTokenType) return treeElement;
return null;
}
@Override
public PsiElement replace(@Nonnull PsiElement newElement) throws IncorrectOperationException {
LOG.assertTrue(getTreeParent() != null);
CheckUtil.checkWritable(this);
TreeElement elementCopy = ChangeUtil.copyToElement(newElement);
getTreeParent().replaceChildInternal(this, elementCopy);
elementCopy = ChangeUtil.decodeInformation(elementCopy);
final PsiElement result = SourceTreeToPsiMap.treeElementToPsi(elementCopy);
this.invalidate();
return result;
}
private void reformatText(@Nonnull PsiFile file, @Nonnull FormatTextRanges ranges, @Nullable Editor editor) throws IncorrectOperationException {
if (ranges.isEmpty()) {
return;
}
ApplicationManager.getApplication().assertWriteAccessAllowed();
PsiDocumentManager.getInstance(getProject()).commitAllDocuments();
CheckUtil.checkWritable(file);
if (!SourceTreeToPsiMap.hasTreeElement(file)) {
return;
}
ASTNode treeElement = SourceTreeToPsiMap.psiElementToTree(file);
transformAllChildren(treeElement);
LOG.assertTrue(file.isValid(), "File name: " + file.getName() + " , class: " + file.getClass().getSimpleName());
if (editor == null) {
editor = PsiUtilBase.findEditor(file);
}
CaretPositionKeeper caretKeeper = null;
if (editor != null) {
caretKeeper = new CaretPositionKeeper(editor, getSettings(file), file.getLanguage());
}
if (FormatterUtil.isFormatterCalledExplicitly()) {
removeEndingWhiteSpaceFromEachRange(file, ranges);
}
formatRanges(file, ranges, ExternalFormatProcessor.useExternalFormatter(file) ? null // do nothing, delegate the external formatting activity to post-processor
: () -> {
final CodeFormatterFacade codeFormatter = new CodeFormatterFacade(getSettings(file), file.getLanguage());
codeFormatter.processText(file, ranges, true);
});
if (caretKeeper != null) {
caretKeeper.restoreCaretPosition();
}
}