Skip to content

Commit 9695ff4

Browse files
committed
Add support for SwiftIfConfig and lookup if config handling.
1 parent 8a3f9ab commit 9695ff4

File tree

4 files changed

+71
-7
lines changed

4 files changed

+71
-7
lines changed

include/swift/Bridging/ASTGen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ void swift_ASTGen_freeConfiguredRegions(
119119

120120
bool swift_ASTGen_validateUnqualifiedLookup(
121121
void *_Nonnull sourceFile,
122+
BridgedASTContext astContext,
122123
BridgedSourceLoc sourceLoc,
123124
bool finishInSequentialScope,
124125
BridgedArrayRef astScopeResultRef);

lib/AST/ASTScope.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ void ASTScope::unqualifiedLookup(
167167
ASTScopeImpl::unqualifiedLookup(SF, loc, loggingASTScopeDeclConsumer);
168168

169169
bool passed = swift_ASTGen_validateUnqualifiedLookup(SF->getExportedSourceFile(),
170+
SF->getASTContext(),
170171
loc,
171172
loggingASTScopeDeclConsumer.finishLookupInBraceStmt(nullptr),
172173
BridgedArrayRef(loggingASTScopeDeclConsumer.recordedElements.data(), loggingASTScopeDeclConsumer.recordedElements.size())

lib/ASTGen/Sources/ASTGen/LexicalLookup.swift

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ private let rowCharWidth: Int = 30
2020
@_cdecl("swift_ASTGen_validateUnqualifiedLookup")
2121
public func unqualifiedLookup(
2222
sourceFilePtr: UnsafeRawPointer,
23+
astContext: BridgedASTContext,
2324
lookupAt: BridgedSourceLoc,
2425
finishInSequentialScope: Bool,
2526
astScopeResultRef: BridgedArrayRef
@@ -29,6 +30,11 @@ public func unqualifiedLookup(
2930
let sourceFileSyntax = sourceFile.pointee.syntax
3031
let sourceLocationConverter = sourceFile.pointee.sourceLocationConverter
3132

33+
let buildConfiguration = CompilerBuildConfiguration(
34+
ctx: astContext,
35+
sourceBuffer: sourceFile.pointee.buffer
36+
)
37+
3238
guard let lookupPosition = sourceFile.pointee.position(of: lookupAt),
3339
let lookupToken = sourceFileSyntax.token(at: lookupPosition)
3440
else {
@@ -37,10 +43,17 @@ public func unqualifiedLookup(
3743
}
3844

3945
// Map AST result
40-
let astResults = astConsumedResults(sourceFile: sourceFile, astScopeResultRef: astScopeResultRef)
46+
let astResults = astConsumedResults(
47+
sourceFile: sourceFile,
48+
astScopeResultRef: astScopeResultRef
49+
)
4150

4251
// Map SLL result
43-
let sllResults = sllConsumedResults(lookupToken: lookupToken, finishInSequentialScope: finishInSequentialScope)
52+
let sllResults = sllConsumedResults(
53+
lookupToken: lookupToken,
54+
finishInSequentialScope: finishInSequentialScope,
55+
buildConfiguration: buildConfiguration
56+
)
4457

4558
// Add header to the output
4659
var consoleOutput = "-----> Lookup started at: \(sourceLocationConverter.location(for: lookupPosition).lineWithColumn) (\"\(lookupToken.text)\") finishInSequentialScope: \(finishInSequentialScope)\n"
@@ -99,6 +112,8 @@ private func isInvalidFirstNameInDeclarationIntroduction(
99112
SwitchCaseSyntax.self,
100113
ClosureExprSyntax.self,
101114
AccessorDeclSyntax.self,
115+
AccessorBlockSyntax.self,
116+
ForStmtSyntax.self,
102117
PatternBindingSyntax.self
103118
]
104119

@@ -151,9 +166,10 @@ private func astConsumedResults(
151166
/// the results an array of `ConsumedLookupResult`. Introduces appropriate flags.
152167
private func sllConsumedResults(
153168
lookupToken: TokenSyntax,
154-
finishInSequentialScope: Bool
169+
finishInSequentialScope: Bool,
170+
buildConfiguration: CompilerBuildConfiguration
155171
) -> [ConsumedLookupResult] {
156-
lookupToken.lookup(nil, with: LookupConfig(finishInSequentialScope: finishInSequentialScope))
172+
lookupToken.lookup(nil, with: LookupConfig(finishInSequentialScope: finishInSequentialScope, buildConfiguration: buildConfiguration))
157173
.flatMap { result in
158174
switch result {
159175
case .lookInMembers(let lookInMembers):
@@ -176,9 +192,15 @@ private func sllConsumedResults(
176192
)]
177193
default:
178194
if let parent = result.scope.parent, result.scope.is(GenericParameterClauseSyntax.self) {
179-
if (parent.is(FunctionDeclSyntax.self) ||
180-
parent.is(SubscriptDeclSyntax.self) ||
181-
result.scope.range.contains(lookupToken.position)) {
195+
if let parentFunctionDecl = parent.as(FunctionDeclSyntax.self),
196+
parentFunctionDecl.attributes.range.contains(lookupToken.position) {
197+
// If lookup started fron function attributes, don't reverse
198+
return result.names.map { name in
199+
ConsumedLookupResult(rawName: name.identifier?.name ?? "", position: name.position, flags: [])
200+
}
201+
} else if parent.is(FunctionDeclSyntax.self) ||
202+
parent.is(SubscriptDeclSyntax.self) ||
203+
result.scope.range.contains(lookupToken.position) {
182204
// If a result from function generic parameter clause or lookup started within it, reverse introduced names.
183205
return result.names.reversed().map { name in
184206
ConsumedLookupResult(rawName: name.identifier?.name ?? "", position: name.position, flags: .placementRearranged)
@@ -188,6 +210,15 @@ private func sllConsumedResults(
188210
return result.names.reversed().map { name in
189211
ConsumedLookupResult(rawName: name.identifier?.name ?? "", position: name.position, flags: .placementRearranged)
190212
}
213+
} else if let initializerDecl = parent.as(InitializerDeclSyntax.self),
214+
initializerDecl.range.contains(lookupToken.position) {
215+
return result.names.reversed().map { name in
216+
ConsumedLookupResult(rawName: name.identifier?.name ?? "", position: name.position, flags: .placementRearranged)
217+
}
218+
} else if parent.is(TypeAliasDeclSyntax.self) {
219+
return result.names.reversed().map { name in
220+
ConsumedLookupResult(rawName: name.identifier?.name ?? "", position: name.position, flags: .placementRearranged)
221+
}
191222
}
192223

193224
// No flags or reorderings to perform.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-feature UnqualifiedLookupValidation
2+
3+
import SwiftShims
4+
5+
extension Unicode.SMTH: Sequence { // expected-error{{'SMTH' is not a member type of enum 'Swift.Unicode'}}
6+
7+
internal consuming func makeIterator() -> Iterator {
8+
Iterator(source: source.makeIterator())
9+
}
10+
11+
internal struct Iterator: IteratorProtocol {
12+
13+
internal var source: Source.Iterator
14+
internal var normalizer: Unicode._NFCNormalizer
15+
16+
internal init(source: Source.Iterator) {
17+
self.source = source
18+
if let strIter = source as? String.UnicodeScalarView.Iterator {
19+
self.normalizer = Unicode._NFCNormalizer(sourceString: strIter._guts)
20+
} else if let substrIter = source as? Substring.UnicodeScalarView.Iterator {
21+
self.normalizer = Unicode._NFCNormalizer(sourceString: substrIter._elements._wholeGuts)
22+
} else {
23+
self.normalizer = Unicode._NFCNormalizer()
24+
}
25+
}
26+
27+
internal mutating func next() -> Unicode.Scalar? {
28+
normalizer.resume { source.next() } ?? normalizer.flush()
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)