Support for AspectJ parser

This commit is contained in:
Roman Shevchenko
2010-08-17 20:55:50 +04:00
parent a5e845b7cb
commit 9d20d0115e
4 changed files with 36 additions and 33 deletions
@@ -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<PsiBuilder.Marker, Boolean> parseModifierList(final PsiBuilder builder) {
return parseModifierList(builder, ElementType.MODIFIER_BIT_SET);
}
@NotNull
public static Pair<PsiBuilder.Marker, Boolean> 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();
@@ -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<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();
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
@@ -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) {
@@ -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();
}
}
}