Skip to content

Commit ff6508f

Browse files
committed
ASTGen: Translate import declarations
1 parent 6ee1976 commit ff6508f

File tree

4 files changed

+100
-29
lines changed

4 files changed

+100
-29
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,12 +264,6 @@ void Diagnostic_finish(BridgedDiagnostic cDiag);
264264
BridgedIdentifier ASTContext_getIdentifier(BridgedASTContext cContext,
265265
BridgedString cStr);
266266

267-
void *ImportDecl_create(BridgedASTContext cContext,
268-
BridgedDeclContext cDeclContext,
269-
BridgedSourceLoc cImportLoc, char kind,
270-
BridgedSourceLoc cKindLoc, BridgedArrayRef path,
271-
BridgedArrayRef cPathLocs);
272-
273267
void *TopLevelCodeDecl_createStmt(BridgedASTContext cContext,
274268
BridgedDeclContext cDeclContext,
275269
BridgedSourceLoc cStartLoc, void *element,
@@ -494,6 +488,25 @@ void *OperatorDecl_create(
494488
BridgedIdentifier cPrecedenceGroupName,
495489
BridgedSourceLoc cPrecedenceGroupLoc);
496490

491+
typedef enum ENUM_EXTENSIBILITY_ATTR(open) {
492+
BridgedImportKindModule,
493+
BridgedImportKindType,
494+
BridgedImportKindStruct,
495+
BridgedImportKindClass,
496+
BridgedImportKindEnum,
497+
BridgedImportKindProtocol,
498+
BridgedImportKindVar,
499+
BridgedImportKindFunc,
500+
} BridgedImportKind;
501+
502+
void *ImportDecl_create(
503+
BridgedASTContext cContext,
504+
BridgedDeclContext cDeclContext,
505+
BridgedSourceLoc cImportKeywordLoc,
506+
BridgedImportKind cImportKind,
507+
BridgedSourceLoc cImportKindLoc,
508+
BridgedArrayRef cImportPathElements);
509+
497510
void *GenericParamList_create(
498511
BridgedASTContext cContext,
499512
BridgedSourceLoc cLeftAngleLoc,

lib/AST/CASTBridging.cpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -173,29 +173,6 @@ BridgedIdentifier ASTContext_getIdentifier(BridgedASTContext cContext,
173173
return {convertASTContext(cContext).getIdentifier(str).getAsOpaquePointer()};
174174
}
175175

176-
void *ImportDecl_create(BridgedASTContext cContext,
177-
BridgedDeclContext cDeclContext,
178-
BridgedSourceLoc cImportLoc, char kind,
179-
BridgedSourceLoc cKindLoc, BridgedArrayRef path,
180-
BridgedArrayRef cPathLocs) {
181-
assert(path.numElements == cPathLocs.numElements);
182-
ASTContext &context = convertASTContext(cContext);
183-
DeclContext *declContext = convertDeclContext(cDeclContext);
184-
185-
ImportPath::Builder importPath;
186-
for (auto p : llvm::zip(convertArrayRef<Identifier>(path),
187-
convertArrayRef<SourceLoc>(cPathLocs))) {
188-
Identifier ident;
189-
SourceLoc loc;
190-
std::tie(ident, loc) = p;
191-
importPath.push_back(ident, loc);
192-
}
193-
return ImportDecl::create(context, declContext, convertSourceLoc(cImportLoc),
194-
static_cast<ImportKind>(kind),
195-
convertSourceLoc(cKindLoc),
196-
std::move(importPath).get());
197-
}
198-
199176
BridgedSourceLoc SourceLoc_advanced(BridgedSourceLoc cLoc, long len) {
200177
SourceLoc loc = convertSourceLoc(cLoc).getAdvancedLoc(len);
201178
return {loc.getOpaquePointerValue()};
@@ -898,6 +875,33 @@ void *OperatorDecl_create(
898875
return static_cast<Decl *>(decl);
899876
}
900877

878+
void *ImportDecl_create(
879+
BridgedASTContext cContext,
880+
BridgedDeclContext cDeclContext,
881+
BridgedSourceLoc cImportKeywordLoc,
882+
BridgedImportKind cImportKind,
883+
BridgedSourceLoc cImportKindLoc,
884+
BridgedArrayRef cImportPathElements) {
885+
886+
ImportPath::Builder builder;
887+
for (auto &element :
888+
convertArrayRef<BridgedIdentifierAndSourceLoc>(cImportPathElements)) {
889+
builder.push_back(
890+
convertIdentifier(element.name), convertSourceLoc(element.nameLoc));
891+
}
892+
893+
ASTContext &context = convertASTContext(cContext);
894+
auto *decl = ImportDecl::create(
895+
context,
896+
convertDeclContext(cDeclContext),
897+
convertSourceLoc(cImportKeywordLoc),
898+
static_cast<ImportKind>(cImportKind),
899+
convertSourceLoc(cImportKindLoc),
900+
std::move(builder).get());
901+
902+
return static_cast<Decl *>(decl);
903+
}
904+
901905
void *OptionalTypeRepr_create(BridgedASTContext cContext, void *base,
902906
BridgedSourceLoc cQuestionLoc) {
903907
ASTContext &context = convertASTContext(cContext);

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,3 +377,47 @@ extension ASTGenVisitor {
377377
)
378378
}
379379
}
380+
381+
// MARK: - ImportDecl
382+
383+
extension BridgedImportKind {
384+
fileprivate init(tokenKind: TokenKind) {
385+
switch tokenKind {
386+
case .keyword(.typealias): self = .type
387+
case .keyword(.struct): self = .struct
388+
case .keyword(.class): self = .class
389+
case .keyword(.enum): self = .enum
390+
case .keyword(.protocol): self = .protocol
391+
case .keyword(.var), .keyword(.let): self = .var
392+
case .keyword(.func): self = .func
393+
default: fatalError("Unknown import kind")
394+
}
395+
}
396+
}
397+
398+
extension ASTGenVisitor {
399+
public func visit(_ node: ImportDeclSyntax) -> ASTNode {
400+
let importKind: BridgedImportKind
401+
if let tokenKind = node.importKind?.tokenKind {
402+
importKind = BridgedImportKind(tokenKind: tokenKind)
403+
} else {
404+
importKind = .module
405+
}
406+
407+
return .decl(
408+
node.path.map { component in
409+
let (name, nameLoc) = self.bridgedIdentifierAndSourceLoc(for: component.name)
410+
return BridgedIdentifierAndSourceLoc(name: name, nameLoc: nameLoc)
411+
} withBridgedArrayRef: { importPath in
412+
ImportDecl_create(
413+
self.ctx,
414+
self.declContext,
415+
self.bridgedSourceLoc(for: node.importKeyword),
416+
importKind,
417+
self.bridgedSourceLoc(for: node.importKind),
418+
importPath
419+
)
420+
}
421+
)
422+
}
423+
}

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)