Class WriterDelegator<W extends SymbolWriter<W,? extends ImportContainer>>

java.lang.Object
software.amazon.smithy.codegen.core.WriterDelegator<W>
Type Parameters:
W - The type of SymbolWriter to create and manage.
All Implemented Interfaces:
SymbolDependencyContainer

public class WriterDelegator<W extends SymbolWriter<W,? extends ImportContainer>> extends Object implements SymbolDependencyContainer

Creates and manages SymbolWriters for files and namespaces based on Symbols created for a Shape.

Overview

WriterDelegator is designed to generate code in files returned by the Symbol.getDefinitionFile() method of a Symbol. If multiple Symbols are created that need to be defined in the same file, then the WriterDelegator ensures that the state of code generator associated with the file is persisted and only written when all shapes have been generated.

SymbolWriters are lazily created each time a new filename is requested. If a SymbolWriter is already associated with a filename, a newline (\n) is written to the file before providing access to the SymbolWriter. All of the files and SymbolWriters stored in the delegator are eventually written to the provided FileManifest when the flushWriters() method is called.

This class is not thread-safe.

Extending WriterDelegator

Language-specific code generators that utilize Symbol and SymbolDependency should extend both WriterDelegator and SymbolWriter 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 Details

  • Method Details

    • setInterceptors

      public void setInterceptors(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 List<SymbolDependency> getDependencies()
      Gets all of the dependencies that have been registered in writers created by the WriterDelegator.

      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 interface SymbolDependencyContainer
      Returns:
      Returns all the dependencies used in each writer.
    • flushWriters

      public void flushWriters()
      Writes each pending SymbolWriter to the FileManifest.

      The toString method is called on each writer to generate the code to write to the manifest.

      This method clears out the managed SymbolWriters, meaning a subsequent call to getWriters() will return an empty map.

      This method may be overridden as needed.

    • getWriters

      public final Map<String,W> getWriters()
      Returns an immutable Map of created SymbolWriters.

      Each map key is the relative filename where the code will be written in the FileManifest, and each map value is the associated SymbolWriter of type T.

      Returns:
      Returns the immutable map of files to writers.
    • useFileWriter

      public final void useFileWriter(String filename, Consumer<W> writerConsumer)
      Gets a previously created SymbolWriter 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 the SymbolWriter.
    • useFileWriter

      public final void useFileWriter(String filename, String namespace, 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 the SymbolWriter.
    • useShapeWriter

      public void useShapeWriter(Shape shape, Consumer<W> writerConsumer)
      Gets or creates a writer for a Shape by converting the Shape to a Symbol.

      Any dependencies (i.e., SymbolDependency) required by the Symbol 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 the SymbolWriter.
    • setAutomaticSeparator

      public final void setAutomaticSeparator(String automaticSeparator)
      Sets the automatic separator that is written to a SymbolWriter 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.