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 d8ee0e01f8db..2699fad161ca 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 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 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. @@ -827,35 +827,29 @@ public class ExpressionParser { @Nullable private static IElementType getGtTokenType(final PsiBuilder builder) { - final PsiBuilder.Marker sp = builder.mark(); - IElementType tokenType = builder.getTokenType(); - if (tokenType == JavaTokenType.GT) { - builder.advanceLexer(); - if (builder.getTokenType() == JavaTokenType.GT) { - builder.advanceLexer(); - if (builder.getTokenType() == JavaTokenType.GT) { - builder.advanceLexer(); - if (builder.getTokenType() == JavaTokenType.EQ) { - tokenType = JavaTokenType.GTGTGTEQ; - } - else { - tokenType = JavaTokenType.GTGTGT; - } - } - else if (builder.getTokenType() == JavaTokenType.EQ) { - tokenType = JavaTokenType.GTGTEQ; + if (tokenType != JavaTokenType.GT) return tokenType; + + if (builder.rawLookup(1) == JavaTokenType.GT) { + if (builder.rawLookup(2) == JavaTokenType.GT) { + if (builder.rawLookup(3) == JavaTokenType.EQ) { + tokenType = JavaTokenType.GTGTGTEQ; } else { - tokenType = JavaTokenType.GTGT; + tokenType = JavaTokenType.GTGTGT; } } - else if (builder.getTokenType() == JavaTokenType.EQ) { - tokenType = JavaTokenType.GE; + else if (builder.rawLookup(2) == JavaTokenType.EQ) { + tokenType = JavaTokenType.GTGTEQ; + } + else { + tokenType = JavaTokenType.GTGT; } } + else if (builder.rawLookup(1) == JavaTokenType.EQ) { + tokenType = JavaTokenType.GE; + } - sp.rollbackTo(); return tokenType; } diff --git a/java/java-tests/testData/psi/parser-partial/expressions/Binary2.txt b/java/java-tests/testData/psi/parser-partial/expressions/Binary2.txt new file mode 100644 index 000000000000..f9e60382ce09 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/Binary2.txt @@ -0,0 +1,18 @@ +PsiJavaFile:Binary2.java + PsiAssignmentExpression:a > = b + PsiBinaryExpression:a > + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:GT('>') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiReferenceExpression:b + PsiReferenceParameterList + + PsiIdentifier:b('b') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/Binary3.txt b/java/java-tests/testData/psi/parser-partial/expressions/Binary3.txt new file mode 100644 index 000000000000..5e5a0718daf8 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/Binary3.txt @@ -0,0 +1,18 @@ +PsiJavaFile:Binary3.java + PsiAssignmentExpression:a >/**/= b + PsiBinaryExpression:a > + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:GT('>') + PsiErrorElement:Expression expected + + PsiComment(C_STYLE_COMMENT)('/**/') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiReferenceExpression:b + PsiReferenceParameterList + + PsiIdentifier:b('b') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/lexer/JavaLexerTest.java b/java/java-tests/testSrc/com/intellij/lang/java/lexer/JavaLexerTest.java index 85e3069f767d..b4e835b2a079 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/lexer/JavaLexerTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/lexer/JavaLexerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 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. @@ -54,7 +54,7 @@ public class JavaLexerTest extends LexerTestCase { "DOUBLE_LITERAL ('1e137')"); } - public void testTigerNumericLiterals() throws Exception { + public void testTigerNumericLiterals() { doTest("0xap0f 0xab.p0F 0x.abcP0f 0xabc.defP0F", "FLOAT_LITERAL ('0xap0f')\nWHITE_SPACE (' ')\n" + "FLOAT_LITERAL ('0xab.p0F')\nWHITE_SPACE (' ')\n" + @@ -115,7 +115,7 @@ public class JavaLexerTest extends LexerTestCase { "DOUBLE_LITERAL ('0xa_bc.de_fP1_234D')"); } - public void testMalformedCoinLiterals() throws Exception { + public void testMalformedCoinLiterals() { doTest("0_ _1 0_8 0x_f 0b_1 0B2 0x1.0_p-1 1.0e_1022", "INTEGER_LITERAL ('0')\nIDENTIFIER ('_')\nWHITE_SPACE (' ')\n" + "IDENTIFIER ('_1')\nWHITE_SPACE (' ')\n" + @@ -127,6 +127,13 @@ public class JavaLexerTest extends LexerTestCase { "DOUBLE_LITERAL ('1.0e')\nIDENTIFIER ('_1022')"); } + public void testMalformedOperators() { + doTest("(i > = 0)", + "LPARENTH ('(')\nIDENTIFIER ('i')\nWHITE_SPACE (' ')\n" + + "GT ('>')\nWHITE_SPACE (' ')\nEQ ('=')\n" + + "WHITE_SPACE (' ')\nINTEGER_LITERAL ('0')\nRPARENTH (')')\n"); + } + @Override protected Lexer createLexer() { return new JavaLexer(LanguageLevel.HIGHEST); diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java index fdc02ee9bf87..471190ed3179 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 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. @@ -32,6 +32,8 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testBinary0() { doParserTest("a + b"); } public void testBinary1() { doParserTest("a < b"); } + public void testBinary2() { doParserTest("a > = b"); } + public void testBinary3() { doParserTest("a >/**/= b"); } public void testCond0() { doParserTest("cond ? true : false"); } public void testCond1() { doParserTest("cond ?"); }