pulumi/pkg/codegen/go
Abhinav Gupta a24ad1839b
programgen(go): Handle conflicting names in imported packages
This fixes how programgen generates import statements
to handle conflicting imports when two imported packages
have the same name, e.g.

    github.com/pulumi/pulumi-aws/sdk/v5/go/aws/ecs
    github.com/pulumi/pulumi-awsx/sdk/go/awsx/ecs

To do this, we add a fileImporter type that tracks these imports.
It prefers unnamed imports for packages unless one of the following is
true:

- the name of the package has already been used by another import
- the name of the package does not match the last component
  of the import path (e.g., `example.com/foo-go` with `package foo`).

If the name has already been used by another import,
it attempts the following in-order:

- Combine the last two path components of the import path
  into an identifier and use that if available.
  e.g., `awsxs3` from `sdk/go/awsx/s3`.
- Append a number to the package name and increment it
  until an unused name is found.
  e.g. `ecs2`, `ecs3`, and so on.

There's a change in how this information is tracked as well.
Previously, this was a pull approach: various calls returned
programImports objects which all got merged together.

This change switches to a push approach:
as code is generated and imports are requested,
they're submitted to the fileImporter which keeps track of them
until the next `Reset()` call.
The above also has a nice side effect of dropping a parameter.

Another change worth explicitly calling out:
Previously, getModOrAlias partially duplicated some of the logic
implemented in getPulumiImport, and used `mod`, `originalMod`
in a non-obvious way.
This generated incorrect imports like the following
(note the two `/aws` at the end):

    github.com/pulumi/pulumi-aws/sdk/v5/go/aws/aws

This change replicates more of the logic of getPulumiImport
(now called addPulumiImport) into this function,
and addresses the discrepancy in codegen caused by `mod`/`originalMod`.
The result leaves most existing code unchanged,
except in a couple existing cases where the resulting changes make sense
given the logic for named imports outlined above.

Resolves #11176
2023-07-25 12:49:37 -07:00
..
gen_program_test all: gofmt -w -s 2023-01-10 19:03:24 -08:00
doc.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
doc_test.go sdk/go: Remove 'nolint' directives from package docs 2023-01-06 09:06:47 -08:00
gen.go Merge #13136 2023-07-07 21:33:39 +00:00
gen_crd2pulumi.go Merge #13136 2023-07-07 21:33:39 +00:00
gen_program.go programgen(go): Handle conflicting names in imported packages 2023-07-25 12:49:37 -07:00
gen_program_expression_test.go test(codegen/go): Fix broken TestLiteralExpression 2023-06-20 12:25:42 -07:00
gen_program_expressions.go Allow generating code for unknown invokes in non-strict mode 2023-07-10 15:05:18 +02:00
gen_program_json.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
gen_program_optionals.go [codegen/go] Improve optional params in invoke 2022-02-01 11:44:40 -08:00
gen_program_read_dir.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
gen_program_splat.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
gen_program_ternaries.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
gen_program_test.go programgen(go): Handle conflicting names in imported packages 2023-07-25 12:49:37 -07:00
gen_program_utils.go [programgen/dotnet,go] Implement singleOrNone intrinsic 2023-06-11 16:23:33 -07:00
gen_spill.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
gen_test.go Merge #13136 2023-07-07 21:33:39 +00:00
importer.go Add `modulePath` to go 2022-10-10 16:01:53 -07:00
test.go all: Reformat with gofumpt 2023-03-03 09:00:24 -08:00
utilities.go pkg/codegen/go: Prefer contract.Assertf over contract.Assert 2023-02-13 16:27:39 -08:00
utilities_test.go ci: radical idea - what if slow tests & no stdout makes GH consider runner dead? 2022-03-06 14:52:13 -08:00