From d596125d056561bc8bbd2e245c64bfa2f341d426 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Sep 2010 20:44:52 +0400 Subject: [PATCH] PSI builder creation ordered --- .../lang/java/parser/JavaParserUtil.java | 17 ++++++--- .../intellij/lang/impl/PsiBuilderImpl.java | 37 ++++++++++--------- ...lderTest.java => PsiBuilderQuickTest.java} | 2 +- 3 files changed, 32 insertions(+), 24 deletions(-) rename platform/lang-impl/testSrc/com/intellij/lang/{LightPsiBuilderTest.java => PsiBuilderQuickTest.java} (99%) diff --git a/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java b/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java index 5af393229a20..5b66776a2f41 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java @@ -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); diff --git a/platform/lang-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java b/platform/lang-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java index 4659d21a6f48..84c728fe7717 100644 --- a/platform/lang-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java +++ b/platform/lang-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java @@ -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; diff --git a/platform/lang-impl/testSrc/com/intellij/lang/LightPsiBuilderTest.java b/platform/lang-impl/testSrc/com/intellij/lang/PsiBuilderQuickTest.java similarity index 99% rename from platform/lang-impl/testSrc/com/intellij/lang/LightPsiBuilderTest.java rename to platform/lang-impl/testSrc/com/intellij/lang/PsiBuilderQuickTest.java index eab175bb58cb..79b8aa9d6eef 100644 --- a/platform/lang-impl/testSrc/com/intellij/lang/LightPsiBuilderTest.java +++ b/platform/lang-impl/testSrc/com/intellij/lang/PsiBuilderQuickTest.java @@ -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);