antlrparserplugin.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 1,753 行 · 第 1/5 页
JAVA
1,753 行
break;
case LITERAL_transient:
answer = setModifierBit(node, answer, Opcodes.ACC_TRANSIENT);
break;
case LITERAL_volatile:
answer = setModifierBit(node, answer, Opcodes.ACC_VOLATILE);
break;
default:
unknownAST(node);
}
}
if (!access) {
answer |= defaultModifiers;
}
return answer;
}
protected boolean setAccessTrue(AST node, boolean access) {
if (!access) {
return true;
}
else {
throw new ASTRuntimeException(node, "Cannot specify modifier: " + node.getText() + " when access scope has already been defined");
}
}
protected int setModifierBit(AST node, int answer, int bit) {
if ((answer & bit) != 0) {
throw new ASTRuntimeException(node, "Cannot repeat modifier: " + node.getText());
}
return answer | bit;
}
protected AnnotationNode annotation(AST annotationNode) {
AST node = annotationNode.getFirstChild();
String name = identifier(node);
AnnotationNode annotatedNode = new AnnotationNode(ClassHelper.make(name));
configureAST(annotatedNode, node);
while (true) {
node = node.getNextSibling();
if (isType(ANNOTATION_MEMBER_VALUE_PAIR, node)) {
AST memberNode = node.getFirstChild();
String param = identifier(memberNode);
Expression expression = expression(memberNode.getNextSibling());
annotatedNode.addMember(param, expression);
}
else {
break;
}
}
return annotatedNode;
}
// Statements
//-------------------------------------------------------------------------
protected Statement statement(AST node) {
Statement statement = null;
int type = node.getType();
switch (type) {
case SLIST:
case LITERAL_finally:
statement = statementList(node);
break;
case METHOD_CALL:
statement = methodCall(node);
break;
case VARIABLE_DEF:
statement = variableDef(node);
break;
case LABELED_STAT:
statement = labelledStatement(node);
break;
case LITERAL_assert:
statement = assertStatement(node);
break;
case LITERAL_break:
statement = breakStatement(node);
break;
case LITERAL_continue:
statement = continueStatement(node);
break;
case LITERAL_if:
statement = ifStatement(node);
break;
case LITERAL_for:
statement = forStatement(node);
break;
case LITERAL_return:
statement = returnStatement(node);
break;
case LITERAL_synchronized:
statement = synchronizedStatement(node);
break;
case LITERAL_switch:
statement = switchStatement(node);
break;
case LITERAL_with:
statement = withStatement(node);
break;
case LITERAL_try:
statement = tryStatement(node);
break;
case LITERAL_throw:
statement = throwStatement(node);
break;
case LITERAL_while:
statement = whileStatement(node);
break;
default:
statement = new ExpressionStatement(expression(node));
}
if (statement != null) {
configureAST(statement, node);
}
return statement;
}
protected Statement statementList(AST code) {
return statementListNoChild(code.getFirstChild());
}
protected Statement statementListNoChild(AST node) {
BlockStatement block = new BlockStatement();
// no need to configureAST(block,node); as node is probably null
for (; node != null; node = node.getNextSibling()) {
block.addStatement(statement(node));
}
return block;
}
protected Statement assertStatement(AST assertNode) {
AST node = assertNode.getFirstChild();
BooleanExpression booleanExpression = booleanExpression(node);
Expression messageExpression = null;
node = node.getNextSibling();
if (node != null) {
messageExpression = expression(node);
}
else {
messageExpression = ConstantExpression.NULL;
}
AssertStatement assertStatement = new AssertStatement(booleanExpression, messageExpression);
configureAST(assertStatement, assertNode);
return assertStatement;
}
protected Statement breakStatement(AST node) {
BreakStatement breakStatement = new BreakStatement(label(node));
configureAST(breakStatement, node);
return breakStatement;
}
protected Statement continueStatement(AST node) {
ContinueStatement continueStatement = new ContinueStatement(label(node));
configureAST(continueStatement, node);
return continueStatement;
}
protected Statement forStatement(AST forNode) {
assertNotLegacyFor(forNode);
AST inNode = forNode.getFirstChild();
AST variableNode = inNode.getFirstChild();
AST collectionNode = variableNode.getNextSibling();
ClassNode type = ClassHelper.OBJECT_TYPE;
if (isType(VARIABLE_DEF, variableNode)) {
AST typeNode = variableNode.getFirstChild();
assertNodeType(TYPE, typeNode);
type = type(typeNode);
variableNode = typeNode.getNextSibling();
}
String variable = identifier(variableNode);
Expression collectionExpression = expression(collectionNode);
Statement block = statement(inNode.getNextSibling());
Parameter forParameter = new Parameter(type,variable);
ForStatement forStatement = new ForStatement(forParameter, collectionExpression, block);
configureAST(forStatement, forNode);
return forStatement;
}
private void assertNotLegacyFor(AST forNode) {
AST childNode = forNode.getFirstChild();
boolean legacy = false;
while (childNode != null) {
int type = childNode.getType();
if (type == FOR_INIT || type == FOR_CONDITION || type == FOR_ITERATOR) {
legacy = true;
break;
}
childNode = childNode.getNextSibling();
}
if (legacy) {
throw new ASTRuntimeException(forNode, "For statement contains unexpected tokens. Possible attempt to use unsupported Java-style for loop.");
}
}
protected Statement ifStatement(AST ifNode) {
AST node = ifNode.getFirstChild();
assertNodeType(EXPR, node);
BooleanExpression booleanExpression = booleanExpression(node);
node = node.getNextSibling();
Statement ifBlock = statement(node);
Statement elseBlock = EmptyStatement.INSTANCE;
node = node.getNextSibling();
if (node != null) {
elseBlock = statement(node);
}
IfStatement ifStatement = new IfStatement(booleanExpression, ifBlock, elseBlock);
configureAST(ifStatement, ifNode);
return ifStatement;
}
protected Statement labelledStatement(AST labelNode) {
AST node = labelNode.getFirstChild();
String label = identifier(node);
Statement statement = statement(node.getNextSibling());
statement.setStatementLabel(label);
return statement;
}
protected Statement methodCall(AST code) {
Expression expression = methodCallExpression(code);
ExpressionStatement expressionStatement = new ExpressionStatement(expression);
configureAST(expressionStatement, code);
return expressionStatement;
}
protected Statement variableDef(AST variableDef) {
AST node = variableDef.getFirstChild();
ClassNode type = null;
if (isType(MODIFIERS, node)) {
node = node.getNextSibling();
}
if (isType(TYPE, node)) {
type = makeType(node);
node = node.getNextSibling();
}
String name = identifier(node);
node = node.getNextSibling();
VariableExpression leftExpression = new VariableExpression(name, type);
configureAST(leftExpression, variableDef);
Expression rightExpression = ConstantExpression.NULL;
if (node != null) {
assertNodeType(ASSIGN, node);
rightExpression = expression(node.getFirstChild());
}
Token token = makeToken(Types.ASSIGN, variableDef);
// TODO should we have a variable declaration statement?
DeclarationExpression expression = new DeclarationExpression(leftExpression, token, rightExpression);
configureAST(expression, variableDef);
ExpressionStatement expressionStatement = new ExpressionStatement(expression);
configureAST(expressionStatement, variableDef);
return expressionStatement;
}
protected Statement returnStatement(AST node) {
AST exprNode = node.getFirstChild();
// This will pick up incorrect sibling node if 'node' is a plain 'return'
//
//if (exprNode == null) {
// exprNode = node.getNextSibling();
//}
if (exprNode != null) {
Expression expression = expression(exprNode);
if (expression instanceof ConstantExpression) {
ConstantExpression constantExpr = (ConstantExpression) expression;
if (constantExpr.getValue() == null) {
return ReturnStatement.RETURN_NULL_OR_VOID;
}
}
ReturnStatement returnStatement = new ReturnStatement(expression);
configureAST(returnStatement, node);
return returnStatement;
}
else {
return ReturnStatement.RETURN_NULL_OR_VOID;
}
}
protected Statement switchStatement(AST switchNode) {
AST node = switchNode.getFirstChild();
Expression expression = expression(node);
Statement defaultStatement = EmptyStatement.INSTANCE;
List list = new ArrayList();
for (node = node.getNextSibling(); isType(CASE_GROUP, node); node = node.getNextSibling()) {
AST child = node.getFirstChild();
if (isType(LITERAL_case, child)) {
list.add(caseStatement(child));
} else {
defaultStatement = statement(child.getNextSibling());
}
}
if (node != null) {
unknownAST(node);
}
SwitchStatement switchStatement = new SwitchStatement(expression, list, defaultStatement);
configureAST(switchStatement, switchNode);
return switchStatement;
}
protected CaseStatement caseStatement(AST node) {
List expressions = new ArrayList();
Statement statement = EmptyStatement.INSTANCE;
AST nextSibling = node;
do {
Expression expression = expression(nextSibling.getFirstChild());
expressions.add(expression);
nextSibling = nextSibling.getNextSibling();
} while (isType(LITERAL_case, nextSibling));
if (!isType(LITERAL_default, nextSibling) && nextSibling != null) {
statement = statement(nextSibling);
}
CaseStatement answer;
if (expressions.size() == 1) {
// single case uses original code for effiiency
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?