use of com.intellij.lang.FileASTNode in project intellij-community by JetBrains.
the class JavaStubBuilderTest method doTest.
private void doTest(String source, String expected) {
PsiJavaFile file = (PsiJavaFile) createLightFile("test.java", source);
FileASTNode fileNode = file.getNode();
assertNotNull(fileNode);
assertFalse(fileNode.isParsed());
StubElement lightTree = myBuilder.buildStubTree(file);
assertFalse(fileNode.isParsed());
// force switch to AST
file.getNode().getChildren(null);
StubElement astBasedTree = myBuilder.buildStubTree(file);
assertTrue(fileNode.isParsed());
assertEquals("light tree differs", expected, DebugUtil.stubTreeToString(lightTree));
assertEquals("AST-based tree differs", expected, DebugUtil.stubTreeToString(astBasedTree));
}
use of com.intellij.lang.FileASTNode in project intellij-community by JetBrains.
the class SubstrateRef method createAstStrongRef.
public static SubstrateRef createAstStrongRef(@NotNull final ASTNode node) {
return new SubstrateRef() {
@NotNull
@Override
public ASTNode getNode() {
return node;
}
@Override
public boolean isValid() {
FileASTNode fileElement = SharedImplUtil.findFileElement(node);
PsiElement file = fileElement == null ? null : fileElement.getPsi();
return file != null && file.isValid();
}
@NotNull
@Override
public PsiFile getContainingFile() {
PsiFile file = SharedImplUtil.getContainingFile(node);
if (file == null)
throw PsiInvalidElementAccessException.createByNode(node, null);
return file;
}
};
}
use of com.intellij.lang.FileASTNode in project intellij-community by JetBrains.
the class BlockSupportImpl method reparseRange.
@Override
@NotNull
public DiffLog reparseRange(@NotNull final PsiFile file, @NotNull FileASTNode oldFileNode, @NotNull TextRange changedPsiRange, @NotNull final CharSequence newFileText, @NotNull final ProgressIndicator indicator, @NotNull CharSequence lastCommittedText) {
final PsiFileImpl fileImpl = (PsiFileImpl) file;
final Couple<ASTNode> reparseableRoots = findReparseableRoots(fileImpl, oldFileNode, changedPsiRange, newFileText);
return reparseableRoots != null ? mergeTrees(fileImpl, reparseableRoots.first, reparseableRoots.second, indicator, lastCommittedText) : makeFullParse(fileImpl, oldFileNode, newFileText, indicator, lastCommittedText);
}
use of com.intellij.lang.FileASTNode 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;
}
use of com.intellij.lang.FileASTNode in project intellij-community by JetBrains.
the class PyStubsTest method doTestUnsupportedNamedTuple.
private void doTestUnsupportedNamedTuple() {
final PyFile file = getTestFile();
final PyTargetExpression attribute = file.findTopLevelAttribute("nt");
assertNotNull(attribute);
final PyType typeFromStub = TypeEvalContext.codeInsightFallback(myFixture.getProject()).getType(attribute);
assertNull(typeFromStub);
assertNotParsed(file);
final FileASTNode astNode = file.getNode();
assertNotNull(astNode);
final PyType typeFromAst = TypeEvalContext.userInitiated(myFixture.getProject(), file).getType(attribute);
assertNull(typeFromAst);
}
Aggregations