This commit is contained in:
Roman Shevchenko
2012-06-05 21:52:04 +04:00
parent c904399321
commit 89d52d3a9e
5 changed files with 21 additions and 37 deletions
@@ -30,7 +30,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.PropertyKey;
import static com.intellij.lang.PsiBuilderUtil.expect;
import static com.intellij.lang.PsiBuilderUtil.nextTokenType;
import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class DeclarationParser {
@@ -386,7 +385,7 @@ public class DeclarationParser {
isEmpty = false;
}
else if (tokenType == JavaTokenType.AT) {
if (ElementType.KEYWORD_BIT_SET.contains(nextTokenType(builder))) {
if (ElementType.KEYWORD_BIT_SET.contains(builder.lookAhead(1))) {
break;
}
parseAnnotation(builder);
@@ -59,6 +59,8 @@ public class ExpressionParser {
private static final TokenSet ARGS_LIST_CONTINUE = TokenSet.create(
JavaTokenType.IDENTIFIER, TokenType.BAD_CHARACTER, JavaTokenType.COMMA, JavaTokenType.INTEGER_LITERAL, JavaTokenType.STRING_LITERAL);
private static final TokenSet THIS_OR_SUPER = TokenSet.create(JavaTokenType.THIS_KEYWORD, JavaTokenType.SUPER_KEYWORD);
private static final TokenSet TYPE_START = TokenSet.orSet(
ElementType.PRIMITIVE_TYPE_BIT_SET, TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.AT));
private final JavaParser myParser;
@@ -263,20 +265,16 @@ public class ExpressionParser {
final PsiBuilder.Marker typeCast = builder.mark();
builder.advanceLexer();
final ReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo(builder,
ReferenceParser.EAT_LAST_DOT |
ReferenceParser.WILDCARD);
final ReferenceParser.TypeInfo typeInfo =
myParser.getReferenceParser().parseTypeInfo(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD);
if (typeInfo == null || !expect(builder, JavaTokenType.RPARENTH)) {
typeCast.rollbackTo();
return parsePostfix(builder);
}
if (PREF_ARITHMETIC_OPS.contains(builder.getTokenType())) {
if (!typeInfo.isPrimitive) {
typeCast.rollbackTo();
return parsePostfix(builder);
}
if (PREF_ARITHMETIC_OPS.contains(builder.getTokenType()) && !typeInfo.isPrimitive) {
typeCast.rollbackTo();
return parsePostfix(builder);
}
final PsiBuilder.Marker expr = parseUnary(builder);
@@ -537,13 +535,12 @@ public class ExpressionParser {
return parseArrayInitializer(builder);
}
if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(tokenType) || tokenType == JavaTokenType.IDENTIFIER) {
final boolean primitive = tokenType != JavaTokenType.IDENTIFIER;
if (TYPE_START.contains(tokenType)) {
final PsiBuilder.Marker mark = builder.mark();
final ReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo(builder, 0);
if (typeInfo != null && (primitive || !typeInfo.hasErrors && typeInfo.isParameterized)) {
final PsiBuilder.Marker result = continueClassAccessOrMethodReference(builder, mark, primitive);
if (typeInfo != null && (typeInfo.isPrimitive || !typeInfo.hasErrors && typeInfo.isParameterized)) {
final PsiBuilder.Marker result = continueClassAccessOrMethodReference(builder, mark, typeInfo.isPrimitive);
if (result != null) return result;
}
@@ -26,7 +26,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.lang.PsiBuilderUtil.expect;
import static com.intellij.lang.PsiBuilderUtil.nextTokenType;
import static com.intellij.lang.java.parser.JavaParserUtil.*;
import static com.intellij.util.BitUtil.isSet;
@@ -317,7 +316,7 @@ public class ReferenceParser {
if (!expect(builder, JavaTokenType.GT)) {
// hack for completion
if (builder.getTokenType() == JavaTokenType.IDENTIFIER) {
if (nextTokenType(builder) == JavaTokenType.GT) {
if (builder.lookAhead(1) == JavaTokenType.GT) {
final PsiBuilder.Marker errorElement = builder.mark();
builder.advanceLexer();
errorElement.error(JavaErrorMessages.message("unexpected.identifier"));
@@ -147,7 +147,7 @@ public class StatementParser {
return;
}
else if (braceMode == BraceMode.TILL_LAST) {
if (nextTokenType(builder) == null) {
if (builder.lookAhead(1) == null) {
return;
}
}
@@ -288,7 +288,7 @@ public class StatementParser {
return statement;
}
if (lookAhead(builder, JavaTokenType.IDENTIFIER, JavaTokenType.COLON)) {
if (builder.getTokenType() == JavaTokenType.IDENTIFIER && builder.lookAhead(1) == JavaTokenType.COLON) {
final PsiBuilder.Marker statement = builder.mark();
advance(builder, 2);
parseStatement(builder);
@@ -309,7 +309,7 @@ public class StatementParser {
private static void skipQualifiedName(final PsiBuilder builder) {
if (!expect(builder, JavaTokenType.IDENTIFIER)) return;
while (lookAhead(builder, JavaTokenType.DOT, JavaTokenType.IDENTIFIER)) {
while (builder.getTokenType() == JavaTokenType.DOT && builder.lookAhead(1) == JavaTokenType.IDENTIFIER) {
advance(builder, 2);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2010 JetBrains s.r.o.
* Copyright 2000-2012 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.
@@ -19,33 +19,22 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.Nullable;
public class PsiBuilderUtil {
private PsiBuilderUtil() { }
/**
* Returns type of next token.
*
* @param builder PSI builder to operate on.
* @return type of next token or null, if the builder is at the end of token stream
* @deprecated use {@linkplain PsiBuilder#lookAhead(int)} (to remove in IDEA 13)
*/
@SuppressWarnings("UnusedDeclaration")
@Nullable
public static IElementType nextTokenType(final PsiBuilder builder) {
if (builder.getTokenType() == null) return null;
final PsiBuilder.Marker sp = builder.mark();
builder.advanceLexer();
final IElementType result = builder.getTokenType();
sp.rollbackTo();
return result;
return builder.lookAhead(1);
}
/**
* Checks if tokens in token stream form expected sequence.
*
* @param builder PSI builder to operate on.
* @param tokenTypes expected elements.
* @return true if tokens form expected sequence, false otherwise
* @deprecated use {@linkplain PsiBuilder#lookAhead(int)} (to remove in IDEA 13)
*/
@SuppressWarnings("UnusedDeclaration")
public static boolean lookAhead(final PsiBuilder builder, final IElementType... tokenTypes) {
if (tokenTypes.length == 0) return true;