antlrparserplugin.java
来自「大名鼎鼎的java动态脚本语言。已经通过了sun的认证」· Java 代码 · 共 1,799 行 · 第 1/5 页
JAVA
1,799 行
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); 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?