Skip to content

Commit

Permalink
Add ability to register interceptors w/ delegator
Browse files Browse the repository at this point in the history
  • Loading branch information
mtdowling authored and Michael Dowling committed Mar 31, 2022
1 parent af239da commit 03cd106
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import java.util.function.Consumer;
import software.amazon.smithy.build.FileManifest;
import software.amazon.smithy.model.shapes.Shape;
import software.amazon.smithy.utils.CodeInterceptor;
import software.amazon.smithy.utils.CodeSection;

/**
* <p>Creates and manages {@link SymbolWriter}s for files and namespaces based
Expand Down Expand Up @@ -66,6 +68,7 @@ public class WriterDelegator<W extends SymbolWriter<W, ? extends ImportContainer
private final SymbolProvider symbolProvider;
private final Map<String, W> writers = new TreeMap<>();
private final SymbolWriter.Factory<W> factory;
private final List<CodeInterceptor<? extends CodeSection, W>> interceptors = new ArrayList<>();
private String automaticSeparator = "\n";

/**
Expand All @@ -79,6 +82,16 @@ public WriterDelegator(FileManifest fileManifest, SymbolProvider symbolProvider,
this.factory = factory;
}

/**
* Sets the list of code interceptors to registered with each newly created writer.
*
* @param interceptors Interceptors to register.
*/
public void setInterceptors(List<? extends CodeInterceptor<? extends CodeSection, W>> interceptors) {
this.interceptors.clear();
this.interceptors.addAll(interceptors);
}

/**
* Gets all of the dependencies that have been registered in writers
* created by the {@code WriterDelegator}.
Expand Down Expand Up @@ -214,7 +227,11 @@ private W checkoutWriter(String filename, String namespace) {
String formattedFilename = Paths.get(filename).normalize().toString();
boolean needsNewline = writers.containsKey(formattedFilename);

W writer = writers.computeIfAbsent(formattedFilename, file -> factory.apply(file, namespace));
W writer = writers.computeIfAbsent(formattedFilename, file -> {
W result = factory.apply(file, namespace);
interceptors.forEach(result::onSection);
return result;
});

// Add newlines/separators between types in the same file.
if (needsNewline) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
import software.amazon.smithy.build.MockManifest;
import software.amazon.smithy.model.shapes.Shape;
import software.amazon.smithy.model.shapes.StringShape;
import software.amazon.smithy.utils.CodeInterceptor;
import software.amazon.smithy.utils.CodeSection;
import software.amazon.smithy.utils.ListUtils;

public class WriterDelegatorTest {
@Test
Expand Down Expand Up @@ -120,4 +123,27 @@ public void flushesAllWriters() {

assertThat(mockManifest.getFileString("com/foo/Baz.bam"), equalTo(Optional.of("Hi!\n")));
}

@Test
public void registersInterceptors() {
MockManifest mockManifest = new MockManifest();
SymbolProvider provider = (shape) -> Symbol.builder()
.namespace("com.foo", ".")
.name("Baz")
.definitionFile("com/foo/Baz.bam")
.build();
WriterDelegator<MySimpleWriter> delegator = new WriterDelegator<>(
mockManifest, provider, (f, n) -> new MySimpleWriter(n));

CodeInterceptor<CodeSection, MySimpleWriter> a = CodeInterceptor.forName("test", (w, s) -> {
w.write("Yes");
});
delegator.setInterceptors(ListUtils.of(a));

delegator.useFileWriter("/foo.txt", w -> {
w.pushState("test").popState();
});

assertThat(delegator.getWriters().get(Paths.get("/foo.txt").toString()).toString(), equalTo("Yes\n"));
}
}

0 comments on commit 03cd106

Please sign in to comment.