diff --git a/lib/ASTGen/Sources/ASTGen/LexicalLookup.swift b/lib/ASTGen/Sources/ASTGen/LexicalLookup.swift index 7315ce6c1b4c8..405651f60362b 100644 --- a/lib/ASTGen/Sources/ASTGen/LexicalLookup.swift +++ b/lib/ASTGen/Sources/ASTGen/LexicalLookup.swift @@ -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(drop: 4) + sourceFile.pointee.lookupCache = lookupCache + } guard let lookupPosition = sourceFile.pointee.position(of: lookupAt), let lookupToken = sourceFileSyntax.token(at: lookupPosition) @@ -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 @@ -196,11 +206,13 @@ 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 ) // Early reordering of macro declaration parameters with its generic parameters. @@ -413,7 +425,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) } diff --git a/lib/ASTGen/Sources/ASTGen/SourceFile.swift b/lib/ASTGen/Sources/ASTGen/SourceFile.swift index d7692a4641607..4d3d4dd6cf0d3 100644 --- a/lib/ASTGen/Sources/ASTGen/SourceFile.swift +++ b/lib/ASTGen/Sources/ASTGen/SourceFile.swift @@ -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. @@ -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!)