IDEA-57673

This commit is contained in:
Roman Shevchenko
2010-11-08 18:05:08 +03:00
parent 87b635ba86
commit 632af16797
3 changed files with 42 additions and 8 deletions
@@ -291,7 +291,7 @@ public class DeclarationParser {
declaration.rollbackTo();
return null;
}
return parseMethodFromLeftParenth(builder, declaration, false);
return parseMethodFromLeftParenth(builder, declaration, false, true);
}
idPos.drop();
}
@@ -345,7 +345,7 @@ public class DeclarationParser {
if (typeParams == null) {
emptyElement(type, JavaElementType.TYPE_PARAMETER_LIST);
}
return parseMethodFromLeftParenth(builder, declaration, (context == Context.ANNOTATION_INTERFACE));
return parseMethodFromLeftParenth(builder, declaration, (context == Context.ANNOTATION_INTERFACE), false);
}
}
@@ -396,10 +396,17 @@ public class DeclarationParser {
}
private static PsiBuilder.Marker parseMethodFromLeftParenth(final PsiBuilder builder, final PsiBuilder.Marker declaration,
final boolean anno) {
final boolean anno, final boolean constructor) {
parseParameterList(builder);
eatBrackets(builder);
if (constructor && builder.getTokenType() == JavaTokenType.LBRACKET) {
final PsiBuilder.Marker marker = builder.mark();
eatBrackets(builder, false);
marker.error(JavaErrorMessages.message("expected.semicolon"));
}
else {
eatBrackets(builder, true);
}
if (areTypeAnnotationsSupported(builder)) {
final PsiBuilder.Marker receiver = builder.mark();
@@ -551,7 +558,7 @@ public class DeclarationParser {
}
if (expect(builder, JavaTokenType.IDENTIFIER)) {
eatBrackets(builder);
eatBrackets(builder, true);
done(param, JavaElementType.PARAMETER);
return param;
}
@@ -586,7 +593,7 @@ public class DeclarationParser {
while (true) {
shouldRollback = true;
if (!eatBrackets(builder)) {
if (!eatBrackets(builder, true)) {
unclosed = true;
}
@@ -648,10 +655,10 @@ public class DeclarationParser {
return declaration;
}
private static boolean eatBrackets(final PsiBuilder builder) {
private static boolean eatBrackets(final PsiBuilder builder, final boolean withError) {
while (expect(builder, JavaTokenType.LBRACKET)) {
if (!expect(builder, JavaTokenType.RBRACKET)) {
error(builder, JavaErrorMessages.message("expected.rbracket"));
if (withError) error(builder, JavaErrorMessages.message("expected.rbracket"));
return false;
}
}
@@ -0,0 +1,25 @@
PsiJavaFile:ConstructorBrackets.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiMethod:A
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiIdentifier:A('A')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiErrorElement:';' expected
PsiJavaToken:LBRACKET('[')
PsiJavaToken:RBRACKET(']')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -89,6 +89,8 @@ public class DeclarationParserTest extends JavaParsingTestCase {
public void testUnclosed3() { doParserTest("{ void f(int a }", false, false); }
public void testUnclosed4() { doParserTest("{ void f(int a,, }", false, false); }
public void testUnclosed5() { doParserTest("{ void f(int a,); }", false, false); }
public void testConstructorBrackets() { doParserTest("{ A() [] { } }", false, false); }
public void testGenericMethod() { doParserTest("{ public static <E> test();\n" +
" <E> void test1();\n" +
" <E1 extends Integer, E2 extends Runnable> String test2(); }", false, false); }