Java 8: parse extension method bodies

This commit is contained in:
Roman Shevchenko
2012-05-14 19:37:11 +04:00
parent d7e6e709c7
commit 4fcb275e55
9 changed files with 168 additions and 23 deletions
@@ -33,7 +33,6 @@ 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 {
private final ExpressionParser myExpressionParser;
private final StatementParser myStatementParser;
@@ -417,7 +416,7 @@ public class DeclarationParser {
}
private PsiBuilder.Marker parseMethodFromLeftParenth(final PsiBuilder builder, final PsiBuilder.Marker declaration,
final boolean anno, final boolean constructor) {
final boolean anno, final boolean constructor) {
parseParameterList(builder);
eatBrackets(builder, constructor, "expected.semicolon");
@@ -435,12 +434,14 @@ public class DeclarationParser {
myReferenceParser.parseReferenceList(builder, JavaTokenType.THROWS_KEYWORD, JavaElementType.THROWS_LIST, JavaTokenType.COMMA);
if (anno && expect(builder, JavaTokenType.DEFAULT_KEYWORD)) {
final boolean hasDefault = expect(builder, JavaTokenType.DEFAULT_KEYWORD);
if (hasDefault && anno) {
parseAnnotationValue(builder);
}
final IElementType tokenType = builder.getTokenType();
if (tokenType != JavaTokenType.SEMICOLON && tokenType != JavaTokenType.LBRACE) {
final boolean hasError = tokenType != JavaTokenType.SEMICOLON && tokenType != JavaTokenType.LBRACE;
if (hasError) {
final PsiBuilder.Marker error = builder.mark();
// heuristic: going to next line obviously means method signature is over, starting new method (actually, another one completion hack)
final CharSequence text = builder.getOriginalText();
@@ -456,10 +457,11 @@ public class DeclarationParser {
error.error(JavaErrorMessages.message("expected.lbrace.or.semicolon"));
}
if (!expect(builder, JavaTokenType.SEMICOLON)) {
if (builder.getTokenType() == JavaTokenType.LBRACE) {
myStatementParser.parseCodeBlock(builder);
}
if (hasDefault && !anno && !hasError && builder.getTokenType() != JavaTokenType.LBRACE) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
if (!expect(builder, JavaTokenType.SEMICOLON) && builder.getTokenType() == JavaTokenType.LBRACE) {
myStatementParser.parseCodeBlock(builder);
}
done(declaration, anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 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.
@@ -18,7 +18,6 @@ package com.intellij.psi.impl.source.tree.java;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.lang.ASTNode;
/**
* @author ven
*/
@@ -31,8 +30,6 @@ public class AnnotationMethodElement extends MethodElement {
public ASTNode findChildByRole(int role) {
if (role == ChildRole.ANNOTATION_DEFAULT_VALUE) {
return findChildByType(ANNOTATION_MEMBER_VALUE_BIT_SET);
} else if (role == ChildRole.DEFAULT_KEYWORD) {
return findChildByType(DEFAULT_KEYWORD);
}
return super.findChildByRole(role);
@@ -40,9 +37,7 @@ public class AnnotationMethodElement extends MethodElement {
@Override
public int getChildRole(ASTNode child) {
if (child.getElementType() == DEFAULT_KEYWORD) {
return ChildRole.DEFAULT_KEYWORD;
} else if (ANNOTATION_MEMBER_VALUE_BIT_SET.contains(child.getElementType())) {
if (ANNOTATION_MEMBER_VALUE_BIT_SET.contains(child.getElementType())) {
return ChildRole.ANNOTATION_DEFAULT_VALUE;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 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.
@@ -112,6 +112,9 @@ public class MethodElement extends CompositeElement implements Constants {
case ChildRole.CLOSING_SEMICOLON:
return TreeUtil.findChildBackward(this, SEMICOLON);
case ChildRole.DEFAULT_KEYWORD:
return findChildByType(DEFAULT_KEYWORD);
}
}
@@ -122,11 +125,6 @@ public class MethodElement extends CompositeElement implements Constants {
if (i == JavaDocElementType.DOC_COMMENT) {
return getChildRole(child, ChildRole.DOC_COMMENT);
}
else if (i == C_STYLE_COMMENT || i == END_OF_LINE_COMMENT) {
{
return ChildRoleBase.NONE;
}
}
else if (i == MODIFIER_LIST) {
return ChildRole.MODIFIER_LIST;
}
@@ -151,6 +149,9 @@ public class MethodElement extends CompositeElement implements Constants {
else if (i == SEMICOLON) {
return getChildRole(child, ChildRole.CLOSING_SEMICOLON);
}
else if (i == DEFAULT_KEYWORD) {
return ChildRole.DEFAULT_KEYWORD;
}
else {
return ChildRoleBase.NONE;
}