001    /*******************************************************************************
002     * Copyright (c) 2004 IBM Corporation and others.
003     * All rights reserved.   This program and the accompanying materials
004     * are made available under the terms of the Common Public License v1.0
005     * which accompanies this distribution, and is available at
006     * http://www.eclipse.org/legal/cpl-v10.html
007     * 
008     * Contributors:
009     * IBM - Initial API and implementation
010     ******************************************************************************/
011    
012    
013    package org.codehaus.groovy.classgen;
014    
015    import java.util.ArrayList;
016    import java.util.Iterator;
017    import java.util.List;
018    
019    import org.codehaus.groovy.ast.ClassNode;
020    import org.codehaus.groovy.ast.ConstructorNode;
021    import org.codehaus.groovy.ast.FieldNode;
022    import org.codehaus.groovy.ast.GroovyClassVisitor;
023    import org.codehaus.groovy.ast.MethodNode;
024    import org.codehaus.groovy.ast.PropertyNode;
025    import org.objectweb.asm.Opcodes;
026    
027    
028    /**
029     * ClassCompletionVerifier
030     * 
031     */
032    public class ClassCompletionVerifier implements Opcodes, GroovyClassVisitor {
033        
034        ClassNode classNode;
035        
036        public ClassNode getClassNode() {
037            return classNode;
038        }
039        
040    
041        /* (non-Javadoc)
042         * @see org.codehaus.groovy.ast.GroovyClassVisitor#visitClass(org.codehaus.groovy.ast.ClassNode)
043         */
044        public void visitClass(ClassNode a_node) {
045            classNode = a_node;
046            if ((classNode.getModifiers() & Opcodes.ACC_ABSTRACT) == 0 ) {
047                List abstractMethods = classNode.getAbstractMethods();
048                if (abstractMethods != null) {
049                    List methodNames = new ArrayList();
050                    for (Iterator iter = abstractMethods.iterator(); iter.hasNext();) {
051                        MethodNode method = (MethodNode) iter.next();
052                        String methodName = method.getTypeDescriptor();
053                        methodNames.add(methodName);                
054                    }
055                    throw new RuntimeIncompleteClassException(methodNames, classNode);
056                }
057            }
058        }
059    
060        /* (non-Javadoc)
061         * @see org.codehaus.groovy.ast.GroovyClassVisitor#visitConstructor(org.codehaus.groovy.ast.ConstructorNode)
062         */
063        public void visitConstructor(ConstructorNode a_node) {
064        }
065    
066        /* (non-Javadoc)
067         * @see org.codehaus.groovy.ast.GroovyClassVisitor#visitMethod(org.codehaus.groovy.ast.MethodNode)
068         */
069        public void visitMethod(MethodNode a_node) {
070        }
071    
072        /* (non-Javadoc)
073         * @see org.codehaus.groovy.ast.GroovyClassVisitor#visitField(org.codehaus.groovy.ast.FieldNode)
074         */
075        public void visitField(FieldNode a_node) {
076        }
077    
078        /* (non-Javadoc)
079         * @see org.codehaus.groovy.ast.GroovyClassVisitor#visitProperty(org.codehaus.groovy.ast.PropertyNode)
080         */
081        public void visitProperty(PropertyNode a_node) {
082        }
083    
084    }