Unverified Commit fdec05b6 authored by Nate McMaster (AWS)'s avatar Nate McMaster (AWS) Committed by GitHub
Browse files

Add hook for CodegenDecorators to insert a custom symbol provider (#2434)



* Add hook for CodegenDecorators to insert a custom symbol provider

* rename {extraS=>s}ymbolProvider

* fix rebase conflict that led to invalid code

* Remove model parameter from CoreCodegenDecorator::symbolProvider

---------

Co-authored-by: default avatarZelda Hessler <zhessler@amazon.com>
parent 26cb37af
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ class ClientCodegenVisitor(
        model = codegenDecorator.transformModel(untransformedService, baseModel)
        // the model transformer _might_ change the service shape
        val service = settings.getService(model)
        symbolProvider = RustClientCodegenPlugin.baseSymbolProvider(settings, model, service, rustSymbolProviderConfig)
        symbolProvider = RustClientCodegenPlugin.baseSymbolProvider(settings, model, service, rustSymbolProviderConfig, codegenDecorator)

        codegenContext = ClientCodegenContext(model, symbolProvider, service, protocol, settings, codegenDecorator)

+3 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() {
            model: Model,
            serviceShape: ServiceShape,
            rustSymbolProviderConfig: RustSymbolProviderConfig,
            codegenDecorator: ClientCodegenDecorator,
        ) =
            SymbolVisitor(settings, model, serviceShape = serviceShape, config = rustSymbolProviderConfig)
                // Generate different types for EventStream shapes (e.g. transcribe streaming)
@@ -92,5 +93,7 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() {
                // Rename shapes that clash with Rust reserved words & and other SDK specific features e.g. `send()` cannot
                // be the name of an operation input
                .let { RustReservedWordSymbolProvider(it) }
                // Allows decorators to inject a custom symbol provider
                .let { codegenDecorator.symbolProvider(it) }
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -56,12 +56,18 @@ val TestClientRustSymbolProviderConfig = RustSymbolProviderConfig(
    moduleProvider = OldModuleSchemeClientModuleProvider,
)

private class ClientTestCodegenDecorator : ClientCodegenDecorator {
    override val name = "test"
    override val order: Byte = 0
}

fun testSymbolProvider(model: Model, serviceShape: ServiceShape? = null): RustSymbolProvider =
    RustClientCodegenPlugin.baseSymbolProvider(
        testClientRustSettings(),
        model,
        serviceShape ?: ServiceShape.builder().version("test").id("test#Service").build(),
        TestClientRustSymbolProviderConfig,
        ClientTestCodegenDecorator(),
    )

fun testClientCodegenContext(
+11 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ import software.amazon.smithy.build.PluginContext
import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.ServiceShape
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization
import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization
import software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations
@@ -94,6 +95,11 @@ interface CoreCodegenDecorator<CodegenContext> {
     * Extra sections allow one decorator to influence another. This is intended to be used by querying the `rootDecorator`
     */
    fun extraSections(codegenContext: CodegenContext): List<AdHocCustomization> = listOf()

    /**
     * Hook for customizing symbols by inserting an additional symbol provider.
     */
    fun symbolProvider(base: RustSymbolProvider): RustSymbolProvider = base
}

/**
@@ -150,6 +156,11 @@ abstract class CombinedCoreCodegenDecorator<CodegenContext, Decorator : CoreCode
    final override fun extraSections(codegenContext: CodegenContext): List<AdHocCustomization> =
        addCustomizations { decorator -> decorator.extraSections(codegenContext) }

    final override fun symbolProvider(base: RustSymbolProvider): RustSymbolProvider =
        combineCustomizations(base) { decorator, otherProvider ->
            decorator.symbolProvider(otherProvider)
        }

    /**
     * Combines customizations from multiple ordered codegen decorators.
     *
+3 −1
Original line number Diff line number Diff line
@@ -81,7 +81,8 @@ class PythonServerCodegenVisitor(
            rustSymbolProviderConfig: RustSymbolProviderConfig,
            publicConstrainedTypes: Boolean,
            includeConstraintShapeProvider: Boolean,
        ) = RustServerCodegenPythonPlugin.baseSymbolProvider(settings, model, serviceShape, rustSymbolProviderConfig, publicConstrainedTypes)
            codegenDecorator: ServerCodegenDecorator,
        ) = RustServerCodegenPythonPlugin.baseSymbolProvider(settings, model, serviceShape, rustSymbolProviderConfig, publicConstrainedTypes, codegenDecorator)

        val serverSymbolProviders = ServerSymbolProviders.from(
            settings,
@@ -89,6 +90,7 @@ class PythonServerCodegenVisitor(
            service,
            rustSymbolProviderConfig,
            settings.codegenConfig.publicConstrainedTypes,
            codegenDecorator,
            ::baseSymbolProviderFactory,
        )

Loading