diff --git a/docs/manual/OptionalTasks/antlr.html b/docs/manual/OptionalTasks/antlr.html index 47624249e..ad3b2d777 100644 --- a/docs/manual/OptionalTasks/antlr.html +++ b/docs/manual/OptionalTasks/antlr.html @@ -57,6 +57,32 @@
ANTLR supports a nested <classpath>
+element, that represents a PATH like
+structure. It is given as a convenience if you have to specify
+the original ANTLR directory. In most cases, dropping the appropriate
+ANTLR jar in the normal Ant lib repository will be enough.
If fork is enabled, additional parameters may be passed to the new
+VM via nested <jvmarg> attributes, for example:
+<antlr fork="yes" target=...> + <jvmarg value="-Djava.compiler=NONE"/> + ... +</antlr> ++ +
would run ANTLR in a VM without JIT.
+ +<jvmarg> allows all attributes described in Command line arguments.
<antlr
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ANTLR.java b/src/main/org/apache/tools/ant/taskdefs/optional/ANTLR.java
index 67d073870..e7ae320a2 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ANTLR.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ANTLR.java
@@ -58,22 +58,40 @@ import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
+import java.net.URL;
+
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.taskdefs.ExecuteJava;
import org.apache.tools.ant.types.CommandlineJava;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.types.Environment;
+
/**
- * @author Erik Meade, emeade@geekfarm.org
+ * ANTLR task.
+ *
+ * @author Erik Meade
+ * @author <classpath> allows classpath to be set
+ * because a directory might be given for Antlr debug...
+ */
+ public Path createClasspath() {
+ return commandline.createClasspath(project).createPath();
+ }
+
+ /**
+ * Create a new JVM argument. Ignored if no JVM is forked.
+ * @return create a new JVM argument so that any argument can be passed to the JVM.
+ * @see #setFork(boolean)
+ */
+ public Commandline.Argument createJvmarg() {
+ return commandline.createVmArgument();
}
+ /**
+ * Adds the jars or directories containing Antlr
+ * this should make the forked JVM work without having to
+ * specify it directly.
+ */
+ public void init() throws BuildException {
+ addClasspathEntry("/antlr/Tool.class");
+ }
+
+ /**
+ * Search for the given resource and add the directory or archive
+ * that contains it to the classpath.
+ *
+ * Doesn't work for archives in JDK 1.1 as the URL returned by
+ * getResource doesn't contain the name of the archive.
+ */
+ protected void addClasspathEntry(String resource) {
+ URL url = getClass().getResource(resource);
+ if (url != null) {
+ String u = url.toString();
+ if (u.startsWith("jar:file:")) {
+ int pling = u.indexOf("!");
+ String jarName = u.substring(9, pling);
+ log("Implicitly adding "+jarName+" to classpath",
+ Project.MSG_DEBUG);
+ createClasspath().setLocation(new File((new File(jarName)).getAbsolutePath()));
+ } else if (u.startsWith("file:")) {
+ int tail = u.indexOf(resource);
+ String dirName = u.substring(5, tail);
+ log("Implicitly adding "+dirName+" to classpath",
+ Project.MSG_DEBUG);
+ createClasspath().setLocation(new File((new File(dirName)).getAbsolutePath()));
+ } else {
+ log("Don\'t know how to handle resource URL "+u,
+ Project.MSG_DEBUG);
+ }
+ } else {
+ log("Couldn\'t find "+resource, Project.MSG_DEBUG);
+ }
+ }
public void execute() throws BuildException {
validateAttributes();
@@ -117,9 +192,11 @@ public class ANTLR extends Task {
if (err == 1) {
throw new BuildException("ANTLR returned: "+err, location);
}
- }
- else {
- Execute.runCommand(this, commandline.getCommandline());
+ } else {
+ ExecuteJava exe = new ExecuteJava();
+ exe.setJavaCommand(commandline.getJavaCommand());
+ exe.setClasspath(commandline.getClasspath());
+ exe.execute(project);
}
}
}
@@ -137,9 +214,6 @@ public class ANTLR extends Task {
if (!outputDirectory.isDirectory()) {
throw new BuildException("Invalid output directory: " + outputDirectory);
}
- if (fork && (dir == null || !dir.isDirectory())) {
- throw new BuildException("Invalid working directory: " + dir);
- }
}
private File getGeneratedFile() throws BuildException {
@@ -156,7 +230,7 @@ public class ANTLR extends Task {
}
in.close();
} catch (Exception e) {
- throw new BuildException("Unable to determine generated class");
+ throw new BuildException("Unable to determine generated class", e);
}
if (generatedFileName == null) {
throw new BuildException("Unable to determine generated class");
@@ -164,11 +238,14 @@ public class ANTLR extends Task {
return new File(outputDirectory, generatedFileName + ".java");
}
+ /** execute in a forked VM */
private int run(String[] command) throws BuildException {
Execute exe = new Execute(new LogStreamHandler(this, Project.MSG_INFO,
Project.MSG_WARN), null);
exe.setAntRun(project);
- exe.setWorkingDirectory(dir);
+ if (workingdir != null){
+ exe.setWorkingDirectory(workingdir);
+ }
exe.setCommandline(command);
try {
return exe.execute();