createNodeBuilder
and associated utility port
#791
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.