PSI builder creation ordered

This commit is contained in:
Roman Shevchenko
2010-09-07 20:46:50 +04:00
parent 0fefc2c9cf
commit d596125d05
3 changed files with 32 additions and 24 deletions
@@ -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;
@@ -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);