Class WriterDelegator<W extends SymbolWriter<W,? extends ImportContainer>>
- java.lang.Object
-
- software.amazon.smithy.codegen.core.WriterDelegator<W>
-
- Type Parameters:
W
- The type ofSymbolWriter
to create and manage.
- All Implemented Interfaces:
SymbolDependencyContainer
public class WriterDelegator<W extends SymbolWriter<W,? extends ImportContainer>> extends java.lang.Object implements SymbolDependencyContainer
Creates and manages
SymbolWriter
s for files and namespaces based onSymbol
s created for aShape
.Overview
WriterDelegator
is designed to generate code in files returned by theSymbol.getDefinitionFile()
method of aSymbol
. If multipleSymbol
s are created that need to be defined in the same file, then theWriterDelegator
ensures that the state of code generator associated with the file is persisted and only written when all shapes have been generated.SymbolWriter
s are lazily created each time a new filename is requested. If aSymbolWriter
is already associated with a filename, a newline (\n) is written to the file before providing access to theSymbolWriter
. All of the files and SymbolWriters stored in the delegator are eventually written to the providedFileManifest
when theflushWriters()
method is called.This class is not thread-safe.
Extending
WriterDelegator
Language-specific code generators that utilize
Symbol
andSymbolDependency
should extend bothWriterDelegator
andSymbolWriter
to implement language specific functionality. Extending these classes also makes it easier to create new instances of them because they will be easier to work with since generic types aren't needed in concrete implementations.
-
-
Constructor Summary
Constructors Constructor Description WriterDelegator(FileManifest fileManifest, SymbolProvider symbolProvider, SymbolWriter.Factory<W> factory)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
flushWriters()
Writes each pendingSymbolWriter
to theFileManifest
.java.util.List<SymbolDependency>
getDependencies()
Gets all of the dependencies that have been registered in writers created by theWriterDelegator
.java.util.Map<java.lang.String,W>
getWriters()
Returns an immutableMap
of createdSymbolWriter
s.void
setAutomaticSeparator(java.lang.String automaticSeparator)
Sets the automatic separator that is written to aSymbolWriter
each time the writer is reused.void
setInterceptors(java.util.List<? extends CodeInterceptor<? extends CodeSection,W>> interceptors)
Sets the list of code interceptors to registered with each newly created writer.void
useFileWriter(java.lang.String filename, java.lang.String namespace, java.util.function.Consumer<W> writerConsumer)
Gets a previously created writer or creates a new one if needed.void
useFileWriter(java.lang.String filename, java.util.function.Consumer<W> writerConsumer)
Gets a previously createdSymbolWriter
or creates a new one if needed.void
useShapeWriter(Shape shape, java.util.function.Consumer<W> writerConsumer)
-
-
-
Constructor Detail
-
WriterDelegator
public WriterDelegator(FileManifest fileManifest, SymbolProvider symbolProvider, SymbolWriter.Factory<W> factory)
- Parameters:
fileManifest
- Where code is written whenflushWriters()
is called.symbolProvider
- MapsShape
toSymbol
to determine the "namespace" and file of a shape.factory
- Factory used to create newSymbolWriter
s.
-
-
Method Detail
-
setInterceptors
public void setInterceptors(java.util.List<? extends CodeInterceptor<? extends CodeSection,W>> interceptors)
Sets the list of code interceptors to registered with each newly created writer.- Parameters:
interceptors
- Interceptors to register.
-
getDependencies
public java.util.List<SymbolDependency> getDependencies()
Gets all of the dependencies that have been registered in writers created by theWriterDelegator
.This method essentially just aggregates the results of calling
SymbolWriter.getDependencies()
of each created writer into a single array.This method may be overridden as needed (for example, to add in some list of default dependencies or to inject other generative dependencies).
- Specified by:
getDependencies
in interfaceSymbolDependencyContainer
- Returns:
- Returns all the dependencies used in each writer.
-
flushWriters
public void flushWriters()
Writes each pendingSymbolWriter
to theFileManifest
.The
toString
method is called on each writer to generate the code to write to the manifest.This method clears out the managed
SymbolWriter
s, meaning a subsequent call togetWriters()
will return an empty map.This method may be overridden as needed.
-
getWriters
public final java.util.Map<java.lang.String,W> getWriters()
Returns an immutableMap
of createdSymbolWriter
s.Each map key is the relative filename where the code will be written in the
FileManifest
, and each map value is the associatedSymbolWriter
of typeT
.- Returns:
- Returns the immutable map of files to writers.
-
useFileWriter
public final void useFileWriter(java.lang.String filename, java.util.function.Consumer<W> writerConsumer)
Gets a previously createdSymbolWriter
or creates a new one if needed.If a writer already exists, a newline is automatically appended to the writer (either a newline or whatever value was set on
setAutomaticSeparator(java.lang.String)
).- Parameters:
filename
- Name of the file to create.writerConsumer
- Consumer that is expected to write to theSymbolWriter
.
-
useFileWriter
public final void useFileWriter(java.lang.String filename, java.lang.String namespace, java.util.function.Consumer<W> writerConsumer)
Gets a previously created writer or creates a new one if needed.If a writer already exists, a newline is automatically appended to the writer (either a newline or whatever value was set on
setAutomaticSeparator(java.lang.String)
).- Parameters:
filename
- Name of the file to create.namespace
- Namespace associated with the file (or an empty string).writerConsumer
- Consumer that is expected to write to theSymbolWriter
.
-
useShapeWriter
public void useShapeWriter(Shape shape, java.util.function.Consumer<W> writerConsumer)
Gets or creates a writer for aShape
by converting theShape
to aSymbol
.Any dependencies (i.e.,
SymbolDependency
) required by theSymbol
are automatically registered with the writer.Any imports required to declare the
Symbol
in code (i.e.,SymbolReference.ContextOption.DECLARE
) are automatically registered with the writer.If a writer already exists, a newline is automatically appended to the writer (either a newline or whatever value was set on
setAutomaticSeparator(java.lang.String)
).This method may be overridden as needed.
- Parameters:
shape
- Shape to create the writer for.writerConsumer
- Consumer that is expected to write to theSymbolWriter
.
-
setAutomaticSeparator
public final void setAutomaticSeparator(java.lang.String automaticSeparator)
Sets the automatic separator that is written to aSymbolWriter
each time the writer is reused.The default line separator is a newline ("\n"), but some implementations may wish to use an alternative value (e.g., "\r\n") or to disable the newline separator altogether by proving an empty string.
- Parameters:
automaticSeparator
- The non-null line separator to use.
-
-