Java Code Examples for org.codehaus.groovy.ast.MethodNode#isVoidMethod()
The following examples show how to use
org.codehaus.groovy.ast.MethodNode#isVoidMethod() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: ReturnAdder.java From groovy with Apache License 2.0 | 5 votes |
/** * Adds return statements to given method whenever an implicit return is detected. */ public void visitMethod(final MethodNode node) { if (!node.isVoidMethod()) { Statement code = node.getCode(); if (code != null) { // happens with @interface methods code = addReturnsIfNeeded(code, node.getVariableScope()); if (doAdd) node.setCode(code); } } }
Example 2
Source File: MemoizedASTTransformation.java From groovy with Apache License 2.0 | 4 votes |
public void visit(ASTNode[] nodes, final SourceUnit source) { init(nodes, source); AnnotationNode annotationNode = (AnnotationNode) nodes[0]; AnnotatedNode annotatedNode = (AnnotatedNode) nodes[1]; if (MY_TYPE.equals(annotationNode.getClassNode()) && annotatedNode instanceof MethodNode) { MethodNode methodNode = (MethodNode) annotatedNode; if (methodNode.isAbstract()) { addError("Annotation " + MY_TYPE_NAME + " cannot be used for abstract methods.", methodNode); return; } if (methodNode.isVoidMethod()) { addError("Annotation " + MY_TYPE_NAME + " cannot be used for void methods.", methodNode); return; } ClassNode ownerClassNode = methodNode.getDeclaringClass(); MethodNode delegatingMethod = buildDelegatingMethod(methodNode, ownerClassNode); addGeneratedMethod(ownerClassNode, delegatingMethod); int modifiers = FieldNode.ACC_PRIVATE | FieldNode.ACC_FINAL; if (methodNode.isStatic()) { modifiers = modifiers | FieldNode.ACC_STATIC; } int protectedCacheSize = getMemberIntValue(annotationNode, PROTECTED_CACHE_SIZE_NAME); int maxCacheSize = getMemberIntValue(annotationNode, MAX_CACHE_SIZE_NAME); MethodCallExpression memoizeClosureCallExpression = buildMemoizeClosureCallExpression(delegatingMethod, protectedCacheSize, maxCacheSize); String memoizedClosureFieldName = buildUniqueName(ownerClassNode, CLOSURE_LABEL, methodNode); FieldNode memoizedClosureField = new FieldNode(memoizedClosureFieldName, modifiers, newClass(ClassHelper.CLOSURE_TYPE), null, memoizeClosureCallExpression); ownerClassNode.addField(memoizedClosureField); BlockStatement newCode = new BlockStatement(); MethodCallExpression closureCallExpression = callX( fieldX(memoizedClosureField), CLOSURE_CALL_METHOD_NAME, args(methodNode.getParameters())); closureCallExpression.setImplicitThis(false); newCode.addStatement(returnS(closureCallExpression)); methodNode.setCode(newCode); VariableScopeVisitor visitor = new VariableScopeVisitor(source, ownerClassNode instanceof InnerClassNode); if (ownerClassNode instanceof InnerClassNode) { visitor.visitClass(((InnerClassNode) ownerClassNode).getOuterMostClass()); } else { visitor.visitClass(ownerClassNode); } } }
Example 3
Source File: AsmClassGenerator.java From groovy with Apache License 2.0 | 4 votes |
private void visitStdMethod(final MethodNode node, final boolean isConstructor, final Parameter[] parameters, final Statement code) { controller.getCompileStack().init(node.getVariableScope(), parameters); controller.getCallSiteWriter().makeSiteEntry(); MethodVisitor mv = controller.getMethodVisitor(); if (isConstructor && (code == null || !((ConstructorNode) node).firstStatementIsSpecialConstructorCall())) { boolean hasCallToSuper = false; if (code != null && isInnerClass()) { // GROOVY-4471: if the class is an inner class node, there are chances that // the call to super is already added so we must ensure not to add it twice if (code instanceof BlockStatement) { hasCallToSuper = ((BlockStatement) code).getStatements().stream() .map(statement -> statement instanceof ExpressionStatement ? ((ExpressionStatement) statement).getExpression() : null) .anyMatch(expression -> expression instanceof ConstructorCallExpression && ((ConstructorCallExpression) expression).isSuperCall()); } } if (!hasCallToSuper) { // invokes the super class constructor mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, controller.getInternalBaseClassName(), "<init>", "()V", false); } } // handle body super.visitConstructorOrMethod(node, isConstructor); controller.getCompileStack().clear(); if (node.isVoidMethod()) { mv.visitInsn(RETURN); } else { ClassNode type = node.getReturnType(); if (ClassHelper.isPrimitiveType(type)) { mv.visitLdcInsn(0); controller.getOperandStack().push(ClassHelper.int_TYPE); controller.getOperandStack().doGroovyCast(type); BytecodeHelper.doReturn(mv, type); controller.getOperandStack().remove(1); } else { mv.visitInsn(ACONST_NULL); BytecodeHelper.doReturn(mv, type); } } }