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 + -
显示快捷键?