mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
Java 8: parse extension method bodies
This commit is contained in:
@@ -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);
|
||||
|
||||
+2
-7
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user