Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions lib/ASTGen/Sources/ASTGen/LexicalLookup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,15 @@ public func unqualifiedLookup(
}
let sourceLocationConverter = sourceFile.pointee.sourceLocationConverter
let configuredRegions = sourceFile.pointee.configuredRegions(astContext: astContext)

let lookupCache: LookupCache

if let sourceFileCache = sourceFile.pointee.lookupCache {
lookupCache = sourceFileCache
} else {
lookupCache = LookupCache(capacity: 100, drop: 4)
sourceFile.pointee.lookupCache = lookupCache
}

guard let lookupPosition = sourceFile.pointee.position(of: lookupAt),
let lookupToken = sourceFileSyntax.token(at: lookupPosition)
Expand All @@ -70,7 +79,8 @@ public func unqualifiedLookup(
let sllResults = sllConsumedResults(
lookupToken: lookupToken,
finishInSequentialScope: finishInSequentialScope,
configuredRegions: configuredRegions
configuredRegions: configuredRegions,
cache: lookupCache
)

// Add header to the output
Expand Down Expand Up @@ -196,12 +206,15 @@ private func astConsumedResults(
private func sllConsumedResults(
lookupToken: TokenSyntax,
finishInSequentialScope: Bool,
configuredRegions: ConfiguredRegions
configuredRegions: ConfiguredRegions,
cache: LookupCache
) -> [ConsumedLookupResult] {
let resultsWithoutMacroReordering = lookupToken.lookup(
nil,
with: LookupConfig(finishInSequentialScope: finishInSequentialScope, configuredRegions: configuredRegions)
with: LookupConfig(finishInSequentialScope: finishInSequentialScope, configuredRegions: configuredRegions),
cache: cache
)
cache.evictEntriesWithoutHit()

// Early reordering of macro declaration parameters with its generic parameters.
var results: [LookupResult] = []
Expand Down Expand Up @@ -413,7 +426,7 @@ private func flaggingPass(
}

// Check if next results at this position should be ignored. If so, set ignoreAt and omit this name.
if sllResult.ignoreNextFromHere && sllResult.position != ignoreAt {
if sllResult.ignoreNextFromHere {
ignoreAt = sllResult.position
sllResult.flags.insert(.shouldBeOmitted)
}
Expand Down
7 changes: 7 additions & 0 deletions lib/ASTGen/Sources/ASTGen/SourceFile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import SwiftIfConfig
@_spi(ExperimentalLanguageFeatures) import SwiftParser
import SwiftParserDiagnostics
@_spi(Compiler) import SwiftSyntax
@_spi(Experimental) import SwiftLexicalLookup

/// Describes a source file that has been "exported" to the C++ part of the
/// compiler, with enough information to interface with the C++ layer.
Expand All @@ -42,6 +43,12 @@ public struct ExportedSourceFile {
///
/// This is a cached value; access via configuredRegions(astContext:).
var _configuredRegions: ConfiguredRegions? = nil

/// Cache used by unqualified lookup
///
/// Cached so we don't need to re-evaluate common parts
/// of the scope tree during successive lookups.
var lookupCache: LookupCache? = nil

public func position(of location: BridgedSourceLoc) -> AbsolutePosition? {
let sourceFileBaseAddress = UnsafeRawPointer(buffer.baseAddress!)
Expand Down