antlrparserplugin.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 1,753 行 · 第 1/5 页
JAVA
1,753 行
break;
case METHOD_DEF:
methodDef(node);
break;
case CTOR_IDENT:
constructorDef(node);
break;
case VARIABLE_DEF:
fieldDef(node);
break;
case STATIC_INIT:
staticInit(node);
break;
case INSTANCE_INIT:
objectInit(node);
break;
default:
unknownAST(node);
}
}
}
protected void throwsList(AST node,List list) {
String clazz = identifier(node);
ClassNode exception = ClassHelper.make(clazz);
list.add(exception);
AST next = node.getNextSibling();
if (next!=null) throwsList(next, list);
next = node.getFirstChild();
if (next!=null) throwsList(next, list);
}
protected void methodDef(AST methodDef) {
List annotations = new ArrayList();
AST node = methodDef.getFirstChild();
int modifiers = Opcodes.ACC_PUBLIC;
if (isType(MODIFIERS, node)) {
modifiers = modifiers(node, annotations, modifiers);
node = node.getNextSibling();
}
if (classNode!=null && (classNode.getModifiers() & Opcodes.ACC_INTERFACE) >0) {
modifiers |= Opcodes.ACC_ABSTRACT;
}
ClassNode returnType = null;
if (isType(TYPE, node)) {
returnType = makeType(node);
node = node.getNextSibling();
}
String name = identifier(node);
if (classNode != null) {
if (classNode.getNameWithoutPackage().equals(name)) {
throw new ASTRuntimeException(methodDef, "Invalid constructor format. Try remove the 'def' expression?");
}
}
node = node.getNextSibling();
assertNodeType(PARAMETERS, node);
Parameter[] parameters = parameters(node);
if (parameters==null) parameters = Parameter.EMPTY_ARRAY;
node = node.getNextSibling();
ClassNode[] exceptions=new ClassNode[0];
if (isType(LITERAL_throws, node)) {
AST throwsNode = node.getFirstChild();
List exceptionList = new ArrayList();
throwsList(throwsNode, exceptionList);
exceptions = (ClassNode[]) exceptionList.toArray(exceptions);
node = node.getNextSibling();
}
Statement code = null;
if ((modifiers & Opcodes.ACC_ABSTRACT) == 0) {
if (node==null) {
throw new ASTRuntimeException(methodDef, "You defined a method without body. Try adding a body, or declare it abstract.");
}
assertNodeType(SLIST, node);
code = statementList(node);
}
MethodNode methodNode = new MethodNode(name, modifiers, returnType, parameters, exceptions, code);
methodNode.addAnnotations(annotations);
configureAST(methodNode, methodDef);
if (classNode != null) {
classNode.addMethod(methodNode);
}
else {
output.addMethod(methodNode);
}
}
protected void staticInit(AST staticInit) {
BlockStatement code = (BlockStatement) statementList(staticInit);
classNode.addStaticInitializerStatements(code.getStatements(),false);
}
protected void objectInit(AST init) {
BlockStatement code = (BlockStatement) statementList(init);
classNode.addObjectInitializerStatements(code);
}
protected void constructorDef(AST constructorDef) {
List annotations = new ArrayList();
AST node = constructorDef.getFirstChild();
int modifiers = Opcodes.ACC_PUBLIC;
if (isType(MODIFIERS, node)) {
modifiers = modifiers(node, annotations, modifiers);
node = node.getNextSibling();
}
assertNodeType(PARAMETERS, node);
Parameter[] parameters = parameters(node);
if (parameters == null) parameters = Parameter.EMPTY_ARRAY;
node = node.getNextSibling();
ClassNode[] exceptions=new ClassNode[0];
if (isType(LITERAL_throws, node)) {
AST throwsNode = node.getFirstChild();
List exceptionList = new ArrayList();
throwsList(throwsNode, exceptionList);
exceptions = (ClassNode[]) exceptionList.toArray(exceptions);
node = node.getNextSibling();
}
assertNodeType(SLIST, node);
Statement code = statementList(node);
ConstructorNode constructorNode = classNode.addConstructor(modifiers, parameters, exceptions, code);
constructorNode.addAnnotations(annotations);
configureAST(constructorNode, constructorDef);
}
protected void fieldDef(AST fieldDef) {
List annotations = new ArrayList();
AST node = fieldDef.getFirstChild();
int modifiers = 0;
if (isType(MODIFIERS, node)) {
modifiers = modifiers(node, annotations, modifiers);
node = node.getNextSibling();
}
if (classNode.isInterface()) {
modifiers |= Opcodes.ACC_STATIC | Opcodes.ACC_FINAL;
if ( (modifiers & (Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED)) == 0) {
modifiers |= Opcodes.ACC_PUBLIC;
}
}
ClassNode type = null;
if (isType(TYPE, node)) {
type = makeType(node);
node = node.getNextSibling();
}
String name = identifier(node);
node = node.getNextSibling();
Expression initialValue = null;
if (node != null) {
assertNodeType(ASSIGN, node);
initialValue = expression(node);
}
if (initialValue == null && type != null) {
if (type==ClassHelper.int_TYPE) {
initialValue = new ConstantExpression(new Integer(0));
}
else if (type==ClassHelper.long_TYPE) {
initialValue = new ConstantExpression(new Long(0L));
}
else if (type==ClassHelper.double_TYPE) {
initialValue = new ConstantExpression(new Double(0.0));
}
else if (type==ClassHelper.float_TYPE) {
initialValue = new ConstantExpression(new Float(0.0F));
}
else if (type==ClassHelper.boolean_TYPE) {
initialValue = ConstantExpression.FALSE;
}
else if (type==ClassHelper.short_TYPE) {
initialValue = new ConstantExpression(new Short((short) 0));
}
else if (type==ClassHelper.byte_TYPE) {
initialValue = new ConstantExpression(new Byte((byte) 0));
}
else if (type==ClassHelper.char_TYPE) {
initialValue = new ConstantExpression(new Character((char) 0));
}
}
FieldNode fieldNode = new FieldNode(name, modifiers, type, classNode, initialValue);
fieldNode.addAnnotations(annotations);
configureAST(fieldNode, fieldDef);
if (!hasVisibility(modifiers)) {
// lets set the modifiers on the field
int fieldModifiers = 0;
int flags = Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT | Opcodes.ACC_VOLATILE | Opcodes.ACC_FINAL;
if (!hasVisibility(modifiers)) {
modifiers |= Opcodes.ACC_PUBLIC;
fieldModifiers |= Opcodes.ACC_PRIVATE;
}
// lets pass along any other modifiers we need
fieldModifiers |= (modifiers & flags);
fieldNode.setModifiers(fieldModifiers);
PropertyNode propertyNode = new PropertyNode(fieldNode, modifiers, null, null);
configureAST(propertyNode, fieldDef);
classNode.addProperty(propertyNode);
}
else {
fieldNode.setModifiers(modifiers);
classNode.addField(fieldNode);
}
}
protected ClassNode[] interfaces(AST node) {
List interfaceList = new ArrayList();
for (AST implementNode = node.getFirstChild(); implementNode != null; implementNode = implementNode.getNextSibling()) {
interfaceList.add(ClassHelper.make(qualifiedName(implementNode)));
}
ClassNode[] interfaces = {};
if (!interfaceList.isEmpty()) {
interfaces = new ClassNode[interfaceList.size()];
interfaceList.toArray(interfaces);
}
return interfaces;
}
protected Parameter[] parameters(AST parametersNode) {
AST node = parametersNode.getFirstChild();
if (node == null) {
if (isType(IMPLICIT_PARAMETERS, parametersNode)) return Parameter.EMPTY_ARRAY;
return null;
}
else {
List parameters = new ArrayList();
do {
parameters.add(parameter(node));
node = node.getNextSibling();
}
while (node != null);
Parameter[] answer = new Parameter[parameters.size()];
parameters.toArray(answer);
return answer;
}
}
protected Parameter parameter(AST paramNode) {
List annotations = new ArrayList();
AST node = paramNode.getFirstChild();
int modifiers = 0;
if (isType(MODIFIERS, node)) {
modifiers = modifiers(node, annotations, modifiers);
node = node.getNextSibling();
}
ClassNode type = ClassHelper.DYNAMIC_TYPE;
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, paramNode);
Parameter parameter = null;
if (node != null) {
assertNodeType(ASSIGN, node);
Expression rightExpression = expression(node.getFirstChild());
parameter = new Parameter(type, name, rightExpression);
}
else
parameter = new Parameter(type, name);
// TODO
//configureAST(parameter,paramNode);
//parameter.addAnnotations(annotations);
return parameter;
}
protected int modifiers(AST modifierNode, List annotations, int defaultModifiers) {
assertNodeType(MODIFIERS, modifierNode);
boolean access = false;
int answer = 0;
for (AST node = modifierNode.getFirstChild(); node != null; node = node.getNextSibling()) {
int type = node.getType();
switch (type) {
// annotations
case ANNOTATION:
annotations.add(annotation(node));
break;
// core access scope modifiers
case LITERAL_private:
answer = setModifierBit(node, answer, Opcodes.ACC_PRIVATE);
access = setAccessTrue(node, access);
break;
case LITERAL_protected:
answer = setModifierBit(node, answer, Opcodes.ACC_PROTECTED);
access = setAccessTrue(node, access);
break;
case LITERAL_public:
answer = setModifierBit(node, answer, Opcodes.ACC_PUBLIC);
access = setAccessTrue(node, access);
break;
// other modifiers
case ABSTRACT:
answer = setModifierBit(node, answer, Opcodes.ACC_ABSTRACT);
break;
case FINAL:
answer = setModifierBit(node, answer, Opcodes.ACC_FINAL);
break;
case LITERAL_native:
answer = setModifierBit(node, answer, Opcodes.ACC_NATIVE);
break;
case LITERAL_static:
answer = setModifierBit(node, answer, Opcodes.ACC_STATIC);
break;
case STRICTFP:
answer = setModifierBit(node, answer, Opcodes.ACC_STRICT);
break;
case LITERAL_synchronized:
answer = setModifierBit(node, answer, Opcodes.ACC_SYNCHRONIZED);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?