diff --git a/annotations/processor/src/main/java/run/endive/annotations/processor/WasmModuleProcessor.java b/annotations/processor/src/main/java/run/endive/annotations/processor/WasmModuleProcessor.java index b3cd46cd9..02344a3e4 100644 --- a/annotations/processor/src/main/java/run/endive/annotations/processor/WasmModuleProcessor.java +++ b/annotations/processor/src/main/java/run/endive/annotations/processor/WasmModuleProcessor.java @@ -3,9 +3,14 @@ import static java.lang.String.format; import static javax.tools.Diagnostic.Kind.ERROR; import static javax.tools.Diagnostic.Kind.NOTE; +import static javax.tools.StandardLocation.ANNOTATION_PROCESSOR_PATH; +import static javax.tools.StandardLocation.CLASS_OUTPUT; +import static javax.tools.StandardLocation.CLASS_PATH; +import static javax.tools.StandardLocation.SOURCE_PATH; import com.github.javaparser.ast.CompilationUnit; import java.io.IOException; +import java.io.InputStream; import java.io.Writer; import java.net.URI; import java.net.URISyntaxException; @@ -22,6 +27,12 @@ import run.endive.wasm.WasmModule; public final class WasmModuleProcessor extends AbstractModuleProcessor { + private static final StandardLocation[] LOCATIONS = { + CLASS_PATH, + ANNOTATION_PROCESSOR_PATH, + SOURCE_PATH, + CLASS_OUTPUT, + }; @Override public Set getSupportedAnnotationTypes() { @@ -54,11 +65,7 @@ private void processModule(TypeElement type) throws URISyntaxException, IOExcept if (wasmFile.startsWith("file:")) { module = Parser.parse(Path.of(new URI(wasmFile))); } else { - FileObject fileObject = - processingEnv - .getFiler() - .getResource(StandardLocation.CLASS_OUTPUT, "", wasmFile); - module = Parser.parse(fileObject.openInputStream()); + module = Parser.parse(openResource(wasmFile)); } var pkg = getPackageName(type); @@ -76,6 +83,22 @@ private void processModule(TypeElement type) throws URISyntaxException, IOExcept writableClasses.forEach((k, v) -> writeCu(k, v, type)); } + private InputStream openResource(String wasmFile) throws IOException { + var filer = processingEnv.getFiler(); + IOException lastFailure = null; + for (StandardLocation location : LOCATIONS) { + try { + FileObject fileObject = filer.getResource(location, "", wasmFile); + return fileObject.openInputStream(); + } catch (IOException ioe) { + lastFailure = ioe; + } catch (IllegalArgumentException iae) { + lastFailure = new IOException(iae); + } + } + throw lastFailure; + } + private void writeCu(String qualifiedName, CompilationUnit cu, TypeElement type) { try (Writer writer = filer().createSourceFile(qualifiedName, type).openWriter()) { writer.write(cu.printer(printer()).toString()); diff --git a/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java b/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java new file mode 100644 index 000000000..e6063a81e --- /dev/null +++ b/annotations/processor/src/test/java/run/endive/annotations/processor/WasmModuleProcessorTest.java @@ -0,0 +1,35 @@ +package run.endive.annotations.processor; + +import static com.google.testing.compile.CompilationSubject.assertThat; +import static com.google.testing.compile.Compiler.javac; + +import com.google.testing.compile.Compilation; +import com.google.testing.compile.JavaFileObjects; +import org.junit.jupiter.api.Test; + +class WasmModuleProcessorTest { + + @Test + void resolvesWasmModuleFromClassPathNotJustClassOutput() { + Compilation compilation = + javac().withProcessors(new WasmModuleProcessor()) + .compile(JavaFileObjects.forResource("IterFactModule.java")); + + assertThat(compilation).succeededWithoutWarnings(); + + assertThat(compilation).generatedSourceFile("endive.testing.IterFactModule_ModuleExports"); + } + + @Test + void reportsMissingWasmModule() { + Compilation compilation = + javac().withProcessors(new WasmModuleProcessor()) + .compile(JavaFileObjects.forResource("MissingModule.java")); + + assertThat(compilation).failed(); + + assertThat(compilation) + .hadErrorContaining("Failed to load wasmFile") + .inFile(JavaFileObjects.forResource("MissingModule.java")); + } +} diff --git a/annotations/processor/src/test/resources/IterFactModule.java b/annotations/processor/src/test/resources/IterFactModule.java new file mode 100644 index 000000000..5267842c4 --- /dev/null +++ b/annotations/processor/src/test/resources/IterFactModule.java @@ -0,0 +1,6 @@ +package endive.testing; + +import run.endive.annotations.WasmModuleInterface; + +@WasmModuleInterface("iterfact.wat.wasm") +public class IterFactModule {} diff --git a/annotations/processor/src/test/resources/MissingModule.java b/annotations/processor/src/test/resources/MissingModule.java new file mode 100644 index 000000000..30a14e4b4 --- /dev/null +++ b/annotations/processor/src/test/resources/MissingModule.java @@ -0,0 +1,6 @@ +package endive.testing; + +import run.endive.annotations.WasmModuleInterface; + +@WasmModuleInterface("does-not-exist.wasm") +public class MissingModule {} diff --git a/annotations/processor/src/test/resources/iterfact.wat.wasm b/annotations/processor/src/test/resources/iterfact.wat.wasm new file mode 100644 index 000000000..2e8610488 Binary files /dev/null and b/annotations/processor/src/test/resources/iterfact.wat.wasm differ