Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<String> getSupportedAnnotationTypes() {
Expand Down Expand Up @@ -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);
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package endive.testing;

import run.endive.annotations.WasmModuleInterface;

@WasmModuleInterface("iterfact.wat.wasm")
public class IterFactModule {}
6 changes: 6 additions & 0 deletions annotations/processor/src/test/resources/MissingModule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package endive.testing;

import run.endive.annotations.WasmModuleInterface;

@WasmModuleInterface("does-not-exist.wasm")
public class MissingModule {}
Binary file not shown.
Loading