Skip to content

ADR 005: Strategy Pattern for Multi-Language Code Generation

Status

Accepted

Context

Plugin must generate type-safe API code in multiple languages (Kotlin, Java) with language-specific syntax, type systems, and conventions. Each language requires different code generation libraries (KotlinPoet, JavaPoet).

Decision

Use Strategy pattern with language-specific builders:

kotlin
Map<OutputLanguage, AbstractApiBuilder>

Each builder implements code generation for its language using appropriate code generation libraries. Builders share common structure through abstract base class.

Consequences

Positive

  • Language isolation: Kotlin/Java generation logic completely separate
  • Library flexibility: Each builder uses appropriate code generation tool
  • Extensibility: New languages (Scala, TypeScript) added via new builders
  • Parallel development: Language implementations can evolve independently

Negative

  • Code duplication: Similar object structures generated differently per language
  • Consistency burden: Must manually ensure output equivalence across languages
  • Testing overhead: Each builder requires separate test suite

Alternatives Considered

Template-based generation (Rejected)

  • Would reduce duplication via shared templates
  • Loses type safety of code generation libraries
  • Harder to handle language-specific features

Implementation

kotlin
val builder = mapOf(
    OutputLanguage.KOTLIN to KotlinApiBuilder(),
    OutputLanguage.JAVA to JavaApiBuilder()
)

Builders generate identical API structures with language-specific syntax.