IDEA-77151: GUI freeze on opening a JSP file in the editor: ensure parsers instantiation order

This commit is contained in:
Dmitry Avdeev
2011-11-19 13:40:03 +04:00
parent 3059ad6d43
commit 929cd6154d
17 changed files with 69 additions and 50 deletions
@@ -19,8 +19,8 @@ package com.intellij.psi.impl.source.tree;
import com.intellij.lang.ASTFactory;
import com.intellij.lang.ASTNode;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.DeclarationParser;
import com.intellij.lang.java.parser.JavaParserUtil;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lexer.JavaLexer;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.diagnostic.Logger;
@@ -49,7 +49,7 @@ public class JavaTreeGenerator implements TreeGenerator {
private static final JavaParserUtil.ParserWrapper MOD_LIST = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseModifierList(builder);
JavaParsers.DECLARATION_PARSER.parseModifierList(builder);
}
};
@@ -35,7 +35,6 @@ import static com.intellij.lang.java.parser.JavaParserUtil.exprType;
public class DeclarationParser {
public static final DeclarationParser INSTANCE = new DeclarationParser();
private final ExpressionParser myExpressionParser;
private final StatementParser myStatementParser;
private final ReferenceParser myReferenceParser;
@@ -18,7 +18,6 @@ package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilderUtil;
import com.intellij.openapi.util.Key;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.TokenType;
import com.intellij.psi.impl.source.tree.ElementType;
@@ -33,7 +32,6 @@ import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class ExpressionParser {
public static final ExpressionParser INSTANCE = new ExpressionParser();
private final DeclarationParser myDeclarationParser;
private final ReferenceParser myReferenceParser;
@@ -42,7 +42,7 @@ public class FileParser {
TokenSet.create(JavaTokenType.CLASS_KEYWORD, JavaTokenType.INTERFACE_KEYWORD, JavaTokenType.ENUM_KEYWORD, JavaTokenType.AT));
private FileParser() {
this(DeclarationParser.INSTANCE, ReferenceParser.INSTANCE);
this(JavaParsers.DECLARATION_PARSER, JavaParsers.REFERENCE_PARSER);
}
protected FileParser(DeclarationParser declarationParser, ReferenceParser referenceParser) {
@@ -0,0 +1,27 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.java.parser;
/**
* @author Dmitry Avdeev
* Date: 11/19/11
*/
public class JavaParsers {
public static final DeclarationParser DECLARATION_PARSER = new DeclarationParser();
public static final ExpressionParser EXPRESSION_PARSER = new ExpressionParser();
public static final ReferenceParser REFERENCE_PARSER = new ReferenceParser();
public static final StatementParser STATEMENT_PARSER = new StatementParser();
}
@@ -51,12 +51,12 @@ public class JavadocParser {
private JavadocParser() { }
public static void parseJavadocReference(@NotNull final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseJavaCodeReference(builder, true, true, false, false, false);
JavaParsers.REFERENCE_PARSER.parseJavaCodeReference(builder, true, true, false, false, false);
swallowTokens(builder);
}
public static void parseJavadocType(@NotNull final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS | ReferenceParser.WILDCARD);
JavaParsers.REFERENCE_PARSER.parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS | ReferenceParser.WILDCARD);
swallowTokens(builder);
}
@@ -33,7 +33,6 @@ import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class ReferenceParser {
public static final ReferenceParser INSTANCE = new ReferenceParser();
private final DeclarationParser myDeclarationParser;
public static final int EAT_LAST_DOT = 0x01;
@@ -17,7 +17,6 @@ package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.PsiBuilder;
import com.intellij.openapi.util.Key;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.impl.source.tree.JavaElementType;
@@ -35,7 +34,6 @@ import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class StatementParser {
public static final StatementParser INSTANCE = new StatementParser();
private final ExpressionParser myExpressionParser;
private final DeclarationParser myDeclarationParser;
private final ReferenceParser myReferenceParser;
@@ -17,7 +17,7 @@ package com.intellij.psi.impl;
import com.intellij.lang.*;
import com.intellij.lang.java.parser.JavaParserUtil;
import com.intellij.lang.java.parser.StatementParser;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lexer.JavaLexer;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.diagnostic.Logger;
@@ -693,7 +693,7 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps
private static final JavaParserUtil.ParserWrapper CATCH_SECTION = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
StatementParser.INSTANCE.parseCatchBlock(builder);
JavaParsers.STATEMENT_PARSER.parseCatchBlock(builder);
}
};
@@ -53,28 +53,28 @@ public class PsiJavaParserFacadeImpl implements PsiJavaParserFacade {
private static final JavaParserUtil.ParserWrapper ANNOTATION = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseAnnotation(builder);
JavaParsers.DECLARATION_PARSER.parseAnnotation(builder);
}
};
private static final JavaParserUtil.ParserWrapper PARAMETER = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseParameter(builder, true, false);
JavaParsers.DECLARATION_PARSER.parseParameter(builder, true, false);
}
};
private static final JavaParserUtil.ParserWrapper RESOURCE = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseResource(builder);
JavaParsers.DECLARATION_PARSER.parseResource(builder);
}
};
private static final JavaParserUtil.ParserWrapper TYPE = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS |
JavaParsers.REFERENCE_PARSER.parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS |
ReferenceParser.WILDCARD | ReferenceParser.DISJUNCTIONS);
}
};
@@ -82,63 +82,63 @@ public class PsiJavaParserFacadeImpl implements PsiJavaParserFacade {
public static final JavaParserUtil.ParserWrapper REFERENCE = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseJavaCodeReference(builder, false, true, false, false, false);
JavaParsers.REFERENCE_PARSER.parseJavaCodeReference(builder, false, true, false, false, false);
}
};
public static final JavaParserUtil.ParserWrapper DIAMOND_REF = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseJavaCodeReference(builder, false, true, false, false, true);
JavaParsers.REFERENCE_PARSER.parseJavaCodeReference(builder, false, true, false, false, true);
}
};
public static final JavaParserUtil.ParserWrapper STATIC_IMPORT_REF = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseImportCodeReference(builder, true);
JavaParsers.REFERENCE_PARSER.parseImportCodeReference(builder, true);
}
};
private static final JavaParserUtil.ParserWrapper TYPE_PARAMETER = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseTypeParameter(builder);
JavaParsers.REFERENCE_PARSER.parseTypeParameter(builder);
}
};
private static final JavaParserUtil.ParserWrapper DECLARATION = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parse(builder, DeclarationParser.Context.CLASS);
JavaParsers.DECLARATION_PARSER.parse(builder, DeclarationParser.Context.CLASS);
}
};
private static final JavaParserUtil.ParserWrapper CODE_BLOCK = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
StatementParser.INSTANCE.parseCodeBlockDeep(builder, true);
JavaParsers.STATEMENT_PARSER.parseCodeBlockDeep(builder, true);
}
};
private static final JavaParserUtil.ParserWrapper STATEMENT = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
StatementParser.INSTANCE.parseStatement(builder);
JavaParsers.STATEMENT_PARSER.parseStatement(builder);
}
};
private static final JavaParserUtil.ParserWrapper EXPRESSION = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ExpressionParser.INSTANCE.parse(builder);
JavaParsers.EXPRESSION_PARSER.parse(builder);
}
};
private static final JavaParserUtil.ParserWrapper ENUM_CONSTANT = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseEnumConstant(builder);
JavaParsers.DECLARATION_PARSER.parseEnumConstant(builder);
}
};
@@ -16,8 +16,8 @@
package com.intellij.psi.impl.compiled;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.DeclarationParser;
import com.intellij.lang.java.parser.JavaParserUtil;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
@@ -40,7 +40,7 @@ public class ClsParsingUtil {
private static final JavaParserUtil.ParserWrapper ANNOTATION_VALUE = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseAnnotationValue(builder);
JavaParsers.DECLARATION_PARSER.parseAnnotationValue(builder);
}
};
@@ -17,10 +17,7 @@ package com.intellij.psi.impl.source.tree;
import com.intellij.lang.*;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.parser.ExpressionParser;
import com.intellij.lang.java.parser.JavaParserUtil;
import com.intellij.lang.java.parser.ReferenceParser;
import com.intellij.lang.java.parser.StatementParser;
import com.intellij.lang.java.parser.*;
import com.intellij.lexer.JavaLexer;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.project.Project;
@@ -156,14 +153,14 @@ public interface JavaElementType {
@Override
public ASTNode parseContents(final ASTNode chameleon) {
final PsiBuilder builder = JavaParserUtil.createBuilder(chameleon);
StatementParser.INSTANCE.parseCodeBlockDeep(builder, true);
JavaParsers.STATEMENT_PARSER.parseCodeBlockDeep(builder, true);
return builder.getTreeBuilt().getFirstChildNode();
}
@Override
public FlyweightCapableTreeStructure<LighterASTNode> parseContents(final LighterLazyParseableNode chameleon) {
final PsiBuilder builder = JavaParserUtil.createBuilder(chameleon);
StatementParser.INSTANCE.parseCodeBlockDeep(builder, true);
JavaParsers.STATEMENT_PARSER.parseCodeBlockDeep(builder, true);
return builder.getLightTree();
}
@@ -196,7 +193,7 @@ public interface JavaElementType {
private final JavaParserUtil.ParserWrapper myParser = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
StatementParser.INSTANCE.parseStatements(builder);
JavaParsers.STATEMENT_PARSER.parseStatements(builder);
}
};
@@ -211,7 +208,7 @@ public interface JavaElementType {
private final JavaParserUtil.ParserWrapper myParser = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ExpressionParser.INSTANCE.parse(builder);
JavaParsers.EXPRESSION_PARSER.parse(builder);
}
};
@@ -226,7 +223,7 @@ public interface JavaElementType {
private final JavaParserUtil.ParserWrapper myParser = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseJavaCodeReference(builder, false, true, false, false, false);
JavaParsers.REFERENCE_PARSER.parseJavaCodeReference(builder, false, true, false, false, false);
}
};
@@ -241,7 +238,7 @@ public interface JavaElementType {
private final JavaParserUtil.ParserWrapper myParser = new JavaParserUtil.ParserWrapper() {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS |
JavaParsers.REFERENCE_PARSER.parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS |
ReferenceParser.WILDCARD | ReferenceParser.DISJUNCTIONS);
}
};
@@ -16,7 +16,7 @@
package com.intellij.lang.java.parser.partial;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.DeclarationParser;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lang.java.parser.JavaParsingTestCase;
@@ -45,7 +45,7 @@ public class AnnotationParserTest extends JavaParsingTestCase {
private static class MyTestParser1 implements TestParser {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseAnnotations(builder);
JavaParsers.DECLARATION_PARSER.parseAnnotations(builder);
}
}
}
@@ -16,7 +16,7 @@
package com.intellij.lang.java.parser.partial;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.DeclarationParser;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lang.java.parser.JavaParsingTestCase;
import com.intellij.pom.java.LanguageLevel;
@@ -117,7 +117,7 @@ public class DeclarationParserTest extends JavaParsingTestCase {
@Override
public void parse(final PsiBuilder builder) {
DeclarationParser.INSTANCE.parseClassBodyWithBraces(builder, myAnnotation, myAnEnum);
JavaParsers.DECLARATION_PARSER.parseClassBodyWithBraces(builder, myAnnotation, myAnEnum);
}
}
}
@@ -16,7 +16,7 @@
package com.intellij.lang.java.parser.partial;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.ExpressionParser;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lang.java.parser.JavaParsingTestCase;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.NonNls;
@@ -124,7 +124,7 @@ public class ExpressionParserTest extends JavaParsingTestCase {
private static class MyTestParser implements TestParser {
@Override
public void parse(final PsiBuilder builder) {
ExpressionParser.INSTANCE.parse(builder);
JavaParsers.EXPRESSION_PARSER.parse(builder);
}
}
}
@@ -16,6 +16,7 @@
package com.intellij.lang.java.parser.partial;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lang.java.parser.JavaParsingTestCase;
import com.intellij.lang.java.parser.ReferenceParser;
import com.intellij.pom.java.LanguageLevel;
@@ -66,7 +67,7 @@ public class ReferenceParserTest extends JavaParsingTestCase {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseJavaCodeReference(builder, myIncomplete, false, false, false, false);
JavaParsers.REFERENCE_PARSER.parseJavaCodeReference(builder, myIncomplete, false, false, false, false);
}
}
@@ -76,7 +77,7 @@ public class ReferenceParserTest extends JavaParsingTestCase {
private static class MyTestParser2 implements TestParser {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseType(builder, ReferenceParser.ELLIPSIS | ReferenceParser.DIAMONDS | ReferenceParser.DISJUNCTIONS);
JavaParsers.REFERENCE_PARSER.parseType(builder, ReferenceParser.ELLIPSIS | ReferenceParser.DIAMONDS | ReferenceParser.DISJUNCTIONS);
}
}
@@ -87,7 +88,7 @@ public class ReferenceParserTest extends JavaParsingTestCase {
private static class MyTestParser3 implements TestParser {
@Override
public void parse(final PsiBuilder builder) {
ReferenceParser.INSTANCE.parseTypeParameters(builder);
JavaParsers.REFERENCE_PARSER.parseTypeParameters(builder);
}
}
}
@@ -16,8 +16,8 @@
package com.intellij.lang.java.parser.partial;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.JavaParsers;
import com.intellij.lang.java.parser.JavaParsingTestCase;
import com.intellij.lang.java.parser.StatementParser;
import com.intellij.pom.java.LanguageLevel;
@@ -170,14 +170,14 @@ public class StatementParserTest extends JavaParsingTestCase {
private static class MyTestParser2 implements TestParser {
@Override
public void parse(final PsiBuilder builder) {
StatementParser.INSTANCE.parseStatements(builder);
JavaParsers.STATEMENT_PARSER.parseStatements(builder);
}
}
private static class MyTestParser1 implements TestParser {
@Override
public void parse(final PsiBuilder builder) {
StatementParser.INSTANCE.parseCodeBlockDeep(builder, true);
JavaParsers.STATEMENT_PARSER.parseCodeBlockDeep(builder, true);
}
}
}