Skip to content

Cache alias candidates for symbol accessibility#4102

Open
Zzzen wants to merge 1 commit into
microsoft:mainfrom
Zzzen:cache-symbol-accessibility-alias-candidates
Open

Cache alias candidates for symbol accessibility#4102
Zzzen wants to merge 1 commit into
microsoft:mainfrom
Zzzen:cache-symbol-accessibility-alias-candidates

Conversation

@Zzzen
Copy link
Copy Markdown
Contributor

@Zzzen Zzzen commented May 30, 2026

fixes #4101

Copilot AI review requested due to automatic review settings May 30, 2026 14:19
Copy link
Copy Markdown
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

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 getAliasForSymbolInContainer to 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.

Comment on lines +361 to +382
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)))
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.

Declaration emit spends significant CPU in getAliasForSymbolInContainer / getAlternativeContainingModules

2 participants