Index: ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/launchers/GroovyLaunchConfigurationDelegate.java =================================================================== RCS file: /cvs/groovy/groovy/ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/launchers/GroovyLaunchConfigurationDelegate.java,v retrieving revision 1.6 diff -u -r1.6 GroovyLaunchConfigurationDelegate.java --- ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/launchers/GroovyLaunchConfigurationDelegate.java 20 Jun 2006 04:20:43 -0000 1.6 +++ ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/launchers/GroovyLaunchConfigurationDelegate.java 2 Jul 2006 04:46:03 -0000 @@ -1,11 +1,17 @@ package org.codehaus.groovy.eclipse.launchers; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.eclipse.model.GroovyModel; +import org.codehaus.groovy.eclipse.model.GroovyProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; +import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.debug.core.IJavaDebugTarget; +import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jdt.launching.JavaLaunchDelegate; /** @@ -17,11 +23,27 @@ * @see ILaunchConfigurationDelegate#launch */ public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { + IJavaProject project = getJavaProject(configuration); + GroovyModel gm = GroovyModel.getModel(); + GroovyProject gp = gm.getProject(project.getProject()); + String className = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, (String)null); + ClassNode classNode = gp.getClassNodeForName(className); + ILaunchConfigurationWorkingCopy config = null; + if (!gp.hasRunnableMain(classNode) && gp.isTestCaseClass(classNode)) { + config = configuration.getWorkingCopy(); + config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "junit.textui.TestRunner"); + config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, className); + config.doSave(); + } super.launch(configuration, mode, launch, monitor); IJavaDebugTarget target = (IJavaDebugTarget)launch.getDebugTarget(); if (target != null) { target.setDefaultStratum("Groovy"); } - } - + if (config != null) { + config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, className); + config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, ""); + config.doSave(); + } + } } Index: ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/model/GroovyProject.java =================================================================== RCS file: /cvs/groovy/groovy/ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/model/GroovyProject.java,v retrieving revision 1.24 diff -u -r1.24 GroovyProject.java --- ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/model/GroovyProject.java 21 Jun 2006 04:15:33 -0000 1.24 +++ ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/model/GroovyProject.java 2 Jul 2006 04:48:17 -0000 @@ -27,6 +27,7 @@ import org.codehaus.groovy.ast.CompileUnit; import org.codehaus.groovy.ast.MethodNode; import org.codehaus.groovy.ast.ModuleNode; +import org.codehaus.groovy.ast.Parameter; import org.codehaus.groovy.control.CompilationFailedException; import org.codehaus.groovy.control.CompilationUnit; import org.codehaus.groovy.control.CompilerConfiguration; @@ -528,13 +529,18 @@ */ private void runGroovyMain(ClassNode classNode, String[] args) throws CoreException { String className = ""; - if (isTestCaseClass(classNode)) { + if (hasRunnableMain(classNode)) { + className = classNode.getName(); + } else if (isTestCaseClass(classNode)) { className = "junit.textui.TestRunner"; args = new String[] { classNode.getName() }; } else { - className = classNode.getName(); + GroovyPlugin.getPlugin().getDialogProvider().errorRunningGroovy( + new Exception("This script or class could not be run.\nIt should either:\n- have a main method,\n" + + "- be a class extending GroovyTestCase,\n- or implement the Runnable interface.")); + return; } - System.out.println( "GroovyProject.runGroovyMain(): " + className ); +// System.out.println( "GroovyProject.runGroovyMain(): " + className ); runGroovyMain(className,args); } @@ -547,7 +553,7 @@ * @param classNode * @return */ - private boolean isTestCaseClass(ClassNode classNode) { + public boolean isTestCaseClass(ClassNode classNode) { ClassNode parent = classNode.getSuperClass(); while (parent != null) { // TODO: classes that extend GroovyTestCase have parent object @@ -588,20 +594,46 @@ List classes = getClassesForModules(moduleList); for (Iterator iterator = classes.iterator(); iterator.hasNext();) { ClassNode classNode = (ClassNode) iterator.next(); - List mainMethods = classNode.getDeclaredMethods("main"); - for (Iterator methoodIterator = mainMethods.iterator(); methoodIterator.hasNext();) { - MethodNode methodNode = (MethodNode) methoodIterator.next(); - if (methodNode != null && methodNode.isStatic() && methodNode.isVoidMethod()) { - results.add(classNode.getName()); - } - } - if (isTestCaseClass(classNode)) { + if (hasRunnableMain(classNode) || isTestCaseClass(classNode)) { results.add(classNode.getName()); } } } return (String[]) results.toArray(new String[results.size()]); } + + public boolean hasRunnableMain(ClassNode classNode) { + List mainMethods = classNode.getDeclaredMethods("main"); + for (Iterator methodIterator = mainMethods.iterator(); methodIterator.hasNext();) { + MethodNode methodNode = (MethodNode) methodIterator.next(); + if (methodNode != null && methodNode.isStatic() && + hasAppropriateArrayArgs(methodNode.getParameters())) { + return true; + } + } + return false; + } + + private boolean hasAppropriateArrayArgs(Parameter[] params) { + if (params.length != 1) return false; + ClassNode first = params[0].getType(); + if (!first.isArray()) return false; + String componentName = first.getComponentType().getName(); + return componentName.equals("java.lang.String") || + componentName.equals("java.lang.Object"); + } + + public ClassNode getClassNodeForName(String name) { + for (Iterator iter = scriptPathModuleNodeMap.values().iterator(); iter.hasNext();) { + List moduleList = (List) iter.next(); + List classes = getClassesForModules(moduleList); + for (Iterator iterator = classes.iterator(); iterator.hasNext();) { + ClassNode classNode = (ClassNode) iterator.next(); + if (classNode.getName().equals(name)) return classNode; + } + } + return null; + } /** * @param listener Index: ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/ui/GroovyDialogProvider.java =================================================================== RCS file: /cvs/groovy/groovy/ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/ui/GroovyDialogProvider.java,v retrieving revision 1.2 diff -u -r1.2 GroovyDialogProvider.java --- ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/ui/GroovyDialogProvider.java 7 Mar 2004 22:19:21 -0000 1.2 +++ ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/ui/GroovyDialogProvider.java 2 Jul 2006 04:20:19 -0000 @@ -26,6 +26,10 @@ MessageDialog.openError(getShell(),"Groovy Runner Error ","Error running "+file.getName()+" "+e.getMessage()); } + public void errorRunningGroovy(Exception e){ + MessageDialog.openError(getShell(),"Groovy Runner Error ",e.getMessage()); + } + Shell getShell(){ IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) Index: ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/wizards/NewTestWizardPage.java =================================================================== RCS file: /cvs/groovy/groovy/ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/wizards/NewTestWizardPage.java,v retrieving revision 1.6 diff -u -r1.6 NewTestWizardPage.java --- ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/wizards/NewTestWizardPage.java 27 May 2006 16:08:34 -0000 1.6 +++ ide/groovy-eclipse/GroovyEclipse/src/org/codehaus/groovy/eclipse/wizards/NewTestWizardPage.java 2 Jul 2006 04:54:44 -0000 @@ -134,8 +134,6 @@ GroovyPlugin.getPlugin().addJunitSupprt(packageFragment.getJavaProject()); StringBuffer src = new StringBuffer(); monitor.worked(1); - src.append("import groovy.util.GroovyTestCase"); - src.append("\n\n\n"); src.append("class "); src.append(getTypeName()); src.append(" extends GroovyTestCase");