Skip to content

Commit f9730a7

Browse files
committed
[ASTGen] Generate SubscriptDecls
1 parent 2f25d8f commit f9730a7

File tree

5 files changed

+91
-2
lines changed

5 files changed

+91
-2
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,12 @@ BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
397397
// MARK: Decls
398398
//===----------------------------------------------------------------------===//
399399

400+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedStaticSpelling {
401+
BridgedStaticSpellingNone,
402+
BridgedStaticSpellingStatic,
403+
BridgedStaticSpellingClass
404+
};
405+
400406
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAccessorKind {
401407
#define ACCESSOR(ID) BridgedAccessorKind##ID,
402408
#include "swift/AST/AccessorKinds.def"
@@ -631,6 +637,17 @@ BridgedImportDecl BridgedImportDecl_createParsed(
631637
BridgedSourceLoc cImportKeywordLoc, BridgedImportKind cImportKind,
632638
BridgedSourceLoc cImportKindLoc, BridgedArrayRef cImportPathElements);
633639

640+
SWIFT_NAME("BridgedSubscriptDecl.createParsed(_:declContext:staticLoc:"
641+
"staticSpelling:subscriptKeywordLoc:genericParamList:parameterList:"
642+
"arrowLoc:returnType:)")
643+
BridgedSubscriptDecl BridgedSubscriptDecl_createParsed(
644+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
645+
BridgedSourceLoc cStaticLoc, BridgedStaticSpelling cStaticSpelling,
646+
BridgedSourceLoc cSubscriptKeywordLoc,
647+
BridgedNullableGenericParamList cGenericParamList,
648+
BridgedParameterList cParamList, BridgedSourceLoc cArrowLoc,
649+
BridgedTypeRepr returnType);
650+
634651
SWIFT_NAME(
635652
"BridgedTopLevelCodeDecl.createParsed(_:declContext:startLoc:stmt:endLoc:)")
636653
BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createStmt(
@@ -691,6 +708,15 @@ SWIFT_NAME("BridgedNominalTypeDecl.setParsedMembers(self:_:)")
691708
void BridgedNominalTypeDecl_setParsedMembers(BridgedNominalTypeDecl decl,
692709
BridgedArrayRef members);
693710

711+
//===----------------------------------------------------------------------===//
712+
// MARK: SubscriptDecl
713+
//===----------------------------------------------------------------------===//
714+
715+
SWIFT_NAME("getter:BridgedSubscriptDecl.asAbstractStorageDecl(self:)")
716+
BRIDGED_INLINE
717+
BridgedAbstractStorageDecl
718+
BridgedSubscriptDecl_asAbstractStorageDecl(BridgedSubscriptDecl decl);
719+
694720
//===----------------------------------------------------------------------===//
695721
// MARK: VarDecl
696722
//===----------------------------------------------------------------------===//

include/swift/AST/ASTBridgingImpl.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ bool BridgedNominalTypeDecl_hasValueDeinit(BridgedNominalTypeDecl decl) {
4545
return decl.unbridged()->getValueTypeDestructor() != nullptr;
4646
}
4747

48+
//===----------------------------------------------------------------------===//
49+
// MARK: BridgedSubscriptDecl
50+
//===----------------------------------------------------------------------===//
51+
52+
BridgedAbstractStorageDecl
53+
BridgedSubscriptDecl_asAbstractStorageDecl(BridgedSubscriptDecl decl) {
54+
return decl.unbridged();
55+
}
56+
4857
//===----------------------------------------------------------------------===//
4958
// MARK: BridgedVarDecl
5059
//===----------------------------------------------------------------------===//

lib/AST/ASTBridging.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ static TypeAttrKind unbridged(BridgedTypeAttrKind kind) {
4848
}
4949
}
5050

51+
static StaticSpellingKind unbridged(BridgedStaticSpelling kind) {
52+
return static_cast<StaticSpellingKind>(kind);
53+
}
54+
5155
static AccessorKind unbridged(BridgedAccessorKind kind) {
5256
return static_cast<AccessorKind>(kind);
5357
}
@@ -848,6 +852,20 @@ BridgedImportDecl BridgedImportDecl_createParsed(
848852
std::move(builder).get());
849853
}
850854

855+
BridgedSubscriptDecl BridgedSubscriptDecl_createParsed(
856+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
857+
BridgedSourceLoc cStaticLoc, BridgedStaticSpelling cStaticSpelling,
858+
BridgedSourceLoc cSubscriptKeywordLoc,
859+
BridgedNullableGenericParamList cGenericParamList,
860+
BridgedParameterList cParamList, BridgedSourceLoc cArrowLoc,
861+
BridgedTypeRepr returnType) {
862+
return SubscriptDecl::createParsed(
863+
cContext.unbridged(), cStaticLoc.unbridged(), unbridged(cStaticSpelling),
864+
cSubscriptKeywordLoc.unbridged(), cParamList.unbridged(),
865+
cArrowLoc.unbridged(), returnType.unbridged(), cDeclContext.unbridged(),
866+
cGenericParamList.unbridged());
867+
}
868+
851869
BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createStmt(
852870
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
853871
BridgedSourceLoc cStartLoc, BridgedStmt statement,

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ extension ASTGenVisitor {
6262
return self.generate(protocolDecl: node).asDecl
6363
case .structDecl(let node):
6464
return self.generate(structDecl: node).asDecl
65-
case .subscriptDecl:
66-
break
65+
case .subscriptDecl(let node):
66+
return self.generate(subscriptDecl: node).asDecl
6767
case .typeAliasDecl(let node):
6868
return self.generate(typeAliasDecl: node).asDecl
6969
case .variableDecl(let node):
@@ -479,6 +479,29 @@ extension ASTGenVisitor {
479479
isLet: isLet
480480
)
481481
}
482+
483+
func generate(subscriptDecl node: SubscriptDeclSyntax) -> BridgedSubscriptDecl {
484+
// FIXME: Compute static
485+
let staticLoc: BridgedSourceLoc = nil
486+
let staticSpelling = BridgedStaticSpelling.none
487+
488+
let subscriptDecl = BridgedSubscriptDecl.createParsed(
489+
self.ctx,
490+
declContext: self.declContext,
491+
staticLoc: staticLoc,
492+
staticSpelling: staticSpelling,
493+
subscriptKeywordLoc: self.generateSourceLoc(node.subscriptKeyword),
494+
genericParamList: self.generate(genericParameterClause: node.genericParameterClause),
495+
parameterList: self.generate(functionParameterClause: node.parameterClause, forSubscript: true),
496+
arrowLoc: self.generateSourceLoc(node.returnClause.arrow),
497+
returnType: self.generate(type: node.returnClause.type)
498+
)
499+
if let accessors = node.accessorBlock {
500+
let storage = subscriptDecl.asAbstractStorageDecl
501+
storage.setAccessors(generate(accessorBlock: accessors, for: storage))
502+
}
503+
return subscriptDecl
504+
}
482505
}
483506

484507
// MARK: - AbstractFunctionDecl

test/ASTGen/verify-parse.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,19 @@ extension TestVars {
191191
var inExt: Int { return 0 }
192192
}
193193

194+
struct TestSubscripts {
195+
subscript(x: Int) -> Int {
196+
// FIXME: We don't yet handle single expression bodies.
197+
return 0
198+
}
199+
subscript(y x: Int) -> Int {
200+
get {
201+
return 0
202+
}
203+
set(x) {}
204+
}
205+
}
206+
194207
protocol Proto1 {}
195208
protocol Proto2 {}
196209

0 commit comments

Comments
 (0)