Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(jsii): correctly identify types regardless of import method #3233

Merged
merged 10 commits into from
Dec 8, 2021

Conversation

rix0rrr
Copy link
Contributor

@rix0rrr rix0rrr commented Dec 6, 2021

Types imported from dependency's submodules are only correctly
identified if they are imported via a top-level namespace import.

Otherwise, they are incorrectly identified as coming from the top-level
scope and compilation will fail.

Compare:

// Works
import { aws_ec2 as ec2 } from 'aws-cdk-lib';

// Does not work
import * as ec2 from 'aws-cdk-lib/aws-ec2';

Fortunately we already have symbol ids to solve this exact issue
for Rosetta, so we can resort to looking up FQN by symbol id.

Fixes aws/aws-cdk#17860.


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@rix0rrr rix0rrr requested a review from a team December 6, 2021 13:57
@rix0rrr rix0rrr self-assigned this Dec 6, 2021
@mergify mergify bot added the contribution/core This is a PR that came from AWS. label Dec 6, 2021
@rix0rrr
Copy link
Contributor Author

rix0rrr commented Dec 6, 2021

This PR is currently blocked on #3225, as the build of jsii-calc-lib uses an outDir and our symbol Id implementation is currently not yet robust against outdir-imported declarations.

Copy link
Contributor

@njlynch njlynch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any chance of some tests to prove out this works (and prevent future regressions)?

@rix0rrr
Copy link
Contributor Author

rix0rrr commented Dec 8, 2021

Any chance of some tests to prove out this works (and prevent future regressions)?

Yessir! Coming up. I got sidetracked here... it's a little annoying because I had the test already, but apparently I didn't commit it so it must have gotten lost in a git reset --hard somewhere 😢

Types imported from dependency's submodules are only correctly
identified if they are imported via a top-level namespace import.

Otherwise, they are incorrectly identified as coming from the top-level
scope and compilation will fail.

Compare:

```ts
// Works
import { aws_ec2 as ec2 } from 'aws-cdk-lib';

// Does not work
import * as ec2 from 'aws-cdk-lib/aws-ec2';
```

Fortunately we already have symbol ids to solve this exact issue
for Rosetta, so we can resort to looking up FQN by symbol id.

Fixes aws/aws-cdk#17860.
@rix0rrr rix0rrr force-pushed the huijbers/a-symbol-by-any-other-import branch from 5b7ff0d to 73d3779 Compare December 8, 2021 10:54
@rix0rrr rix0rrr requested a review from njlynch December 8, 2021 13:21
@mergify
Copy link
Contributor

mergify bot commented Dec 8, 2021

Thank you for contributing! ❤️ I will now look into making sure the PR is up-to-date, then proceed to try and merge it!

@mergify mergify bot added the pr/ready-to-merge This PR is ready to be merged. label Dec 8, 2021
@mergify mergify bot merged commit aa37d62 into main Dec 8, 2021
@mergify mergify bot deleted the huijbers/a-symbol-by-any-other-import branch December 8, 2021 15:11
@mergify
Copy link
Contributor

mergify bot commented Dec 8, 2021

Merging (with squash)...

@mergify mergify bot removed the pr/ready-to-merge This PR is ready to be merged. label Dec 8, 2021
rix0rrr added a commit that referenced this pull request Dec 10, 2021
The fix introduced in #3233 relied on the jsii libraries being recompiled with
symbolid information. This information was introduced in jsii 1.39.0.

With the code from #3233, symbols from libraries compiled with older jsii
versions could not be located and the compilation would fail.

In this PR, restore the compatibility by falling back to the same FQN
that the original code would have guessed. It will not be correct
if the type comes from a submodule, but only CDK is using submodules
and CDK is using a new jsii compiler.
rix0rrr added a commit that referenced this pull request Dec 10, 2021
The fix introduced in #3233 relied on the jsii libraries being recompiled with
symbolid information. This information was introduced in jsii 1.39.0.

With the code from #3233, symbols from libraries compiled with older jsii
versions could not be located and the compilation would fail.

In this PR, restore the compatibility by falling back to the same FQN
that the original code would have guessed. It will not be correct
if the type comes from a submodule, but only CDK is using submodules
and CDK is using a new jsii compiler.
mergify bot pushed a commit that referenced this pull request Dec 10, 2021
The fix introduced in #3233 relied on the jsii libraries being recompiled with
symbolid information. This information was introduced in jsii 1.39.0.

With the code from #3233, symbols from libraries compiled with older jsii
versions could not be located and the compilation would fail.

In this PR, restore the compatibility by falling back to the same FQN
that the original code would have guessed. It will not be correct
if the type comes from a submodule, but only CDK is using submodules
and CDK is using a new jsii compiler.



---

By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license].

[Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0
rix0rrr added a commit that referenced this pull request Dec 29, 2021
When trying to use submodule types from assemblies compiled with
a jsii version `< 1.39.0`, you will see the following error:

```
Unable to resolve type "<module>.<type>". It may be @internal or not
exported from the module's entry point (as configured in "package.json"
as "main").
```

The type resolution introduced in #3233 was relying on either (a) the
symbol identifier table; or (b) the type not being in a submodule.

Unfortunately, there was a 3rd case which was not covered: the library
had already been imported by its entry point, and the
`this.submoduleMap` had been initialized will all exported submodules.

Restore that code path, and improve the error message for undeclared
dependencies.
mergify bot pushed a commit that referenced this pull request Dec 30, 2021
…3306)

When trying to use submodule types from assemblies compiled with
a jsii version `< 1.39.0`, you will see the following error:

```
Unable to resolve type "<module>.<type>". It may be @internal or not
exported from the module's entry point (as configured in "package.json"
as "main").
```

The type resolution introduced in #3233 was relying on either (a) the
symbol identifier table; or (b) the type not being in a submodule.

Unfortunately, there was a 3rd case which was not covered: the library
had already been imported by its entry point, and the
`this.submoduleMap` had been initialized will all exported submodules.

Restore that code path, and improve the error message for undeclared
dependencies.



---

By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license].

[Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contribution/core This is a PR that came from AWS.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

‼️ NOTICE: jsii libraries using v2 (aws-cdk-lib) require specific import format
2 participants