diff --git a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index fa31733fbcd3..0bd4cf719fd7 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -63,8 +63,8 @@ public class DeclarationParser { } @Nullable - private static PsiBuilder.Marker parseClassFromKeyword(final PsiBuilder builder, final PsiBuilder.Marker declaration, - final boolean isAnnotation, final Context context) { + public static PsiBuilder.Marker parseClassFromKeyword(final PsiBuilder builder, final PsiBuilder.Marker declaration, + final boolean isAnnotation, final Context context) { final IElementType keywordTokenType = builder.getTokenType(); assert ElementType.CLASS_KEYWORD_BIT_SET.contains(keywordTokenType) : keywordTokenType; builder.advanceLexer(); @@ -364,13 +364,18 @@ public class DeclarationParser { @NotNull private static Pair parseModifierList(final PsiBuilder builder) { + return parseModifierList(builder, ElementType.MODIFIER_BIT_SET); + } + + @NotNull + public static Pair parseModifierList(final PsiBuilder builder, final TokenSet modifiers) { final PsiBuilder.Marker modList = builder.mark(); boolean isEmpty = true; while (true) { final IElementType tokenType = builder.getTokenType(); if (tokenType == null) break; - if (ElementType.MODIFIER_BIT_SET.contains(tokenType)) { + if (modifiers.contains(tokenType)) { builder.advanceLexer(); isEmpty = false; } @@ -441,7 +446,7 @@ public class DeclarationParser { } @NotNull - private static PsiBuilder.Marker parseParameterList(final PsiBuilder builder) { + public static PsiBuilder.Marker parseParameterList(final PsiBuilder builder) { assert builder.getTokenType() == JavaTokenType.LPARENTH : builder.getTokenType(); final PsiBuilder.Marker paramList = builder.mark(); builder.advanceLexer(); @@ -666,7 +671,7 @@ public class DeclarationParser { } @NotNull - private static PsiBuilder.Marker parseAnnotation(final PsiBuilder builder) { + public static PsiBuilder.Marker parseAnnotation(final PsiBuilder builder) { assert builder.getTokenType() == JavaTokenType.AT : builder.getTokenType(); final PsiBuilder.Marker anno = builder.mark(); builder.advanceLexer(); diff --git a/java/java-impl/src/com/intellij/lang/java/parser/FileParser.java b/java/java-impl/src/com/intellij/lang/java/parser/FileParser.java index 8bdacf5384b3..f55fde673840 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/FileParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/FileParser.java @@ -17,6 +17,7 @@ package com.intellij.lang.java.parser; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.lang.PsiBuilder; +import com.intellij.openapi.util.Pair; import com.intellij.psi.JavaTokenType; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -73,7 +74,7 @@ public class FileParser { } @Nullable - private static PsiBuilder.Marker parsePackageStatement(final PsiBuilder builder) { + public static PsiBuilder.Marker parsePackageStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); if (!expect(builder, JavaTokenType.PACKAGE_KEYWORD)) { @@ -99,13 +100,19 @@ public class FileParser { } @NotNull - private static PsiBuilder.Marker parseImportList(final PsiBuilder builder) { + private static Pair parseImportList(final PsiBuilder builder) { + return parseImportList(builder, IMPORT_LIST_STOPPER_SET); + } + + @NotNull + public static Pair parseImportList(final PsiBuilder builder, final TokenSet stoppers) { final PsiBuilder.Marker list = builder.mark(); - if (builder.getTokenType() == JavaTokenType.IMPORT_KEYWORD) { + final boolean isEmpty = builder.getTokenType() != JavaTokenType.IMPORT_KEYWORD; + if (!isEmpty) { PsiBuilder.Marker invalidElements = null; while (!builder.eof()) { - if (IMPORT_LIST_STOPPER_SET.contains(builder.getTokenType())) break; + if (stoppers.contains(builder.getTokenType())) break; final PsiBuilder.Marker statement = parseImportStatement(builder); if (statement != null) { @@ -128,7 +135,7 @@ public class FileParser { } list.done(JavaElementType.IMPORT_LIST); - return list; + return Pair.create(list, isEmpty); } @Nullable 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 69c41c98ddba..e4120a033c54 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 @@ -97,30 +97,21 @@ public class JavaParserUtil { } public static PsiBuilder braceMatchingBuilder(final PsiBuilder builder) { - return new PsiBuilderAdapter(builder) { - private int braceCount = 1; - private int lastOffset = -1; + final PsiBuilder.Marker pos = builder.mark(); - @Override - public IElementType getTokenType() { - final IElementType tokenType = super.getTokenType(); - if (getCurrentOffset() != lastOffset) { - if (tokenType == JavaTokenType.LBRACE) { - braceCount++; - } - else if (tokenType == JavaTokenType.RBRACE) { - braceCount--; - } - lastOffset = getCurrentOffset(); - } - return (braceCount == 0 ? null : tokenType); - } + int braceCount = 1; + while (!builder.eof()) { + final IElementType tokenType = builder.getTokenType(); + if (tokenType == JavaTokenType.LBRACE) braceCount++; + else if (tokenType == JavaTokenType.RBRACE) braceCount--; + if (braceCount == 0) break; + builder.advanceLexer(); + } + final int stopAt = builder.getCurrentOffset(); - @Override - public boolean eof() { - return braceCount == 0 || super.eof(); - } - }; + pos.rollbackTo(); + + return stoppingBuilder(builder, stopAt); } public static PsiBuilder stoppingBuilder(final PsiBuilder builder, final int stopAt) { diff --git a/platform/lang-api/src/com/intellij/lang/PsiBuilderUtil.java b/platform/lang-api/src/com/intellij/lang/PsiBuilderUtil.java index 279d061aee73..26c9ffbc6f08 100644 --- a/platform/lang-api/src/com/intellij/lang/PsiBuilderUtil.java +++ b/platform/lang-api/src/com/intellij/lang/PsiBuilderUtil.java @@ -114,7 +114,7 @@ public class PsiBuilderUtil { */ public static void drop(final PsiBuilder.Marker... markers) { for (PsiBuilder.Marker marker : markers) { - marker.drop(); + if (marker != null) marker.drop(); } } }