mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
New Java parser (work in progress)
This commit is contained in:
@@ -473,14 +473,47 @@ public class StatementParser {
|
||||
|
||||
@NotNull
|
||||
private static PsiBuilder.Marker parseDoWhileStatement(final PsiBuilder builder) {
|
||||
// todo: implement
|
||||
throw new UnsupportedOperationException(builder.toString());
|
||||
final PsiBuilder.Marker statement = builder.mark();
|
||||
builder.advanceLexer();
|
||||
|
||||
final PsiBuilder.Marker body = parseStatement(builder);
|
||||
if (body == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.statement"));
|
||||
statement.done(JavaElementType.DO_WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
if (!expect(builder, JavaTokenType.WHILE_KEYWORD)) {
|
||||
error(builder, JavaErrorMessages.message("expected.while"));
|
||||
statement.done(JavaElementType.DO_WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
if (parseExpressionInParenth(builder)) {
|
||||
semicolon(builder);
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.DO_WHILE_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static PsiBuilder.Marker parseSwitchStatement(final PsiBuilder builder) {
|
||||
// todo: implement
|
||||
throw new UnsupportedOperationException(builder.toString());
|
||||
final PsiBuilder.Marker statement = builder.mark();
|
||||
builder.advanceLexer();
|
||||
|
||||
if (!parseExpressionInParenth(builder)) {
|
||||
statement.done(JavaElementType.SWITCH_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
final PsiBuilder.Marker body = parseCodeBlock(builder);
|
||||
if (body == null) {
|
||||
error(builder, JavaErrorMessages.message("expected.lbrace"));
|
||||
}
|
||||
|
||||
statement.done(JavaElementType.SWITCH_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -503,8 +536,14 @@ public class StatementParser {
|
||||
|
||||
@NotNull
|
||||
private static PsiBuilder.Marker parseReturnStatement(final PsiBuilder builder) {
|
||||
// todo: implement
|
||||
throw new UnsupportedOperationException(builder.toString());
|
||||
final PsiBuilder.Marker statement = builder.mark();
|
||||
builder.advanceLexer();
|
||||
|
||||
ExpressionParser.parse(builder);
|
||||
|
||||
semicolon(builder);
|
||||
statement.done(JavaElementType.RETURN_STATEMENT);
|
||||
return statement;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
PsiJavaFile:DoIncomplete0.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiErrorElement:Statement expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,21 @@
|
||||
PsiJavaFile:DoIncomplete1.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiErrorElement:'while' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,23 @@
|
||||
PsiJavaFile:DoIncomplete2.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiKeyword:while('while')
|
||||
PsiErrorElement:'(' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,24 @@
|
||||
PsiJavaFile:DoIncomplete3.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiKeyword:while('while')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiErrorElement:Expression expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,26 @@
|
||||
PsiJavaFile:DoIncomplete4.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiKeyword:while('while')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiErrorElement:Expression expected
|
||||
<empty list>
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,35 @@
|
||||
PsiJavaFile:DoIncomplete5.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiKeyword:while('while')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiErrorElement:Expression expected
|
||||
<empty list>
|
||||
PsiWhiteSpace('\n ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:g()
|
||||
PsiReferenceExpression:g
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:g('g')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,29 @@
|
||||
PsiJavaFile:DoIncomplete6.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiKeyword:while('while')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiReferenceExpression:cond
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:cond('cond')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiErrorElement:';' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,18 @@
|
||||
PsiJavaFile:DoNormal.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiDoWhileStatement
|
||||
PsiKeyword:do('do')
|
||||
PsiBlockStatement
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
PsiKeyword:while('while')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiLiteralExpression:true
|
||||
PsiJavaToken:TRUE_KEYWORD('true')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,10 @@
|
||||
PsiJavaFile:ReturnIncomplete0.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReturnStatement
|
||||
PsiKeyword:return('return')
|
||||
PsiErrorElement:';' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,15 @@
|
||||
PsiJavaFile:ReturnIncomplete1.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReturnStatement
|
||||
PsiKeyword:return('return')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReferenceExpression:a
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:a('a')
|
||||
PsiErrorElement:';' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,9 @@
|
||||
PsiJavaFile:ReturnNoResult.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReturnStatement
|
||||
PsiKeyword:return('return')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,12 @@
|
||||
PsiJavaFile:ReturnWithResult.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReturnStatement
|
||||
PsiKeyword:return('return')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiLiteralExpression:10
|
||||
PsiJavaToken:INTEGER_LITERAL('10')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,10 @@
|
||||
PsiJavaFile:SwitchIncomplete0.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiErrorElement:'(' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,11 @@
|
||||
PsiJavaFile:SwitchIncomplete1.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiErrorElement:Expression expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,15 @@
|
||||
PsiJavaFile:SwitchIncomplete2.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiReferenceExpression:o
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:o('o')
|
||||
PsiErrorElement:')' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,16 @@
|
||||
PsiJavaFile:SwitchIncomplete3.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiReferenceExpression:o
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:o('o')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiErrorElement:'{' expected
|
||||
<empty list>
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,15 @@
|
||||
PsiJavaFile:SwitchIncomplete4.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiErrorElement:Expression expected
|
||||
<empty list>
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,22 @@
|
||||
PsiJavaFile:SwitchIncomplete5.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiErrorElement:Expression expected
|
||||
<empty list>
|
||||
PsiWhiteSpace('\n ')
|
||||
PsiExpressionStatement
|
||||
PsiMethodCallExpression:foo()
|
||||
PsiReferenceExpression:foo
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:foo('foo')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
@@ -0,0 +1,17 @@
|
||||
PsiJavaFile:SwitchNormal.java
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiSwitchStatement
|
||||
PsiKeyword:switch('switch')
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiReferenceExpression:o
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:o('o')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiCodeBlock
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:RBRACE('}')
|
||||
+20
-3
@@ -36,7 +36,14 @@ public class StatementParserTest extends JavaParsingTestCase {
|
||||
public void testLocalVar() { doParserTest("{ List<Integer> list; }"); }
|
||||
public void testFor() { doParserTest("{ for(Iterator<String> it = null; it.hasNext();) { String s = it.next(); } }"); }
|
||||
|
||||
//DoWhileParsingTest
|
||||
public void testDoNormal() { doParserTest("{ do{}while(true); }"); }
|
||||
public void testDoIncomplete0() { doParserTest("{ do }"); }
|
||||
public void testDoIncomplete1() { doParserTest("{ do foo(); }"); }
|
||||
public void testDoIncomplete2() { doParserTest("{ do foo(); while }"); }
|
||||
public void testDoIncomplete3() { doParserTest("{ do foo(); while( }"); }
|
||||
public void testDoIncomplete4() { doParserTest("{ do foo(); while(); }"); }
|
||||
public void testDoIncomplete5() { doParserTest("{ do foo(); while(\n g(); }"); }
|
||||
public void testDoIncomplete6() { doParserTest("{ do foo(); while(cond) }"); }
|
||||
|
||||
public void testForNormal0() { doParserTest("{ for(int i = 0; i < 10; i++)\n ; }"); }
|
||||
public void testForNormal1() { doParserTest("{ for( ; ; ) foo(); }"); }
|
||||
@@ -64,8 +71,18 @@ public class StatementParserTest extends JavaParsingTestCase {
|
||||
|
||||
public void testLabelSimple() { doParserTest("{ Loop:\n while(true) ; }"); }
|
||||
|
||||
//ReturnParsingTest
|
||||
//SwitchParsingTest
|
||||
public void testReturnNoResult() { doParserTest("{ return; }"); }
|
||||
public void testReturnWithResult() { doParserTest("{ return 10; }"); }
|
||||
public void testReturnIncomplete0() { doParserTest("{ return }"); }
|
||||
public void testReturnIncomplete1() { doParserTest("{ return a }"); }
|
||||
|
||||
public void testSwitchNormal() { doParserTest("{ switch(o){} }"); }
|
||||
public void testSwitchIncomplete0() { doParserTest("{ switch }"); }
|
||||
public void testSwitchIncomplete1() { doParserTest("{ switch( }"); }
|
||||
public void testSwitchIncomplete2() { doParserTest("{ switch(o }"); }
|
||||
public void testSwitchIncomplete3() { doParserTest("{ switch(o) }"); }
|
||||
public void testSwitchIncomplete4() { doParserTest("{ switch(){} }"); }
|
||||
public void testSwitchIncomplete5() { doParserTest("{ switch(\n foo(); }"); }
|
||||
|
||||
public void testSyncNormal() { doParserTest("{ synchronized(o){} }"); }
|
||||
public void testSyncIncomplete0() { doParserTest("{ synchronized }"); }
|
||||
|
||||
Reference in New Issue
Block a user