diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 6004f0836481..daf235f7f142 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -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); diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java index 1f535f70b8e8..3da15c602a4b 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java @@ -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; } diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java index 3b9058ee6134..0555b567fcaa 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java @@ -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")); diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java index c97c875c0796..47e48e99547d 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java @@ -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); } } diff --git a/platform/core-api/src/com/intellij/lang/PsiBuilderUtil.java b/platform/core-api/src/com/intellij/lang/PsiBuilderUtil.java index 26c9ffbc6f08..c9a0a17ea159 100644 --- a/platform/core-api/src/com/intellij/lang/PsiBuilderUtil.java +++ b/platform/core-api/src/com/intellij/lang/PsiBuilderUtil.java @@ -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;