-
Notifications
You must be signed in to change notification settings - Fork 246
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
Conversation
This PR is currently blocked on #3225, as the build of |
There was a problem hiding this 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)?
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 |
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.
5b7ff0d
to
73d3779
Compare
Thank you for contributing! ❤️ I will now look into making sure the PR is up-to-date, then proceed to try and merge it! |
Merging (with squash)... |
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.
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.
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
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.
…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
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:
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.