Skip to content

Commit a8db87a

Browse files
committed
ASTGen: Translate import declarations
1 parent 5e46243 commit a8db87a

File tree

4 files changed

+96
-29
lines changed

4 files changed

+96
-29
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,12 +256,6 @@ BridgedIdentifier ASTContext_getIdentifier(BridgedASTContext cContext,
256256
_Bool ASTContext_langOptsHasFeature(BridgedASTContext cContext,
257257
BridgedFeature feature);
258258

259-
void *ImportDecl_create(BridgedASTContext cContext,
260-
BridgedDeclContext cDeclContext,
261-
BridgedSourceLoc cImportLoc, char kind,
262-
BridgedSourceLoc cKindLoc, BridgedArrayRef path,
263-
BridgedArrayRef cPathLocs);
264-
265259
void *TopLevelCodeDecl_createStmt(BridgedASTContext cContext,
266260
BridgedDeclContext cDeclContext,
267261
BridgedSourceLoc cStartLoc, void *element,
@@ -440,6 +434,24 @@ void *OperatorDecl_create(BridgedASTContext cContext,
440434
BridgedIdentifier cPrecedenceGroupName,
441435
BridgedSourceLoc cPrecedenceGroupLoc);
442436

437+
typedef enum ENUM_EXTENSIBILITY_ATTR(open) {
438+
BridgedImportKindModule,
439+
BridgedImportKindType,
440+
BridgedImportKindStruct,
441+
BridgedImportKindClass,
442+
BridgedImportKindEnum,
443+
BridgedImportKindProtocol,
444+
BridgedImportKindVar,
445+
BridgedImportKindFunc,
446+
} BridgedImportKind;
447+
448+
void *ImportDecl_create(BridgedASTContext cContext,
449+
BridgedDeclContext cDeclContext,
450+
BridgedSourceLoc cImportKeywordLoc,
451+
BridgedImportKind cImportKind,
452+
BridgedSourceLoc cImportKindLoc,
453+
BridgedArrayRef cImportPathElements);
454+
443455
void *GenericParamList_create(BridgedASTContext cContext,
444456
BridgedSourceLoc cLeftAngleLoc,
445457
BridgedArrayRef cParameters,

lib/AST/CASTBridging.cpp

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -192,29 +192,6 @@ bool ASTContext_langOptsHasFeature(BridgedASTContext cContext,
192192
return convertASTContext(cContext).LangOpts.hasFeature((Feature)feature);
193193
}
194194

195-
void *ImportDecl_create(BridgedASTContext cContext,
196-
BridgedDeclContext cDeclContext,
197-
BridgedSourceLoc cImportLoc, char kind,
198-
BridgedSourceLoc cKindLoc, BridgedArrayRef path,
199-
BridgedArrayRef cPathLocs) {
200-
assert(path.numElements == cPathLocs.numElements);
201-
ASTContext &context = convertASTContext(cContext);
202-
DeclContext *declContext = convertDeclContext(cDeclContext);
203-
204-
ImportPath::Builder importPath;
205-
for (auto p : llvm::zip(convertArrayRef<Identifier>(path),
206-
convertArrayRef<SourceLoc>(cPathLocs))) {
207-
Identifier ident;
208-
SourceLoc loc;
209-
std::tie(ident, loc) = p;
210-
importPath.push_back(ident, loc);
211-
}
212-
return ImportDecl::create(context, declContext, convertSourceLoc(cImportLoc),
213-
static_cast<ImportKind>(kind),
214-
convertSourceLoc(cKindLoc),
215-
std::move(importPath).get());
216-
}
217-
218195
BridgedSourceLoc SourceLoc_advanced(BridgedSourceLoc cLoc, SwiftInt len) {
219196
SourceLoc loc = convertSourceLoc(cLoc).getAdvancedLoc(len);
220197
return {loc.getOpaquePointerValue()};
@@ -830,6 +807,28 @@ void *OperatorDecl_create(BridgedASTContext cContext,
830807
return static_cast<Decl *>(decl);
831808
}
832809

810+
void *ImportDecl_create(BridgedASTContext cContext,
811+
BridgedDeclContext cDeclContext,
812+
BridgedSourceLoc cImportKeywordLoc,
813+
BridgedImportKind cImportKind,
814+
BridgedSourceLoc cImportKindLoc,
815+
BridgedArrayRef cImportPathElements) {
816+
ImportPath::Builder builder;
817+
for (auto &element :
818+
convertArrayRef<BridgedIdentifierAndSourceLoc>(cImportPathElements)) {
819+
builder.push_back(convertIdentifier(element.name),
820+
convertSourceLoc(element.nameLoc));
821+
}
822+
823+
ASTContext &context = convertASTContext(cContext);
824+
auto *decl = ImportDecl::create(
825+
context, convertDeclContext(cDeclContext),
826+
convertSourceLoc(cImportKeywordLoc), static_cast<ImportKind>(cImportKind),
827+
convertSourceLoc(cImportKindLoc), std::move(builder).get());
828+
829+
return static_cast<Decl *>(decl);
830+
}
831+
833832
void *OptionalTypeRepr_create(BridgedASTContext cContext, void *base,
834833
BridgedSourceLoc cQuestionLoc) {
835834
ASTContext &context = convertASTContext(cContext);

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,52 @@ extension ASTGenVisitor {
350350
}
351351
}
352352

353+
// MARK: - ImportDecl
354+
355+
extension BridgedImportKind {
356+
fileprivate init?(from tokenKind: TokenKind) {
357+
switch tokenKind {
358+
case .keyword(.typealias): self = .type
359+
case .keyword(.struct): self = .struct
360+
case .keyword(.class): self = .class
361+
case .keyword(.enum): self = .enum
362+
case .keyword(.protocol): self = .protocol
363+
case .keyword(.var), .keyword(.let): self = .var
364+
case .keyword(.func): self = .func
365+
default: return nil
366+
}
367+
}
368+
}
369+
370+
extension ASTGenVisitor {
371+
func visit(_ node: ImportDeclSyntax) -> ASTNode {
372+
let importKind: BridgedImportKind
373+
if let specifier = node.importKindSpecifier {
374+
if let value = BridgedImportKind(from: specifier.tokenKind) {
375+
importKind = value
376+
} else {
377+
self.diagnose(Diagnostic(node: specifier, message: UnexpectedTokenKindError(token: specifier)))
378+
importKind = .module
379+
}
380+
} else {
381+
importKind = .module
382+
}
383+
384+
return .decl(
385+
ImportDecl_create(
386+
self.ctx,
387+
self.declContext,
388+
self.bridgedSourceLoc(for: node.importKeyword),
389+
importKind,
390+
self.bridgedSourceLoc(for: node.importKindSpecifier),
391+
node.path.lazy.map {
392+
$0.name.bridgedIdentifierAndSourceLoc(in: self) as BridgedIdentifierAndSourceLoc
393+
}.bridgedArray(in: self)
394+
)
395+
)
396+
}
397+
}
398+
353399
extension ASTGenVisitor {
354400
@inline(__always)
355401
func visit(_ node: MemberBlockItemListSyntax) -> BridgedArrayRef {

test/ASTGen/verify-parse.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@
1414

1515
// NB: Ridiculous formatting to test that we do not include leading trivia in locations.
1616

17+
import
18+
Swift
19+
import typealias Swift.Codable
20+
import enum Swift.Optional
21+
import struct Swift.Array
22+
import class Swift.KeyPath
23+
import protocol Swift.Sequence
24+
import func Swift.max
25+
import var Swift._playgroundPrintHook
26+
1727
func
1828
test1
1929
(

0 commit comments

Comments
 (0)