-
Notifications
You must be signed in to change notification settings - Fork 583
createNodeBuilder
and associated utility port
#791
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
base: main
Are you sure you want to change the base?
Conversation
…ogic excluding ID, JSX, and symbol names
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.
I'll be interested to see if we can move any of this out of the checker package; it's getting pretty big in there.
(I'm not sure how much you want eyes on the contents of the PR yet but I'm happy to look if you do.)
@@ -8,6 +8,7 @@ import ( | |||
"github.com/microsoft/typescript-go/internal/stringutil" | |||
) | |||
|
|||
// TODO: Definitely not threadsafe - make one per checker instead of one global one (threadlocal storage would be neat) |
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.
Yeah, a sync.Pool
of these would be best.
This needs more pulled in from stashed old work to fill it out, (part of the way through the declaration transform itself and resolver) and it's useless without the nodebuilder itself done, but has the full declaration emit pipeline hooked in and tests enabled - another thing showing just how not complete it is! If the PR was already massive, this won't help~ For real, this is all going to have to be un-integrated to be at all mergable in the end, but all up it will be able to signal completion with green CI in the end, so long as nobody blind baseline-accepts... ¯\_(ツ)_/¯
…to builder-backed since thats now
…ans type parameter smuggling and module specifier generation
…/stub some missing functionality
TODO, annotated with current thoughts on each:
symbolTableToDeclarationStatements
and friends)expressionToTypeNode.ts
, plus some wrappers)symbolToNode
and other flavors - lots of very similar but subtly different functions with little corner cases for services support)moduleSpecifiers.ts
) <-- current work item, looking at generating this more automatically with our tooling since it's fairly standalone and doesn't interact with many refactored APIsisSymbolAccessible
,getAccessibleSymbolChain
and the like - these are unimplemented stubs right now, for want of the above, and are a bit unwieldy - also likely candidates for a perf rewrite at some point in the future, as the historically slow part of declaration emit)singlelinetextwriter
usage threadsafe to support concurrent checking (likely one writer per checker instead of a global)EmitContext
to individual factory calls (via symbol tracker?) so the context used by the declaration transform can be correctly used within the node builder, while it still falls back to the checker's internal emit context for diagnostic production or quickfixes and the like that don't need their own emit contextOmitTrailingSemicolon
printer option is redundant with the trailing semicolon eliding wrapper-writer we use in strada - only one of these two may need to be ported.typeArguments
onto every signature kind)declarations.ts
transform once those are all (or mostly) inI've updated my branch to replace the current
typeToString
implementation with the ported node-builder backed implementation, which is the top-down goal of this PR, ultimately. CI on it should not pass until the node builder is mostly (if not totally) completely ported, due to interdependencies between many of its' subsystems. I'll try to keep this PR in a state where it at least compiles without error, which is usually in between big chunks of functionality, but the tests are going to keep throwingunimplemented
panics until all the missing functions are either fully ported or at least sufficiently stubbed (which doesn't feel worth it, really).Structurally,
nodebuilder.go
is the inner contents ofcreateNodeBuilder
's closure environment, lifted into members of a struct. Allcontext
parameters have been removed and replaced with lookups ofcontext
on the struct itself, since we're OO now, but that's about the only refactor.nodebuilderapi.go
is the wrapper returned bycreateNodeBuilder
which maps all the internal closed over methods to the internal node builder API shape (which is recorded as theNodeBuilderInterface
... interface)- basically it's the logic that handles setting upcontext
objects for each request. Some of that might get renamed to reduce confusion eventually, but the structure seems sound.nodebuilderscopes.go
may or may not go away -NodeBuilder.enterNewScope
was pretty big but isolated (used by mapped type and signature construction), so felt like it could stand alone, and it has some utilities only it uses.symbolaccessibility.go
is for the checker's symbol accessibility functionality - these are also mostly self-contained, though do depend on one-another and some common utilities (though I only have stubs here right now - my previous attempts to optimize them as I ported them have broken them, so we're just gonna port them straight as we can for now).This is already a bit of a beast to review, size-wise, and I'd say there's still a fair bit left for a full port - but if we add some extra unit tests, some subsystems, like the specifier generation and maybe accessibility, can reasonably stand alone as changes. Those things just aren't currently unit tested outside of their integrations into the builder in strada, though, so those tests'd all be additional greenfield work.