mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-08-26 06:11:42 +07:00
New Java parser - process comments and whitespaces on parsing
This commit is contained in:
@@ -116,7 +116,7 @@ public class DeclarationParser {
|
||||
}
|
||||
}
|
||||
|
||||
declaration.done(JavaElementType.CLASS);
|
||||
done(declaration, JavaElementType.CLASS);
|
||||
return declaration;
|
||||
}
|
||||
|
||||
@@ -162,10 +162,10 @@ public class DeclarationParser {
|
||||
if (builder.getTokenType() == JavaTokenType.LBRACE) {
|
||||
final PsiBuilder.Marker constantInit = builder.mark();
|
||||
parseClassBodyWithBraces(builder, false, false);
|
||||
constantInit.done(JavaElementType.ENUM_CONSTANT_INITIALIZER);
|
||||
done(constantInit, JavaElementType.ENUM_CONSTANT_INITIALIZER);
|
||||
}
|
||||
|
||||
constant.done(JavaElementType.ENUM_CONSTANT);
|
||||
done(constant, JavaElementType.ENUM_CONSTANT);
|
||||
return constant;
|
||||
}
|
||||
else {
|
||||
@@ -309,7 +309,7 @@ public class DeclarationParser {
|
||||
final PsiBuilder.Marker error = typeParams.precede();
|
||||
error.errorBefore(JavaErrorMessages.message("unexpected.token"), codeBlock);
|
||||
}
|
||||
declaration.done(JavaElementType.CLASS_INITIALIZER);
|
||||
done(declaration, JavaElementType.CLASS_INITIALIZER);
|
||||
return declaration;
|
||||
}
|
||||
else {
|
||||
@@ -391,7 +391,7 @@ public class DeclarationParser {
|
||||
}
|
||||
}
|
||||
|
||||
modList.done(JavaElementType.MODIFIER_LIST);
|
||||
done(modList, JavaElementType.MODIFIER_LIST);
|
||||
return Pair.create(modList, isEmpty);
|
||||
}
|
||||
|
||||
@@ -405,7 +405,7 @@ public class DeclarationParser {
|
||||
final PsiBuilder.Marker receiver = builder.mark();
|
||||
final PsiBuilder.Marker annotations = parseAnnotations(builder);
|
||||
if (annotations != null) {
|
||||
receiver.done(JavaElementType.METHOD_RECEIVER);
|
||||
done(receiver, JavaElementType.METHOD_RECEIVER);
|
||||
}
|
||||
else {
|
||||
receiver.drop();
|
||||
@@ -441,7 +441,7 @@ public class DeclarationParser {
|
||||
}
|
||||
}
|
||||
|
||||
declaration.done(anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD);
|
||||
done(declaration, anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD);
|
||||
return declaration;
|
||||
}
|
||||
|
||||
@@ -528,7 +528,7 @@ public class DeclarationParser {
|
||||
invalidElements.error(errorMessage);
|
||||
}
|
||||
|
||||
paramList.done(JavaElementType.PARAMETER_LIST);
|
||||
done(paramList, JavaElementType.PARAMETER_LIST);
|
||||
return paramList;
|
||||
}
|
||||
|
||||
@@ -552,7 +552,7 @@ public class DeclarationParser {
|
||||
|
||||
if (expect(builder, JavaTokenType.IDENTIFIER)) {
|
||||
eatBrackets(builder);
|
||||
param.done(JavaElementType.PARAMETER);
|
||||
done(param, JavaElementType.PARAMETER);
|
||||
return param;
|
||||
}
|
||||
else {
|
||||
@@ -603,7 +603,7 @@ public class DeclarationParser {
|
||||
}
|
||||
|
||||
if (builder.getTokenType() != JavaTokenType.COMMA) break;
|
||||
variable.done(varType);
|
||||
done(variable, varType);
|
||||
builder.advanceLexer();
|
||||
|
||||
if (builder.getTokenType() != JavaTokenType.IDENTIFIER) {
|
||||
@@ -642,7 +642,7 @@ public class DeclarationParser {
|
||||
}
|
||||
|
||||
if (openMarker) {
|
||||
variable.done(varType);
|
||||
done(variable, varType);
|
||||
}
|
||||
|
||||
return declaration;
|
||||
@@ -683,7 +683,7 @@ public class DeclarationParser {
|
||||
|
||||
parseAnnotationParameterList(builder);
|
||||
|
||||
anno.done(JavaElementType.ANNOTATION);
|
||||
done(anno, JavaElementType.ANNOTATION);
|
||||
return anno;
|
||||
}
|
||||
|
||||
@@ -692,12 +692,12 @@ public class DeclarationParser {
|
||||
PsiBuilder.Marker list = builder.mark();
|
||||
|
||||
if (!expect(builder, JavaTokenType.LPARENTH)) {
|
||||
list.done(JavaElementType.ANNOTATION_PARAMETER_LIST);
|
||||
done(list, JavaElementType.ANNOTATION_PARAMETER_LIST);
|
||||
return list;
|
||||
}
|
||||
|
||||
if (expect(builder, JavaTokenType.RPARENTH)) {
|
||||
list.done(JavaElementType.ANNOTATION_PARAMETER_LIST);
|
||||
done(list, JavaElementType.ANNOTATION_PARAMETER_LIST);
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -739,7 +739,7 @@ public class DeclarationParser {
|
||||
}
|
||||
}
|
||||
|
||||
list.done(JavaElementType.ANNOTATION_PARAMETER_LIST);
|
||||
done(list, JavaElementType.ANNOTATION_PARAMETER_LIST);
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -749,7 +749,7 @@ public class DeclarationParser {
|
||||
if (mayBeSimple) {
|
||||
parseAnnotationValue(builder);
|
||||
if (builder.getTokenType() != JavaTokenType.EQ) {
|
||||
pair.done(JavaElementType.NAME_VALUE_PAIR);
|
||||
done(pair, JavaElementType.NAME_VALUE_PAIR);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -763,7 +763,7 @@ public class DeclarationParser {
|
||||
|
||||
parseAnnotationValue(builder);
|
||||
|
||||
pair.done(JavaElementType.NAME_VALUE_PAIR);
|
||||
done(pair, JavaElementType.NAME_VALUE_PAIR);
|
||||
|
||||
return hasName;
|
||||
}
|
||||
@@ -798,7 +798,7 @@ public class DeclarationParser {
|
||||
builder.advanceLexer();
|
||||
|
||||
if (expect(builder, JavaTokenType.RBRACE)) {
|
||||
annoArray.done(JavaElementType.ANNOTATION_ARRAY_INITIALIZER);
|
||||
done(annoArray, JavaElementType.ANNOTATION_ARRAY_INITIALIZER);
|
||||
return annoArray;
|
||||
}
|
||||
|
||||
@@ -819,7 +819,7 @@ public class DeclarationParser {
|
||||
}
|
||||
}
|
||||
|
||||
annoArray.done(JavaElementType.ANNOTATION_ARRAY_INITIALIZER);
|
||||
done(annoArray, JavaElementType.ANNOTATION_ARRAY_INITIALIZER);
|
||||
if (unclosed) {
|
||||
annoArray.setCustomEdgeProcessors(null, GREEDY_RIGHT_EDGE_PROCESSOR);
|
||||
}
|
||||
|
||||
@@ -27,38 +27,61 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import static com.intellij.lang.PsiBuilderUtil.expect;
|
||||
import static com.intellij.lang.java.parser.JavaParserUtil.done;
|
||||
import static com.intellij.lang.java.parser.JavaParserUtil.semicolon;
|
||||
|
||||
|
||||
public class FileParser {
|
||||
public interface TopLevelDeclarationParser {
|
||||
@Nullable PsiBuilder.Marker parse(PsiBuilder builder);
|
||||
}
|
||||
|
||||
private static final TokenSet IMPORT_LIST_STOPPER_SET = TokenSet.orSet(
|
||||
ElementType.MODIFIER_BIT_SET,
|
||||
TokenSet.create(JavaTokenType.CLASS_KEYWORD, JavaTokenType.INTERFACE_KEYWORD, JavaTokenType.ENUM_KEYWORD, JavaTokenType.AT));
|
||||
|
||||
private static final TopLevelDeclarationParser TOP_LEVEL_DECLARATION_PARSER = new TopLevelDeclarationParser() {
|
||||
public PsiBuilder.Marker parse(final PsiBuilder builder) {
|
||||
return DeclarationParser.parse(builder, DeclarationParser.Context.FILE);
|
||||
}
|
||||
};
|
||||
|
||||
private FileParser() { }
|
||||
|
||||
public static void parse(final PsiBuilder builder) {
|
||||
parseFile(builder, IMPORT_LIST_STOPPER_SET, TOP_LEVEL_DECLARATION_PARSER, JavaErrorMessages.message("expected.class.or.interface"));
|
||||
}
|
||||
|
||||
public static void parseFile(final PsiBuilder builder, final TokenSet importListStoppers,
|
||||
final TopLevelDeclarationParser declarationParser, final String errorMessage) {
|
||||
parsePackageStatement(builder);
|
||||
|
||||
parseImportList(builder);
|
||||
final Pair<PsiBuilder.Marker, Boolean> impListInfo = parseImportList(builder, importListStoppers);
|
||||
|
||||
Boolean firstDeclarationOk = null;
|
||||
PsiBuilder.Marker firstDeclaration = null;
|
||||
PsiBuilder.Marker invalidElements = null;
|
||||
while (!builder.eof()) {
|
||||
if (builder.getTokenType() == JavaTokenType.SEMICOLON) {
|
||||
if (invalidElements != null) {
|
||||
invalidElements.error(JavaErrorMessages.message("expected.class.or.interface"));
|
||||
invalidElements.error(errorMessage);
|
||||
invalidElements = null;
|
||||
}
|
||||
builder.advanceLexer();
|
||||
if (firstDeclarationOk == null) firstDeclarationOk = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
final PsiBuilder.Marker declaration = DeclarationParser.parse(builder, DeclarationParser.Context.FILE);
|
||||
final PsiBuilder.Marker declaration = declarationParser.parse(builder);
|
||||
if (declaration != null) {
|
||||
if (invalidElements != null) {
|
||||
invalidElements.errorBefore(JavaErrorMessages.message("expected.class.or.interface"), declaration);
|
||||
invalidElements.errorBefore(errorMessage, declaration);
|
||||
invalidElements = null;
|
||||
}
|
||||
if (firstDeclarationOk == null) {
|
||||
firstDeclarationOk = true;
|
||||
firstDeclaration = declaration;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -66,10 +89,16 @@ public class FileParser {
|
||||
invalidElements = builder.mark();
|
||||
}
|
||||
builder.advanceLexer();
|
||||
if (firstDeclarationOk == null) firstDeclarationOk = false;
|
||||
}
|
||||
|
||||
if (invalidElements != null) {
|
||||
invalidElements.error(JavaErrorMessages.message("expected.class.or.interface"));
|
||||
invalidElements.error(errorMessage);
|
||||
}
|
||||
|
||||
if (impListInfo.second && firstDeclarationOk == Boolean.TRUE) {
|
||||
impListInfo.first.setCustomEdgeProcessors(JavaParserUtil.PRECEDING_COMMENT_BINDER, null); // pass comments behind fake import list
|
||||
firstDeclaration.setCustomEdgeProcessors(JavaParserUtil.SPECIAL_PRECEDING_COMMENT_BINDER, null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +109,7 @@ public class FileParser {
|
||||
if (!expect(builder, JavaTokenType.PACKAGE_KEYWORD)) {
|
||||
final PsiBuilder.Marker modList = builder.mark();
|
||||
DeclarationParser.parseAnnotations(builder);
|
||||
modList.done(JavaElementType.MODIFIER_LIST);
|
||||
done(modList, JavaElementType.MODIFIER_LIST);
|
||||
if (!expect(builder, JavaTokenType.PACKAGE_KEYWORD)) {
|
||||
statement.rollbackTo();
|
||||
return null;
|
||||
@@ -95,15 +124,10 @@ public class FileParser {
|
||||
|
||||
semicolon(builder);
|
||||
|
||||
statement.done(JavaElementType.PACKAGE_STATEMENT);
|
||||
done(statement, JavaElementType.PACKAGE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static Pair<PsiBuilder.Marker, Boolean> parseImportList(final PsiBuilder builder) {
|
||||
return parseImportList(builder, IMPORT_LIST_STOPPER_SET);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Pair<PsiBuilder.Marker, Boolean> parseImportList(final PsiBuilder builder, final TokenSet stoppers) {
|
||||
final PsiBuilder.Marker list = builder.mark();
|
||||
@@ -134,7 +158,7 @@ public class FileParser {
|
||||
}
|
||||
}
|
||||
|
||||
list.done(JavaElementType.IMPORT_LIST);
|
||||
done(list, JavaElementType.IMPORT_LIST);
|
||||
return Pair.create(list, isEmpty);
|
||||
}
|
||||
|
||||
@@ -153,7 +177,7 @@ public class FileParser {
|
||||
semicolon(builder);
|
||||
}
|
||||
|
||||
statement.done(type);
|
||||
done(statement, type);
|
||||
return statement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ import com.intellij.lang.ASTNode;
|
||||
import com.intellij.lang.PsiBuilder;
|
||||
import com.intellij.lang.PsiParser;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.psi.impl.source.parsing.ParseUtil;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -41,8 +40,6 @@ public class JavaParser implements PsiParser {
|
||||
FileParser.parse(builder);
|
||||
root.done(rootType);
|
||||
|
||||
final ASTNode rootNode = builder.getTreeBuilt();
|
||||
ParseUtil.bindComments(rootNode);
|
||||
return rootNode;
|
||||
return builder.getTreeBuilt();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,12 @@ package com.intellij.lang.java.parser;
|
||||
import com.intellij.codeInsight.daemon.JavaErrorMessages;
|
||||
import com.intellij.lang.*;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.psi.JavaTokenType;
|
||||
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.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import com.intellij.util.diff.FlyweightCapableTreeStructure;
|
||||
@@ -34,11 +38,77 @@ public class JavaParserUtil {
|
||||
private static final Key<LanguageLevel> LANG_LEVEL_KEY = Key.create("JavaParserUtil.LanguageLevel");
|
||||
|
||||
public static final WhitespacesAndCommentsProcessor GREEDY_RIGHT_EDGE_PROCESSOR = new WhitespacesAndCommentsProcessor() {
|
||||
public int process(final List<IElementType> tokens) {
|
||||
public int process(final List<IElementType> tokens, final boolean atStreamEdge, final TokenTextGetter getter) {
|
||||
return tokens.size();
|
||||
}
|
||||
};
|
||||
|
||||
private static class PrecedingWhitespacesAndCommentsProcessor implements WhitespacesAndCommentsProcessor {
|
||||
private final boolean myAfterEmptyImport;
|
||||
|
||||
public PrecedingWhitespacesAndCommentsProcessor(final boolean afterImport) {
|
||||
this.myAfterEmptyImport = afterImport;
|
||||
}
|
||||
|
||||
public int process(final List<IElementType> tokens, final boolean atStreamEdge, final TokenTextGetter
|
||||
getter) {
|
||||
if (tokens.size() == 0) return 0;
|
||||
|
||||
// 1. bind doc comment
|
||||
for (int idx = tokens.size() - 1; idx >= 0; idx--) {
|
||||
if (tokens.get(idx) == JavaDocElementType.DOC_COMMENT) return idx;
|
||||
}
|
||||
|
||||
// 2. bind plain comments
|
||||
int result = tokens.size();
|
||||
for (int idx = tokens.size() - 1; idx >= 0; idx--) {
|
||||
final IElementType tokenType = tokens.get(idx);
|
||||
if (ElementType.JAVA_WHITESPACE_BIT_SET.contains(tokenType)) {
|
||||
if (StringUtil.getLineBreakCount(getter.get(idx)) > 1) break;
|
||||
}
|
||||
else if (ElementType.JAVA_PLAIN_COMMENT_BIT_SET.contains(tokenType)) {
|
||||
if (atStreamEdge ||
|
||||
(idx == 0 && myAfterEmptyImport) ||
|
||||
(idx > 0 && ElementType.JAVA_WHITESPACE_BIT_SET.contains(tokens.get(idx - 1)) && StringUtil.containsLineBreak(getter.get(idx - 1)))) {
|
||||
result = idx;
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static class TrailingWhitespacesAndCommentsProcessor implements WhitespacesAndCommentsProcessor {
|
||||
public int process(final List<IElementType> tokens, final boolean atStreamEdge, final TokenTextGetter getter) {
|
||||
if (tokens.size() == 0) return 0;
|
||||
|
||||
int result = 0;
|
||||
for (int idx = 0; idx < tokens.size(); idx++) {
|
||||
final IElementType tokenType = tokens.get(idx);
|
||||
if (ElementType.JAVA_WHITESPACE_BIT_SET.contains(tokenType)) {
|
||||
if (StringUtil.containsLineBreak(getter.get(idx))) break;
|
||||
}
|
||||
else if (ElementType.JAVA_PLAIN_COMMENT_BIT_SET.contains(tokenType)) {
|
||||
result = idx + 1;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static final TokenSet PRECEDING_COMMENT_SET = ElementType.FULL_MEMBER_BIT_SET;
|
||||
private static final TokenSet TRAILING_COMMENT_SET = TokenSet.orSet(
|
||||
TokenSet.create(JavaElementType.PACKAGE_STATEMENT),
|
||||
ElementType.IMPORT_STATEMENT_BASE_BIT_SET, ElementType.FULL_MEMBER_BIT_SET, ElementType.JAVA_STATEMENT_BIT_SET);
|
||||
|
||||
public static final WhitespacesAndCommentsProcessor PRECEDING_COMMENT_BINDER = new PrecedingWhitespacesAndCommentsProcessor(false);
|
||||
public static final WhitespacesAndCommentsProcessor SPECIAL_PRECEDING_COMMENT_BINDER = new PrecedingWhitespacesAndCommentsProcessor(true);
|
||||
public static final WhitespacesAndCommentsProcessor TRAILING_COMMENT_BINDER = new TrailingWhitespacesAndCommentsProcessor();
|
||||
|
||||
private JavaParserUtil() { }
|
||||
|
||||
public static void setLanguageLevel(final PsiBuilder builder, final LanguageLevel level) {
|
||||
@@ -57,12 +127,19 @@ public class JavaParserUtil {
|
||||
return level;
|
||||
}
|
||||
|
||||
public static void done(final PsiBuilder.Marker marker, final IElementType type) {
|
||||
marker.done(type);
|
||||
final WhitespacesAndCommentsProcessor left = PRECEDING_COMMENT_SET.contains(type) ? PRECEDING_COMMENT_BINDER : null;
|
||||
final WhitespacesAndCommentsProcessor right = TRAILING_COMMENT_SET.contains(type) ? TRAILING_COMMENT_BINDER : null;
|
||||
marker.setCustomEdgeProcessors(left, right);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static IElementType exprType(@Nullable final PsiBuilder.Marker marker) {
|
||||
return marker != null ? ((LighterASTNode)marker).getTokenType() : null;
|
||||
}
|
||||
|
||||
// used instead of PsiBuilder.error() as it drops all but first subsequent error messages
|
||||
// used instead of PsiBuilder.error() as it keeps all subsequent error messages
|
||||
public static void error(final PsiBuilder builder, final String message) {
|
||||
builder.mark().error(message);
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public class StatementParser {
|
||||
|
||||
final boolean greedyBlock = !expectOrError(builder, JavaTokenType.RBRACE, JavaErrorMessages.message("expected.rbrace"));
|
||||
|
||||
codeBlock.done(JavaElementType.CODE_BLOCK);
|
||||
done(codeBlock, JavaElementType.CODE_BLOCK);
|
||||
if (greedyBlock) {
|
||||
codeBlock.setCustomEdgeProcessors(null, GREEDY_RIGHT_EDGE_PROCESSOR);
|
||||
}
|
||||
@@ -214,7 +214,7 @@ public class StatementParser {
|
||||
else if (tokenType == JavaTokenType.SEMICOLON) {
|
||||
final PsiBuilder.Marker empty = builder.mark();
|
||||
builder.advanceLexer();
|
||||
empty.done(JavaElementType.EMPTY_STATEMENT);
|
||||
done(empty, JavaElementType.EMPTY_STATEMENT);
|
||||
return empty;
|
||||
}
|
||||
else if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.AT) {
|
||||
@@ -230,7 +230,7 @@ public class StatementParser {
|
||||
ReferenceParser.parseType(builder, false, false);
|
||||
error(builder, JavaErrorMessages.message("expected.identifier"));
|
||||
}
|
||||
declStatement.done(JavaElementType.DECLARATION_STATEMENT);
|
||||
done(declStatement, JavaElementType.DECLARATION_STATEMENT);
|
||||
return declStatement;
|
||||
}
|
||||
}
|
||||
@@ -255,15 +255,15 @@ public class StatementParser {
|
||||
}
|
||||
if (count > 1) {
|
||||
pos.drop();
|
||||
list.done(JavaElementType.EXPRESSION_LIST);
|
||||
done(list, JavaElementType.EXPRESSION_LIST);
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.EXPRESSION_LIST_STATEMENT);
|
||||
done(statement, JavaElementType.EXPRESSION_LIST_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
if (exprType(expr) != JavaElementType.REFERENCE_EXPRESSION) {
|
||||
drop(list, pos);
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.EXPRESSION_STATEMENT);
|
||||
done(statement, JavaElementType.EXPRESSION_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
pos.rollbackTo();
|
||||
@@ -275,7 +275,7 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker decl = DeclarationParser.parse(builder, DeclarationParser.Context.CODE_BLOCK);
|
||||
if (decl != null) {
|
||||
final PsiBuilder.Marker statement = decl.precede();
|
||||
statement.done(JavaElementType.DECLARATION_STATEMENT);
|
||||
done(statement, JavaElementType.DECLARATION_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker statement = builder.mark();
|
||||
advance(builder, 2);
|
||||
parseStatement(builder);
|
||||
statement.done(JavaElementType.LABELED_STATEMENT);
|
||||
done(statement, JavaElementType.LABELED_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -291,7 +291,7 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker statement = builder.mark();
|
||||
ExpressionParser.parse(builder);
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.EXPRESSION_STATEMENT);
|
||||
done(statement, JavaElementType.EXPRESSION_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -311,19 +311,19 @@ public class StatementParser {
|
||||
builder.advanceLexer();
|
||||
|
||||
if (!parseExpressionInParenth(builder)) {
|
||||
statement.done(JavaElementType.IF_STATEMENT);
|
||||
done(statement, JavaElementType.IF_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
final PsiBuilder.Marker thenStatement = parseStatement(builder);
|
||||
if (thenStatement == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
statement.done(JavaElementType.IF_STATEMENT);
|
||||
done(statement, JavaElementType.IF_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
if (!expect(builder, JavaTokenType.ELSE_KEYWORD)) {
|
||||
statement.done(JavaElementType.IF_STATEMENT);
|
||||
done(statement, JavaElementType.IF_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -332,7 +332,7 @@ public class StatementParser {
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.IF_STATEMENT);
|
||||
done(statement, JavaElementType.IF_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -342,7 +342,7 @@ public class StatementParser {
|
||||
builder.advanceLexer();
|
||||
|
||||
if (!parseExpressionInParenth(builder)) {
|
||||
statement.done(JavaElementType.WHILE_STATEMENT);
|
||||
done(statement, JavaElementType.WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -351,7 +351,7 @@ public class StatementParser {
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.WHILE_STATEMENT);
|
||||
done(statement, JavaElementType.WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -362,7 +362,7 @@ public class StatementParser {
|
||||
|
||||
if (!expect(builder, JavaTokenType.LPARENTH)) {
|
||||
error(builder, JavaErrorMessages.message("expected.lparen"));
|
||||
statement.done(JavaElementType.FOR_STATEMENT);
|
||||
done(statement, JavaElementType.FOR_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -384,7 +384,7 @@ public class StatementParser {
|
||||
if (init == null){
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
if (!expect(builder, JavaTokenType.RPARENTH)) {
|
||||
statement.done(JavaElementType.FOR_STATEMENT);
|
||||
done(statement, JavaElementType.FOR_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
}
|
||||
@@ -393,7 +393,7 @@ public class StatementParser {
|
||||
if (!expect(builder, JavaTokenType.SEMICOLON)) {
|
||||
error(builder, JavaErrorMessages.message("expected.semicolon"));
|
||||
if (!expect(builder, JavaTokenType.RPARENTH)) {
|
||||
statement.done(JavaElementType.FOR_STATEMENT);
|
||||
done(statement, JavaElementType.FOR_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
}
|
||||
@@ -401,7 +401,7 @@ public class StatementParser {
|
||||
parseExpressionOrExpressionList(builder);
|
||||
if (!expect(builder, JavaTokenType.RPARENTH)) {
|
||||
error(builder, JavaErrorMessages.message("expected.rparen"));
|
||||
statement.done(JavaElementType.FOR_STATEMENT);
|
||||
done(statement, JavaElementType.FOR_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
}
|
||||
@@ -412,7 +412,7 @@ public class StatementParser {
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.FOR_STATEMENT);
|
||||
done(statement, JavaElementType.FOR_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -423,7 +423,7 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker expressionStatement;
|
||||
if (builder.getTokenType() != JavaTokenType.COMMA) {
|
||||
expressionStatement = expr.precede();
|
||||
expressionStatement.done(JavaElementType.EXPRESSION_STATEMENT);
|
||||
done(expressionStatement, JavaElementType.EXPRESSION_STATEMENT);
|
||||
}
|
||||
else {
|
||||
final PsiBuilder.Marker expressionList = expr.precede();
|
||||
@@ -438,8 +438,8 @@ public class StatementParser {
|
||||
}
|
||||
while (builder.getTokenType() == JavaTokenType.COMMA);
|
||||
|
||||
expressionList.done(JavaElementType.EXPRESSION_LIST);
|
||||
expressionStatement.done(JavaElementType.EXPRESSION_LIST_STATEMENT);
|
||||
done(expressionList, JavaElementType.EXPRESSION_LIST);
|
||||
done(expressionStatement, JavaElementType.EXPRESSION_LIST_STATEMENT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -462,7 +462,7 @@ public class StatementParser {
|
||||
error(builder, JavaErrorMessages.message("expected.rparen"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.FOREACH_STATEMENT);
|
||||
done(statement, JavaElementType.FOREACH_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -474,13 +474,13 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker body = parseStatement(builder);
|
||||
if (body == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
statement.done(JavaElementType.DO_WHILE_STATEMENT);
|
||||
done(statement, JavaElementType.DO_WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
if (!expect(builder, JavaTokenType.WHILE_KEYWORD)) {
|
||||
error(builder, JavaErrorMessages.message("expected.while"));
|
||||
statement.done(JavaElementType.DO_WHILE_STATEMENT);
|
||||
done(statement, JavaElementType.DO_WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -488,7 +488,7 @@ public class StatementParser {
|
||||
semicolon(builder);
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.DO_WHILE_STATEMENT);
|
||||
done(statement, JavaElementType.DO_WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -498,7 +498,7 @@ public class StatementParser {
|
||||
builder.advanceLexer();
|
||||
|
||||
if (!parseExpressionInParenth(builder)) {
|
||||
statement.done(JavaElementType.SWITCH_STATEMENT);
|
||||
done(statement, JavaElementType.SWITCH_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -507,7 +507,7 @@ public class StatementParser {
|
||||
error(builder, JavaErrorMessages.message("expected.lbrace"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.SWITCH_STATEMENT);
|
||||
done(statement, JavaElementType.SWITCH_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -527,7 +527,7 @@ public class StatementParser {
|
||||
|
||||
expectOrError(builder, JavaTokenType.COLON, JavaErrorMessages.message("expected.colon"));
|
||||
|
||||
statement.done(JavaElementType.SWITCH_LABEL_STATEMENT);
|
||||
done(statement, JavaElementType.SWITCH_LABEL_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -537,7 +537,7 @@ public class StatementParser {
|
||||
builder.advanceLexer();
|
||||
expect(builder, JavaTokenType.IDENTIFIER);
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.BREAK_STATEMENT);
|
||||
done(statement, JavaElementType.BREAK_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -547,7 +547,7 @@ public class StatementParser {
|
||||
builder.advanceLexer();
|
||||
expect(builder, JavaTokenType.IDENTIFIER);
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.CONTINUE_STATEMENT);
|
||||
done(statement, JavaElementType.CONTINUE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -559,7 +559,7 @@ public class StatementParser {
|
||||
ExpressionParser.parse(builder);
|
||||
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.RETURN_STATEMENT);
|
||||
done(statement, JavaElementType.RETURN_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -571,12 +571,12 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
|
||||
if (expr == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.expression"));
|
||||
statement.done(JavaElementType.THROW_STATEMENT);
|
||||
done(statement, JavaElementType.THROW_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.THROW_STATEMENT);
|
||||
done(statement, JavaElementType.THROW_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -586,7 +586,7 @@ public class StatementParser {
|
||||
builder.advanceLexer();
|
||||
|
||||
if (!parseExpressionInParenth(builder)) {
|
||||
statement.done(JavaElementType.SYNCHRONIZED_STATEMENT);
|
||||
done(statement, JavaElementType.SYNCHRONIZED_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -595,7 +595,7 @@ public class StatementParser {
|
||||
error(builder, JavaErrorMessages.message("expected.lbrace"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.SYNCHRONIZED_STATEMENT);
|
||||
done(statement, JavaElementType.SYNCHRONIZED_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -607,13 +607,13 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker tryBlock = parseCodeBlock(builder);
|
||||
if (tryBlock == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.lbrace"));
|
||||
statement.done(JavaElementType.TRY_STATEMENT);
|
||||
done(statement, JavaElementType.TRY_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
if (!TRY_CLOSERS_SET.contains(builder.getTokenType())) {
|
||||
error(builder, JavaErrorMessages.message("expected.catch.or.finally"));
|
||||
statement.done(JavaElementType.TRY_STATEMENT);
|
||||
done(statement, JavaElementType.TRY_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -628,7 +628,7 @@ public class StatementParser {
|
||||
}
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.TRY_STATEMENT);
|
||||
done(statement, JavaElementType.TRY_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -638,7 +638,7 @@ public class StatementParser {
|
||||
|
||||
if (!expect(builder, JavaTokenType.LPARENTH)) {
|
||||
error(builder, JavaErrorMessages.message("expected.lparen"));
|
||||
section.done(JavaElementType.CATCH_SECTION);
|
||||
done(section, JavaElementType.CATCH_SECTION);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -649,18 +649,18 @@ public class StatementParser {
|
||||
|
||||
if (!expect(builder, JavaTokenType.RPARENTH)) {
|
||||
error(builder, JavaErrorMessages.message("expected.rparen"));
|
||||
section.done(JavaElementType.CATCH_SECTION);
|
||||
done(section, JavaElementType.CATCH_SECTION);
|
||||
return false;
|
||||
}
|
||||
|
||||
final PsiBuilder.Marker body = parseCodeBlock(builder);
|
||||
if (body == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.lbrace"));
|
||||
section.done(JavaElementType.CATCH_SECTION);
|
||||
done(section, JavaElementType.CATCH_SECTION);
|
||||
return false;
|
||||
}
|
||||
|
||||
section.done(JavaElementType.CATCH_SECTION);
|
||||
done(section, JavaElementType.CATCH_SECTION);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -672,7 +672,7 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
|
||||
if (expr == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.boolean.expression"));
|
||||
statement.done(JavaElementType.ASSERT_STATEMENT);
|
||||
done(statement, JavaElementType.ASSERT_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -680,13 +680,13 @@ public class StatementParser {
|
||||
final PsiBuilder.Marker expr2 = ExpressionParser.parse(builder);
|
||||
if (expr2 == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.expression"));
|
||||
statement.done(JavaElementType.ASSERT_STATEMENT);
|
||||
done(statement, JavaElementType.ASSERT_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
}
|
||||
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.ASSERT_STATEMENT);
|
||||
done(statement, JavaElementType.ASSERT_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@@ -694,7 +694,7 @@ public class StatementParser {
|
||||
private static PsiBuilder.Marker parseBlockStatement(final PsiBuilder builder) {
|
||||
final PsiBuilder.Marker statement = builder.mark();
|
||||
parseCodeBlock(builder);
|
||||
statement.done(JavaElementType.BLOCK_STATEMENT);
|
||||
done(statement, JavaElementType.BLOCK_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,10 +52,6 @@ public class ParseUtil extends ParseUtilBase {
|
||||
inserter.invoke();
|
||||
}
|
||||
|
||||
public static void bindComments(final ASTNode root) {
|
||||
JavaMissingTokenInserter.bindComments(root);
|
||||
}
|
||||
|
||||
private static class JavaMissingTokenInserter extends MissingTokenInserter {
|
||||
public JavaMissingTokenInserter(final CompositeElement root,
|
||||
final Lexer lexer,
|
||||
|
||||
Reference in New Issue
Block a user