Skip to content

Fix difference between checker and binder resolvers#3118

Draft
jakebailey wants to merge 1 commit intomainfrom
jabaile/fix-checker-emit-resolver
Draft

Fix difference between checker and binder resolvers#3118
jakebailey wants to merge 1 commit intomainfrom
jabaile/fix-checker-emit-resolver

Conversation

@jakebailey
Copy link
Member

I was playing around with getScriptTransformers and tested to see what would happen if the checker's emit resolver was always used.

There was one broken test, TestSubmodule/elidedJSImport2.ts_module=commonjs/output.

It turns out there is a single divergence due to #2396.

Re-aligning things against Strada by restoring getReferencedValueOrAliasSymbol fixes that difference. It also reveals that we can get rid of getResolvedSymbolNoDiagnostics in favor of getResolvedSymbolOrNil, which is actually what Strada used to give its emit resolver! It just wasn't a named func before.

Perhaps this implies we should have a mode which forces the emit checker to verify it always works, but I don't know how critical that is.

Copilot AI review requested due to automatic review settings March 17, 2026 05:16
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR re-aligns emit-time symbol resolution behavior between the checker and binder reference resolvers to eliminate a remaining divergence (notably affecting elidedJSImport2) introduced by prior emit-focused symbol-lookup changes.

Changes:

  • Remove the non-diagnostic per-node resolved symbol cache field (resolvedSymbolNoDiagnostics) from checker node links.
  • Switch the emit resolver’s binder ReferenceResolver hook from getResolvedSymbolNoDiagnostics to getResolvedSymbolOrNil.
  • Restore an emit-specific import-reference path by adding getReferencedValueOrAliasSymbol and using it in EmitResolver.GetReferencedImportDeclaration.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
internal/checker/types.go Removes resolvedSymbolNoDiagnostics from SymbolNodeLinks, simplifying node link state.
internal/checker/emitresolver.go Updates binder reference resolver hook and customizes import reference resolution in emit.
internal/checker/checker.go Deletes getResolvedSymbolNoDiagnostics and introduces getReferencedValueOrAliasSymbol for emit import reference queries.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +13389 to 13395
func (c *Checker) getReferencedValueOrAliasSymbol(reference *ast.Node) *ast.Symbol {
resolvedSymbol := c.symbolNodeLinks.Get(reference).resolvedSymbol
if resolvedSymbol != nil && resolvedSymbol != c.unknownSymbol {
return resolvedSymbol
}
return links.resolvedSymbolNoDiagnostics
return c.resolveName(reference, reference.Text(), ast.SymbolFlagsValue|ast.SymbolFlagsExportValue|ast.SymbolFlagsAlias, nil, true /*isUse*/, false /*excludeGlobals*/)
}
Comment on lines 827 to 832
func (r *EmitResolver) getReferenceResolver() binder.ReferenceResolver {
if r.referenceResolver == nil {
r.referenceResolver = binder.NewReferenceResolver(r.checker.compilerOptions, binder.ReferenceResolverHooks{
ResolveName: r.checker.resolveName,
GetResolvedSymbol: r.checker.getResolvedSymbolNoDiagnostics,
GetResolvedSymbol: r.checker.getResolvedSymbolOrNil,
GetMergedSymbol: r.checker.getMergedSymbol,
@jakebailey jakebailey marked this pull request as draft March 17, 2026 05:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants