Search in sources :

Example 1 with IReparseableElementType

use of com.intellij.psi.tree.IReparseableElementType in project intellij-community by JetBrains.

the class BlockSupportImpl method findReparseableRoots.

/**
   * This method searches ast node that could be reparsed incrementally and returns pair of target reparseable node and new replacement node.
   * Returns null if there is no any chance to make incremental parsing.
   */
@Nullable
public Couple<ASTNode> findReparseableRoots(@NotNull PsiFileImpl file, @NotNull FileASTNode oldFileNode, @NotNull TextRange changedPsiRange, @NotNull CharSequence newFileText) {
    Project project = file.getProject();
    final FileElement fileElement = (FileElement) oldFileNode;
    final CharTable charTable = fileElement.getCharTable();
    int lengthShift = newFileText.length() - fileElement.getTextLength();
    if (fileElement.getElementType() instanceof ITemplateDataElementType || isTooDeep(file)) {
        // unable to perform incremental reparse for template data in JSP, or in exceptionally deep trees
        return null;
    }
    final ASTNode leafAtStart = fileElement.findLeafElementAt(Math.max(0, changedPsiRange.getStartOffset() - 1));
    final ASTNode leafAtEnd = fileElement.findLeafElementAt(Math.min(changedPsiRange.getEndOffset(), fileElement.getTextLength() - 1));
    ASTNode node = leafAtStart != null && leafAtEnd != null ? TreeUtil.findCommonParent(leafAtStart, leafAtEnd) : fileElement;
    Language baseLanguage = file.getViewProvider().getBaseLanguage();
    while (node != null && !(node instanceof FileElement)) {
        IElementType elementType = node.getElementType();
        if (elementType instanceof IReparseableElementType) {
            final TextRange textRange = node.getTextRange();
            final IReparseableElementType reparseable = (IReparseableElementType) elementType;
            if (baseLanguage.isKindOf(reparseable.getLanguage()) && textRange.getLength() + lengthShift > 0) {
                final int start = textRange.getStartOffset();
                final int end = start + textRange.getLength() + lengthShift;
                if (end > newFileText.length()) {
                    reportInconsistentLength(file, newFileText, node, start, end);
                    break;
                }
                CharSequence newTextStr = newFileText.subSequence(start, end);
                if (reparseable.isParsable(node.getTreeParent(), newTextStr, baseLanguage, project)) {
                    ASTNode chameleon = reparseable.createNode(newTextStr);
                    if (chameleon != null) {
                        DummyHolder holder = DummyHolderFactory.createHolder(file.getManager(), null, node.getPsi(), charTable);
                        holder.getTreeElement().rawAddChildren((TreeElement) chameleon);
                        if (holder.getTextLength() != newTextStr.length()) {
                            String details = ApplicationManager.getApplication().isInternal() ? "text=" + newTextStr + "; treeText=" + holder.getText() + ";" : "";
                            LOG.error("Inconsistent reparse: " + details + " type=" + elementType);
                        }
                        return Couple.of(node, chameleon);
                    }
                }
            }
        }
        node = node.getTreeParent();
    }
    return null;
}
Also used : ITemplateDataElementType(com.intellij.psi.templateLanguages.ITemplateDataElementType) DummyHolder(com.intellij.psi.impl.source.DummyHolder) TextRange(com.intellij.openapi.util.TextRange) CharTable(com.intellij.util.CharTable) IElementType(com.intellij.psi.tree.IElementType) Project(com.intellij.openapi.project.Project) Language(com.intellij.lang.Language) PlainTextLanguage(com.intellij.openapi.fileTypes.PlainTextLanguage) FileASTNode(com.intellij.lang.FileASTNode) ASTNode(com.intellij.lang.ASTNode) IReparseableElementType(com.intellij.psi.tree.IReparseableElementType) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

ASTNode (com.intellij.lang.ASTNode)1 FileASTNode (com.intellij.lang.FileASTNode)1 Language (com.intellij.lang.Language)1 PlainTextLanguage (com.intellij.openapi.fileTypes.PlainTextLanguage)1 Project (com.intellij.openapi.project.Project)1 TextRange (com.intellij.openapi.util.TextRange)1 DummyHolder (com.intellij.psi.impl.source.DummyHolder)1 ITemplateDataElementType (com.intellij.psi.templateLanguages.ITemplateDataElementType)1 IElementType (com.intellij.psi.tree.IElementType)1 IReparseableElementType (com.intellij.psi.tree.IReparseableElementType)1 CharTable (com.intellij.util.CharTable)1 Nullable (org.jetbrains.annotations.Nullable)1