mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
PSI builder creation ordered
This commit is contained in:
@@ -17,7 +17,6 @@ package com.intellij.lang.java.parser;
|
||||
|
||||
import com.intellij.codeInsight.daemon.JavaErrorMessages;
|
||||
import com.intellij.lang.*;
|
||||
import com.intellij.lang.java.JavaParserDefinition;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
|
||||
import com.intellij.openapi.util.Key;
|
||||
@@ -28,6 +27,7 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.impl.source.tree.ElementType;
|
||||
import com.intellij.psi.impl.source.tree.JavaDocElementType;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.text.BlockSupport;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import com.intellij.util.diff.FlyweightCapableTreeStructure;
|
||||
@@ -149,8 +149,8 @@ public class JavaParserUtil {
|
||||
final Project project = psi.getProject();
|
||||
|
||||
final PsiBuilderFactory factory = PsiBuilderFactory.getInstance();
|
||||
final ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(StdLanguages.JAVA);
|
||||
final PsiBuilder builder = factory.createBuilder(parserDefinition.createLexer(project), StdLanguages.JAVA, chameleon.getChars());
|
||||
chameleon.putUserData(BlockSupport.TREE_TO_BE_REPARSED, null);
|
||||
final PsiBuilder builder = factory.createBuilder(project, chameleon);
|
||||
|
||||
final LanguageLevel level = LanguageLevelProjectExtension.getInstance(project).getLanguageLevel();
|
||||
setLanguageLevel(builder, level);
|
||||
@@ -160,10 +160,15 @@ public class JavaParserUtil {
|
||||
|
||||
@NotNull
|
||||
public static ASTNode parseFragment(final ASTNode chameleon, final ParserWrapper wrapper) {
|
||||
final PsiElement psi = chameleon.getPsi();
|
||||
assert psi != null : chameleon;
|
||||
final Project project = psi.getProject();
|
||||
|
||||
final PsiBuilderFactory factory = PsiBuilderFactory.getInstance();
|
||||
final LanguageLevel level = LanguageLevel.HIGHEST;
|
||||
final PsiBuilder builder = factory.createBuilder(JavaParserDefinition.createLexer(level), StdLanguages.JAVA, chameleon.getChars());
|
||||
setLanguageLevel(builder, level);
|
||||
chameleon.putUserData(BlockSupport.TREE_TO_BE_REPARSED, null);
|
||||
final PsiBuilder builder = factory.createBuilder(project, chameleon);
|
||||
|
||||
setLanguageLevel(builder, LanguageLevel.HIGHEST);
|
||||
|
||||
final PsiBuilder.Marker root = builder.mark();
|
||||
wrapper.parse(builder);
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.intellij.pom.tree.TreeAspectEvent;
|
||||
import com.intellij.pom.tree.events.TreeChangeEvent;
|
||||
import com.intellij.psi.PsiErrorElement;
|
||||
import com.intellij.psi.TokenType;
|
||||
import com.intellij.psi.impl.source.CharTableImpl;
|
||||
import com.intellij.psi.impl.source.PsiFileImpl;
|
||||
import com.intellij.psi.impl.source.text.ASTDiffBuilder;
|
||||
import com.intellij.psi.impl.source.tree.*;
|
||||
@@ -70,7 +71,6 @@ public class PsiBuilderImpl extends UserDataHolderBase implements PsiBuilder {
|
||||
private final MyList myProduction = new MyList();
|
||||
|
||||
private final Lexer myLexer;
|
||||
private final boolean myFileLevelParsing;
|
||||
private final TokenSet myWhitespaces;
|
||||
private TokenSet myComments;
|
||||
|
||||
@@ -125,34 +125,39 @@ public class PsiBuilderImpl extends UserDataHolderBase implements PsiBuilder {
|
||||
ourAnyLanguageWhitespaceTokens = TokenSet.orSet(ourAnyLanguageWhitespaceTokens, TokenSet.create(type));
|
||||
}
|
||||
|
||||
public PsiBuilderImpl(@NotNull final Language lang, @NotNull final Lexer lexer, @NotNull final ASTNode chameleon,
|
||||
public PsiBuilderImpl(@NotNull final Language lang,
|
||||
@NotNull final Lexer lexer,
|
||||
@NotNull final ASTNode chameleon,
|
||||
@NotNull final CharSequence text) {
|
||||
myText = text;
|
||||
myTextArray = CharArrayUtil.fromSequenceWithoutCopying(text);
|
||||
ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(lang);
|
||||
assert parserDefinition != null : "ParserDefinition absent for language: " + lang.getID();
|
||||
myLexer = lexer;
|
||||
|
||||
final ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(lang);
|
||||
assert parserDefinition != null : "ParserDefinition absent for language: " + lang.getID();
|
||||
myWhitespaces = parserDefinition.getWhitespaceTokens();
|
||||
myComments = parserDefinition.getCommentTokens();
|
||||
|
||||
myCharTable = SharedImplUtil.findCharTableByTree(chameleon);
|
||||
|
||||
myOriginalTree = chameleon.getUserData(BlockSupport.TREE_TO_BE_REPARSED);
|
||||
|
||||
myFileLevelParsing = myCharTable == null || myOriginalTree != null;
|
||||
cacheLexemes();
|
||||
}
|
||||
|
||||
@TestOnly
|
||||
public PsiBuilderImpl(@NotNull final Lexer lexer, @NotNull final TokenSet whitespaces, @NotNull final TokenSet comments,
|
||||
public PsiBuilderImpl(@NotNull final Lexer lexer,
|
||||
@NotNull final TokenSet whitespaces,
|
||||
@NotNull final TokenSet comments,
|
||||
@NotNull final CharSequence text) {
|
||||
myWhitespaces = whitespaces;
|
||||
myLexer = lexer;
|
||||
myComments = comments;
|
||||
myText = text;
|
||||
myTextArray = CharArrayUtil.fromSequenceWithoutCopying(text);
|
||||
myLexer = lexer;
|
||||
myWhitespaces = whitespaces;
|
||||
myComments = comments;
|
||||
|
||||
myCharTable = null;
|
||||
myOriginalTree = null;
|
||||
|
||||
myFileLevelParsing = true;
|
||||
cacheLexemes();
|
||||
}
|
||||
|
||||
@@ -767,13 +772,11 @@ public class PsiBuilderImpl extends UserDataHolderBase implements PsiBuilder {
|
||||
}
|
||||
|
||||
private ASTNode createRootAST(final StartMarker rootMarker) {
|
||||
final ASTNode rootNode;
|
||||
if (myFileLevelParsing) {
|
||||
rootNode = new FileElement(rootMarker.myType, null);
|
||||
myCharTable = ((FileElement)rootNode).getCharTable();
|
||||
final ASTNode rootNode = createComposite(rootMarker);
|
||||
if (myCharTable == null) {
|
||||
myCharTable = rootNode instanceof FileElement ? ((FileElement)rootNode).getCharTable() : new CharTableImpl();
|
||||
}
|
||||
else {
|
||||
rootNode = createComposite(rootMarker);
|
||||
if (!(rootNode instanceof FileElement)) {
|
||||
rootNode.putUserData(CharTable.CHAR_TABLE_KEY, myCharTable);
|
||||
}
|
||||
return rootNode;
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
|
||||
public class LightPsiBuilderTest {
|
||||
public class PsiBuilderQuickTest {
|
||||
private static final IElementType ROOT = new IElementType("ROOT", Language.ANY);
|
||||
private static final IElementType LETTER = new IElementType("LETTER", Language.ANY);
|
||||
private static final IElementType DIGIT = new IElementType("DIGIT", Language.ANY);
|
||||
Reference in New Issue
Block a user