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 }