Skip to content

Commit 7c1034d

Browse files
committed
Add hack
1 parent e308489 commit 7c1034d

File tree

7 files changed

+93
-7
lines changed

7 files changed

+93
-7
lines changed

sbtPlugin/src/main/scala/org/polyvariant/smithytraitcodegen/SmithyTraitCodegen.scala

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import software.amazon.smithy.model.node.ObjectNode
2525
import software.amazon.smithy.traitcodegen.TraitCodegenPlugin
2626

2727
import java.io.File
28+
import software.amazon.smithy.model.transform.ModelTransformer
29+
import java.util.stream.Collectors
30+
import scala.collection.JavaConverters.*
2831

2932
object SmithyTraitCodegen {
3033

@@ -108,6 +111,23 @@ object SmithyTraitCodegen {
108111

109112
}
110113

114+
// Hack / workaround for https://github.com/smithy-lang/smithy/pull/2671
115+
private def namespaceHackRequired(ns: String) =
116+
ns.startsWith("smithy") && ns != "smithy" && !ns.startsWith("smithy.")
117+
118+
private def renameNamespaceForHack(ns: String) =
119+
if (namespaceHackRequired(ns))
120+
"hack" + ns
121+
else
122+
ns
123+
124+
private def replaceNamespaceRefsInFile(fileText: String, ns: String) =
125+
if (namespaceHackRequired(ns)) {
126+
fileText.replaceAll(s"hack$ns", ns)
127+
} else {
128+
fileText
129+
}
130+
111131
def generate(args: Args): Output = {
112132
val outputDir = args.targetDir / "smithy-trait-generator-output"
113133
val genDir = outputDir / "java"
@@ -117,13 +137,38 @@ object SmithyTraitCodegen {
117137

118138
val manifest = FileManifest.create(genDir.toNIO)
119139

120-
val model = args
121-
.dependencies
122-
.foldLeft(Model.assembler().addImport(args.smithySourcesDir.path.toNIO)) { case (acc, dep) =>
123-
acc.addImport(dep.path.toNIO)
140+
val model =
141+
args
142+
.dependencies
143+
.foldLeft(Model.assembler().addImport(args.smithySourcesDir.path.toNIO)) {
144+
case (acc, dep) => acc.addImport(dep.path.toNIO)
145+
}
146+
.assemble()
147+
.unwrap() match {
148+
case model =>
149+
if (namespaceHackRequired(args.smithyNamespace)) {
150+
println("Applying namespace workaround - `hack` prefix will be used")
151+
152+
val renames =
153+
model
154+
.shapes()
155+
.collect(Collectors.toList())
156+
.asScala
157+
.filter(_.getId().getNamespace() == args.smithyNamespace)
158+
.map { shp =>
159+
shp.getId() ->
160+
shp.getId().withNamespace(renameNamespaceForHack(shp.getId().getNamespace()))
161+
}
162+
.toMap
163+
.asJava
164+
165+
ModelTransformer
166+
.create()
167+
.renameShapes(model, renames)
168+
} else
169+
model
124170
}
125-
.assemble()
126-
.unwrap()
171+
127172
val context = PluginContext
128173
.builder()
129174
.model(model)
@@ -132,7 +177,7 @@ object SmithyTraitCodegen {
132177
ObjectNode
133178
.builder()
134179
.withMember("package", args.javaPackage)
135-
.withMember("namespace", args.smithyNamespace)
180+
.withMember("namespace", renameNamespaceForHack(args.smithyNamespace))
136181
.withMember("header", ArrayNode.builder.build())
137182
.withMember("excludeTags", ArrayNode.builder.withValue("nocodegen").build())
138183
.build()
@@ -145,6 +190,13 @@ object SmithyTraitCodegen {
145190
if (os.exists(genDir / "META-INF"))
146191
os.move(genDir / "META-INF", metaDir / "META-INF")
147192

193+
os.walk(genDir)
194+
.filter(os.isFile)
195+
.filter(_.ext == "java")
196+
.foreach { f =>
197+
os.write.over(f, replaceNamespaceRefsInFile(os.read(f), args.smithyNamespace))
198+
}
199+
148200
os
149201
.walk(metaDir, includeTarget = true)
150202
.filter(os.isFile)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
val traits = project
2+
.enablePlugins(SmithyTraitCodegenPlugin)
3+
.settings(
4+
smithyTraitCodegenDependencies := List(
5+
"io.github.disneystreaming.alloy" % "alloy-core" % "0.3.23"
6+
),
7+
smithyTraitCodegenJavaPackage := "smithy4bazinga",
8+
smithyTraitCodegenNamespace := "smithy4bazinga",
9+
)
10+
11+
val root = project
12+
.in(file("."))
13+
.dependsOn(traits)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
sys.props.get("plugin.version") match {
2+
case Some(x) => addSbtPlugin("org.polyvariant" % "smithy-trait-codegen-sbt" % x)
3+
case _ => sys.error("""|The system property 'plugin.version' is not defined.
4+
|Specify this property using the scriptedLaunchOpts -D.""".stripMargin)
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import software.amazon.smithy.model.Model
2+
3+
object DemoApp extends App {
4+
assert(
5+
smithy4bazinga.BazingaTrait.ID.toString() == "smithy4bazinga#bazinga",
6+
s"Expected smithy4bazinga.BazingaTrait.ID to be 'smithy4bazinga#bazinga', but got ${smithy4bazinga.BazingaTrait.ID.toString()}",
7+
)
8+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
> run
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
smithy4bazinga.smithy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
$version: "2"
2+
3+
namespace smithy4bazinga
4+
5+
@trait
6+
string bazinga

0 commit comments

Comments
 (0)