Repository navigation
Cache alias candidates for symbol accessibility - #4102
Zzzen (Zzzen) wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR optimizes alias resolution by caching exported-symbol alias candidates per container and per resolved/merged target symbol, reducing repeated scans and redundant sorting.
Changes:
- Added a
Checker-level cache mapping containers to exported-target → candidate-export symbols. - Updated
getAliasForSymbolInContainerto populate and consult the cache. - Avoided unnecessary sorting when there is only a single candidate.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| internal/checker/symbolaccessibility.go | Adds cached lookup/build path for alias candidates keyed by resolved exported target symbols. |
| internal/checker/checker.go | Introduces a new Checker field to store the alias-candidate cache. |
| target := c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(symbol))) | ||
| if c.aliasCandidatesByExportedTarget != nil { | ||
| if candidatesByTarget, ok := c.aliasCandidatesByExportedTarget[container]; ok { | ||
| candidates := candidatesByTarget[target] | ||
| if len(candidates) > 0 { | ||
| if len(candidates) > 1 { | ||
| c.sortSymbols(candidates) // _must_ sort exports for stable results - symbol table is randomly iterated | ||
| } | ||
| return candidates[0] | ||
| } | ||
| return nil | ||
| } | ||
| } else { | ||
| c.aliasCandidatesByExportedTarget = make(map[*ast.Symbol]map[*ast.Symbol][]*ast.Symbol) | ||
| } | ||
|
|
||
| candidatesByTarget := make(map[*ast.Symbol][]*ast.Symbol, len(exports)) | ||
| for _, exported := range exports { | ||
| exportedTarget := c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(exported))) | ||
| candidatesByTarget[exportedTarget] = append(candidatesByTarget[exportedTarget], exported) | ||
| } | ||
| c.aliasCandidatesByExportedTarget[container] = candidatesByTarget |
| if c.getSymbolIfSameReference(exported, symbol) != nil { | ||
| candidates = append(candidates, exported) | ||
|
|
||
| target := c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(symbol))) |
|
|
||
| candidatesByTarget := make(map[*ast.Symbol][]*ast.Symbol, len(exports)) | ||
| for _, exported := range exports { | ||
| exportedTarget := c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(exported))) |
|
TypeScript Bot (@typescript-bot) perf test this faster |
|
Jake Bailey (@jakebailey) Here they are:
tscComparison Report - baseline..pr
System info unknown
Hosts
Scenarios
Developer Information: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Thank you for contributing to the TypeScript native port! Development has moved from this repository back to the main microsoft/TypeScript repository. GitHub does not have PR transfer functionality, so we're closing this PR here. If this change is still relevant, please reopen it as a new pull request in See microsoft/typescript-go#4918 for more information about the move. |
fixes microsoft/TypeScript#63830