Browse Source

supporting sourceroots

tags/v1_1_0_RC1
wisberg 21 years ago
parent
commit
c70fde750a

+ 76
- 8
testing/src/org/aspectj/testing/harness/bridge/CompilerRun.java View File

import org.aspectj.util.LangUtil; import org.aspectj.util.LangUtil;


import java.io.File; import java.io.File;
import java.io.FileFilter;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.ListIterator; import java.util.ListIterator;


/** /**
* Run the compiler once in non-incremental mode.
* Run the compiler once.
* The lifecycle is as follows: * The lifecycle is as follows:
* <ul> * <ul>
* <li>Spec (specification) is created.</li> * <li>Spec (specification) is created.</li>
* <li>Paths are resolved absolutely, which fails to test the * <li>Paths are resolved absolutely, which fails to test the
* compiler's ability to find files relative to a source base</li> * compiler's ability to find files relative to a source base</li>
* <li>This does not enforce the lifecycle.</li> * <li>This does not enforce the lifecycle.</li>
* <li>This must be used as the initial compile
* before doing an incremental compile </li>
* </ul> * </ul>
*/ */
public class CompilerRun implements IAjcRun { public class CompilerRun implements IAjcRun {
* {Sandbox. testBaseSrcDir} / {Spec.aspectpath..}</li> * {Sandbox. testBaseSrcDir} / {Spec.aspectpath..}</li>
* </ul> * </ul>
* All sources must be readable at this time. * All sources must be readable at this time.
* If staging, the source files and source roots are copied
* to a separate staging directory so they can be modified
* for incremental tests. Note that (as of this writing) the
* compiler only handles source roots for incremental tests.
* @param classesDir the File * @param classesDir the File
* @see org.aspectj.testing.harness.bridge.AjcTest.IAjcRun#setup(File, File) * @see org.aspectj.testing.harness.bridge.AjcTest.IAjcRun#setup(File, File)
* @throws AbortException containing IOException or IllegalArgumentException * @throws AbortException containing IOException or IllegalArgumentException
|| !validator.canRead(testBaseSrcDir, injarPaths, "injars") || !validator.canRead(testBaseSrcDir, injarPaths, "injars")
|| !validator.canRead(testBaseSrcDir, spec.argfiles, "argfiles") || !validator.canRead(testBaseSrcDir, spec.argfiles, "argfiles")
|| !validator.canRead(testBaseSrcDir, spec.classpath, "classpath") || !validator.canRead(testBaseSrcDir, spec.classpath, "classpath")
|| !validator.canRead(testBaseSrcDir, spec.aspectpath, "aspectpath")) {
|| !validator.canRead(testBaseSrcDir, spec.aspectpath, "aspectpath")
|| !validator.canRead(testBaseSrcDir, spec.sourceroots, "sourceroots")
) {
return false; return false;
} }
int numSources = srcPaths.length + injarPaths.length + spec.argfiles.length;
int numSources = srcPaths.length + injarPaths.length
+ spec.argfiles.length + spec.sourceroots.length;
if (numSources < 1) { if (numSources < 1) {
validator.fail("no source files, input jars, or arg files");
validator.fail("no input jars, arg files, or source files or roots");
return false; return false;
}
}
final File[] argFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, spec.argfiles); final File[] argFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, spec.argfiles);
final File[] injarFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, injarPaths); final File[] injarFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, injarPaths);
} }


final File[] srcFiles; final File[] srcFiles;
File[] sourcerootFiles = new File[0];
// source text files are copied when staging incremental tests // source text files are copied when staging incremental tests
if (!spec.isStaging()) { // XXX why this? was always? || (testBaseSrcDir != sandbox.stagingDir))) { if (!spec.isStaging()) { // XXX why this? was always? || (testBaseSrcDir != sandbox.stagingDir))) {
srcFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, srcPaths, CompilerRun.SOURCE_SUFFIXES); srcFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, srcPaths, CompilerRun.SOURCE_SUFFIXES);
if (!LangUtil.isEmpty(spec.sourceroots)) {
sourcerootFiles = FileUtil.getBaseDirFiles(testBaseSrcDir, spec.sourceroots, null);
}
} else { // staging - copy files } else { // staging - copy files
try { try {
srcFiles = FileUtil.copyFiles(testBaseSrcDir, srcPaths, sandbox.stagingDir); srcFiles = FileUtil.copyFiles(testBaseSrcDir, srcPaths, sandbox.stagingDir);
if (!LangUtil.isEmpty(spec.sourceroots)) {
sourcerootFiles = FileUtil.copyFiles(testBaseSrcDir, spec.sourceroots, sandbox.stagingDir);
// delete incremental files in sourceroot after copying // XXX inefficient
FileFilter pickIncFiles = new FileFilter() {
// XXX weak rule to find incremental files
public boolean accept(File file) {
if (file.isDirectory()) { // continue recursion
return true;
}
String path = file.getPath();
if (!FileUtil.hasSourceSuffix(path)) {
return false;
}
int first = path.indexOf(".");
int last = path.lastIndexOf(".");
return (first != last);
}
};
for (int i = 0; i < sourcerootFiles.length; i++) {
FileUtil.deleteContents(sourcerootFiles[i], pickIncFiles, false);
}
}
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
validator.fail("staging - bad input", e); validator.fail("staging - bad input", e);
return false; return false;
return false; return false;
} }
arguments.clear(); arguments.clear();
if (!LangUtil.isEmpty(sourcerootFiles)) {
arguments.add("-sourceroots");
String sr = FileUtil.flatten(sourcerootFiles, null);
arguments.add(sr);
}
if (!LangUtil.isEmpty(srcFiles)) { if (!LangUtil.isEmpty(srcFiles)) {
arguments.addAll(Arrays.asList(FileUtil.getPaths(srcFiles))); arguments.addAll(Arrays.asList(FileUtil.getPaths(srcFiles)));
} }
if (0 < aspectFiles.length) { if (0 < aspectFiles.length) {
sandbox.setAspectpath(aspectFiles, checkReadable, this); sandbox.setAspectpath(aspectFiles, checkReadable, this);
} }
return true; return true;
} }
protected String[] argfiles = new String[0]; protected String[] argfiles = new String[0];
protected String[] aspectpath = new String[0]; protected String[] aspectpath = new String[0];
protected String[] classpath = new String[0]; protected String[] classpath = new String[0];
protected String[] sourceroots = new String[0];
/** src path = {suiteParentDir}/{testBaseDirOffset}/{testSrcDirOffset}/{path} */ /** src path = {suiteParentDir}/{testBaseDirOffset}/{testSrcDirOffset}/{path} */
protected String testSrcDirOffset; protected String testSrcDirOffset;
classpath = XMLWriter.unflattenList(files); classpath = XMLWriter.unflattenList(files);
} }
} }

/**
* Set source roots, deleting any old ones
* @param files comma-delimited list of directories
* - ignored if null or empty
*/
public void setSourceroots(String dirs) {
if (!LangUtil.isEmpty(dirs)) {
sourceroots = XMLWriter.unflattenList(dirs);
}
}

/** /**
* Set aspectpath, deleting any old ones * Set aspectpath, deleting any old ones
* @param files comma-delimited list of aspect jars - ignored if null or * @param files comma-delimited list of aspect jars - ignored if null or
} }
} }
} }
// send info messages about
// forced staging when -incremental
// or staging but no -incremental flag
int incLoc = argList.indexOf("-incremental");
if (spec.isStaging()) {
if (-1 == incLoc) { // staging and no flag
MessageUtil.info(handler, "staging but no -incremental flag");
}
} else if (-1 != incLoc) { // flagged but not staging - stage
spec.setStaging(true);
MessageUtil.info(handler, "-incremental forcing staging");
}
// remove funky prefixes from remainder, fixup two-part flags // remove funky prefixes from remainder, fixup two-part flags
// and interpret special flags // and interpret special flags
boolean source14 = false; boolean source14 = false;
if (!LangUtil.isEmpty(argfiles)) { if (!LangUtil.isEmpty(argfiles)) {
out.printAttribute("argfiles", XMLWriter.flattenFiles(argfiles)); out.printAttribute("argfiles", XMLWriter.flattenFiles(argfiles));
} }
if (!LangUtil.isEmpty(sourceroots)) {
out.printAttribute("sourceroots", XMLWriter.flattenFiles(argfiles));
}
super.writeAttributes(out); super.writeAttributes(out);
out.endAttributes(); out.endAttributes();
if (!LangUtil.isEmpty(dirChanges)) { if (!LangUtil.isEmpty(dirChanges)) {

+ 1
- 0
tests/ajcTestSuite.dtd View File

<!ATTLIST compile aspectpath CDATA #IMPLIED > <!ATTLIST compile aspectpath CDATA #IMPLIED >
<!ATTLIST compile classpath CDATA #IMPLIED > <!ATTLIST compile classpath CDATA #IMPLIED >
<!ATTLIST compile options CDATA #IMPLIED > <!ATTLIST compile options CDATA #IMPLIED >
<!ATTLIST compile sourceroots CDATA #IMPLIED >
<!ELEMENT inc-compile (dir-changes*,message*)> <!ELEMENT inc-compile (dir-changes*,message*)>
<!ATTLIST inc-compile tag CDATA #REQUIRED > <!ATTLIST inc-compile tag CDATA #REQUIRED >

Loading…
Cancel
Save