Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 /*
  * Copyright 2008 the original author or authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.codehaus.groovy.ast;
import  org.objectweb.asm.Opcodes;
public class MixinASTTransformation implements ASTTransformation {
    private static final ClassNode useClassNode = new ClassNode(Mixin.class);
    public void visit(ASTNode nodes[], SourceUnit source) {
        AnnotationNode node = (AnnotationNodenodes[0];
        AnnotatedNode parent = (AnnotatedNodenodes[1];
        if (!.equals(node.getClassNode()))
          return;
        final Expression expr = node.getMember("value");
        if (expr == null) {
            return;
        }
        Expression useClasses = null;
        if (expr instanceof ClassExpression) {
            useClasses = expr;
        }
        if (expr instanceof ListExpression) {
            ListExpression listExpression = (ListExpressionexpr;
            for (Iterator it = listExpression.getExpressions().iterator(); it.hasNext(); ) {
                Expression ex = (Expressionit.next();
                if (!(ex instanceof ClassExpression))
                  return;
            }
            useClasses = expr;
        }
        if (useClasses == null)
          return;
        if (parent instanceof ClassNode) {
            ClassNode annotatedClass = (ClassNodeparent;
            final Parameter[] NOPARAMS = new Parameter[0];
            MethodNode clinit = annotatedClass.getDeclaredMethod("<clinit>"NOPARAMS);
            if (clinit == null) {
                clinit = annotatedClass.addMethod("<clinit>", Opcodes.ACC_PUBLIC|Opcodes.ACC_STATIC| Opcodes.ACC_SYNTHETIC, .NOPARAMSnullnew BlockStatement());
                clinit.setSynthetic(true);
            }
            final BlockStatement code = (BlockStatementclinit.getCode();
            code.addStatement(
                    new ExpressionStatement(
                            new MethodCallExpression(
                                    new PropertyExpression(new ClassExpression(annotatedClass), "metaClass"),
                                    "mixin",
                                    useClasses
                            )
                    )
            );
        }
    }
New to GrepCode? Check out our FAQ X