Work around Groovy compiler bug that can name classes incorrectly

If a source URL is added to a CompilationUnit and that source URL does
not contain any slashes, the resulting ClassNode in the AST will be
incorrectly named. For example, a URL of 'file:foo.groovy' will produce
a ClassNode named 'file:foo'. The expected name is 'foo'.

This commit works around this problem by adding any URL sources with a
file protocol to the compilation unit as File instances. Any URL sources
that do not have a file protocol continue to be added as URL instances.
Such URLs are still prone to this bug should we be dealing with one
that contains no slashes. A fix for the underlying Groovy bug will
address this possibility.

Fixes #594
This commit is contained in:
Andy Wilkinson 2014-03-27 16:20:29 +00:00
parent 8491f8eb07
commit 46fc5c05e3
1 changed files with 8 additions and 1 deletions

View File

@ -20,6 +20,7 @@ import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyClassLoader.ClassCollector;
import groovy.lang.GroovyCodeSource;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URL;
@ -184,7 +185,13 @@ public class GroovyCompiler {
for (String source : sources) {
List<String> paths = ResourceUtils.getUrls(source, this.loader);
for (String path : paths) {
compilationUnit.addSource(new URL(path));
URL url = new URL(path);
if ("file".equals(url.getProtocol())) {
compilationUnit.addSource(new File(url.getFile()));
}
else {
compilationUnit.addSource(url);
}
}
}