Skip to content

Commit 26259f6

Browse files
authored
Merge pull request #80351 from rintaro/astgen-attributes-reorg
[ASTGen] Update for specialized attribute kind removal
2 parents 0897962 + 2a21e68 commit 26259f6

File tree

2 files changed

+149
-146
lines changed

2 files changed

+149
-146
lines changed

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 75 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -436,24 +436,25 @@ extension ASTGenVisitor {
436436
/// @_alignment(8)
437437
/// ```
438438
func generateAlignmentAttr(attribute node: AttributeSyntax) -> BridgedAlignmentAttr? {
439-
guard
440-
let arg = node.arguments?.as(TokenSyntax.self)
441-
else {
442-
print("Not a token")
443-
// TODO: Diagnose.
444-
return nil
445-
}
446-
let value: Int? = Int(String(syntaxText: arg.rawText))
447-
guard let value, value > 0 else {
448-
// TODO: Diagnose.
449-
return nil
439+
self.generateWithLabeledExprListArguments(attribute: node) { args in
440+
let value: Int? = self.generateConsumingAttrOption(args: &args, label: nil) { expr in
441+
guard let intExpr = expr.as(IntegerLiteralExprSyntax.self) else {
442+
return nil
443+
}
444+
return intExpr.representedLiteralValue
445+
}
446+
guard let value, value > 0 else {
447+
// TODO: Diagnose.
448+
return nil
449+
}
450+
451+
return .createParsed(
452+
self.ctx,
453+
atLoc: self.generateSourceLoc(node.atSign),
454+
range: self.generateAttrSourceRange(node),
455+
value: value
456+
)
450457
}
451-
return .createParsed(
452-
self.ctx,
453-
atLoc: self.generateSourceLoc(node.atSign),
454-
range: self.generateAttrSourceRange(node),
455-
value: value
456-
)
457458
}
458459

459460
/// E.g.:
@@ -557,25 +558,18 @@ extension ASTGenVisitor {
557558
/// @_cdecl("c_function_name")
558559
/// ```
559560
func generateCDeclAttr(attribute node: AttributeSyntax) -> BridgedCDeclAttr? {
560-
guard
561-
// `@_cdecl` attribute has `.string(StringLiteralExprSyntax)` arguments.
562-
let arg = node.arguments?.as(StringLiteralExprSyntax.self)
563-
else {
564-
// TODO: Diagnose.
565-
return nil
566-
}
567-
guard
568-
let name = self.generateStringLiteralTextIfNotInterpolated(expr: arg)
569-
else {
570-
// TODO: Diagnose.
571-
return nil
561+
self.generateWithLabeledExprListArguments(attribute: node) { args in
562+
guard let name = self.generateConsumingSimpleStringLiteralAttrOption(args: &args) else {
563+
return nil
564+
}
565+
566+
return .createParsed(
567+
self.ctx,
568+
atLoc: self.generateSourceLoc(node.atSign),
569+
range: self.generateAttrSourceRange(node),
570+
name: name
571+
)
572572
}
573-
return .createParsed(
574-
self.ctx,
575-
atLoc: self.generateSourceLoc(node.atSign),
576-
range: self.generateAttrSourceRange(node),
577-
name: name
578-
)
579573
}
580574

581575
struct GeneratedDerivativeOriginalDecl {
@@ -940,13 +934,21 @@ extension ASTGenVisitor {
940934
}
941935

942936
// Name.
943-
let name = self.generateConsumingSimpleStringLiteralAttrOption(args: &args) ?? ""
937+
let name: BridgedStringRef?
938+
if !args.isEmpty {
939+
name = self.generateConsumingSimpleStringLiteralAttrOption(args: &args) ?? ""
940+
guard name != nil else {
941+
return nil
942+
}
943+
} else {
944+
name = nil
945+
}
944946

945947
return .createParsed(
946948
self.ctx,
947949
atLoc: self.generateSourceLoc(node.atSign),
948950
range: self.generateAttrSourceRange(node),
949-
name: name,
951+
name: name ?? BridgedStringRef(),
950952
kind: kind
951953
)
952954
}
@@ -1605,27 +1607,21 @@ extension ASTGenVisitor {
16051607
}
16061608

16071609
func generatePrivateImportAttr(attribute node: AttributeSyntax) -> BridgedPrivateImportAttr? {
1608-
guard
1609-
// `@_private` has special argument list syntax
1610-
let args = node.arguments?.as(UnderscorePrivateAttributeArgumentsSyntax.self)
1611-
else {
1612-
// TODO: Diagnose
1613-
return nil
1614-
}
1610+
self.generateWithLabeledExprListArguments(attribute: node) { args in
1611+
let fileName = self.generateConsumingSimpleStringLiteralAttrOption(args: &args, label: "sourceFile")
1612+
guard let fileName else {
1613+
return nil
1614+
}
16151615

1616-
guard let fileName = self.generateStringLiteralTextIfNotInterpolated(expr: args.filename) else {
1617-
// TODO: Diagnose
1618-
return nil
1616+
return .createParsed(
1617+
self.ctx,
1618+
atLoc: self.generateSourceLoc(node.atSign),
1619+
attrNameLoc: self.generateSourceLoc(node.attributeName),
1620+
lParenLoc: self.generateSourceLoc(node.leftParen),
1621+
fileName: fileName,
1622+
rParenLoc: self.generateSourceLoc(node.rightParen)
1623+
)
16191624
}
1620-
1621-
return .createParsed(
1622-
self.ctx,
1623-
atLoc: self.generateSourceLoc(node.atSign),
1624-
attrNameLoc: self.generateSourceLoc(node.attributeName),
1625-
lParenLoc: self.generateSourceLoc(node.leftParen),
1626-
fileName: fileName,
1627-
rParenLoc: self.generateSourceLoc(node.rightParen)
1628-
)
16291625
}
16301626

16311627
/// E.g.:
@@ -1820,24 +1816,18 @@ extension ASTGenVisitor {
18201816
/// ```
18211817
/// @semantics("semantics_name")
18221818
func generateSemanticsAttr(attribute node: AttributeSyntax) -> BridgedSemanticsAttr? {
1823-
guard
1824-
let arg = node.arguments?.as(StringLiteralExprSyntax.self)
1825-
else {
1826-
// TODO: Diagnose.
1827-
return nil
1828-
}
1829-
guard
1830-
let value = self.generateStringLiteralTextIfNotInterpolated(expr: arg)
1831-
else {
1832-
// TODO: Diagnose.
1833-
return nil
1819+
self.generateWithLabeledExprListArguments(attribute: node) { args in
1820+
guard let value = self.generateConsumingSimpleStringLiteralAttrOption(args: &args) else {
1821+
return nil
1822+
}
1823+
1824+
return .createParsed(
1825+
self.ctx,
1826+
atLoc: self.generateSourceLoc(node.atSign),
1827+
range: self.generateAttrSourceRange(node),
1828+
value: value
1829+
)
18341830
}
1835-
return .createParsed(
1836-
self.ctx,
1837-
atLoc: self.generateSourceLoc(node.atSign),
1838-
range: self.generateAttrSourceRange(node),
1839-
value: value
1840-
)
18411831
}
18421832

18431833
/// E.g.:
@@ -2160,15 +2150,15 @@ extension ASTGenVisitor {
21602150
/// @_unavailableFromAsync(message: "use fooBar(_:) instead")
21612151
/// ```
21622152
func generateUnavailableFromAsyncAttr(attribute node: AttributeSyntax) -> BridgedUnavailableFromAsyncAttr? {
2153+
21632154
var message: BridgedStringRef? = nil
21642155
if node.arguments != nil {
2165-
// FIXME: Should be normal LabeledExprListSyntax arguments.
2166-
2167-
guard let args = node.arguments?.as(UnavailableFromAsyncAttributeArgumentsSyntax.self) else {
2168-
// TODO: Diagnose.
2156+
message = self.generateWithLabeledExprListArguments(attribute: node) { args in
2157+
self.generateConsumingSimpleStringLiteralAttrOption(args: &args, label: "message")
2158+
}
2159+
guard message != nil else {
21692160
return nil
21702161
}
2171-
message = self.generateStringLiteralTextIfNotInterpolated(expr: args.message)
21722162
}
21732163
return .createParsed(
21742164
self.ctx,
@@ -2309,14 +2299,13 @@ extension ASTGenVisitor {
23092299
_ valueGeneratorFunction: (TokenSyntax) -> R?
23102300
) -> R? {
23112301
return generateConsumingAttrOption(args: &args, label: nil) {
2312-
guard
2313-
let declRefExpr = $0.as(DeclReferenceExprSyntax.self),
2314-
declRefExpr.argumentNames == nil
2315-
else {
2316-
// TODO: Diagnose.
2317-
return nil
2302+
if let declRefExpr = $0.as(DeclReferenceExprSyntax.self), declRefExpr.argumentNames == nil {
2303+
return valueGeneratorFunction(declRefExpr.baseName)
2304+
} else if let discardExpr = $0.as(DiscardAssignmentExprSyntax.self) {
2305+
return valueGeneratorFunction(discardExpr.wildcard)
23182306
}
2319-
return valueGeneratorFunction(declRefExpr.baseName)
2307+
// TODO: Diagnose.
2308+
return nil
23202309
}
23212310
}
23222311

@@ -2341,19 +2330,14 @@ extension ASTGenVisitor {
23412330
_ valueGeneratorFunction: (TokenSyntax) -> Result?,
23422331
valueIfOmitted: Result? = nil
23432332
) -> Result? {
2344-
guard node.leftParen != nil, let arguments = node.arguments else {
2333+
guard node.arguments != nil else {
23452334
if let valueIfOmitted {
23462335
return valueIfOmitted
23472336
}
23482337
self.diagnose(.expectedArgumentsInAttribute(node))
23492338
return nil
23502339
}
23512340

2352-
if case .token(let tok) = arguments {
2353-
// Special case: was parsed as a token, not an an argument list
2354-
return valueGeneratorFunction(tok)
2355-
}
2356-
23572341
return self.generateWithLabeledExprListArguments(attribute: node) { args in
23582342
self.generateConsumingPlainIdentifierAttrOption(
23592343
args: &args,

lib/ASTGen/Sources/ASTGen/TypeAttrs.swift

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -142,38 +142,49 @@ extension ASTGenVisitor {
142142
nameLoc: self.generateSourceLoc(node.attributeName)
143143
)
144144
}
145-
145+
146+
/// E.g.
147+
/// ```
148+
/// @convention(c)
149+
/// @convention(c, cType: "int (*)(int)")
150+
/// ```
146151
func generateConventionTypeAttr(attribute node: AttributeSyntax) -> BridgedConventionTypeAttr? {
147-
// FIXME: This doesn't need custom attribute arguments syntax.
148-
// FIXME: Support 'witness_method' argument.
149-
guard let args = node.arguments?.as(ConventionAttributeArgumentsSyntax.self) else {
150-
// TODO: Diangose.
151-
return nil
152-
}
153-
154-
let cTypeName: BridgedStringRef?
155-
let cTypeNameLoc: BridgedSourceLoc?
156-
if let ctypeString = args.cTypeString {
157-
cTypeName = self.generateStringLiteralTextIfNotInterpolated(expr: ctypeString)
158-
cTypeNameLoc = cTypeName != nil ? self.generateSourceLoc(ctypeString) : nil
159-
} else {
160-
cTypeName = nil
161-
cTypeNameLoc = nil
152+
self.generateWithLabeledExprListArguments(attribute: node) { args in
153+
let nameAndLoc: (name: _, loc: _)? = self.generateConsumingPlainIdentifierAttrOption(args: &args) {
154+
(ctx.allocateCopy(string: $0.rawText.bridged), self.generateSourceLoc($0))
155+
}
156+
guard let nameAndLoc else {
157+
return nil
158+
}
159+
160+
let cTypeNameLoc: BridgedSourceLoc?
161+
let cTypeName: BridgedStringRef?
162+
if !args.isEmpty {
163+
cTypeNameLoc = self.generateSourceLoc(args.first?.expression)
164+
cTypeName = self.generateConsumingSimpleStringLiteralAttrOption(args: &args, label: "cType")
165+
guard cTypeName != nil else {
166+
return nil
167+
}
168+
} else {
169+
cTypeNameLoc = nil
170+
cTypeName = nil
171+
}
172+
173+
// `@convention(witness_method: <protocol-name>)` is for SIL only.
174+
let witnessMethodProtocol: BridgedDeclNameRef = BridgedDeclNameRef()
175+
176+
return .createParsed(
177+
self.ctx,
178+
atLoc: self.generateSourceLoc(node.atSign),
179+
nameLoc: self.generateSourceLoc(node.attributeName),
180+
parensRange: self.generateAttrParensRange(attribute: node),
181+
name: nameAndLoc.name,
182+
nameLoc: nameAndLoc.loc,
183+
witnessMethodProtocol: witnessMethodProtocol,
184+
clangType: cTypeName ?? BridgedStringRef(),
185+
clangTypeLoc: cTypeNameLoc ?? BridgedSourceLoc()
186+
)
162187
}
163-
164-
let witnessMethodProtocol: BridgedDeclNameRef = BridgedDeclNameRef()
165-
166-
return .createParsed(
167-
self.ctx,
168-
atLoc: self.generateSourceLoc(node.atSign),
169-
nameLoc: self.generateSourceLoc(node.attributeName),
170-
parensRange: self.generateAttrParensRange(attribute: node),
171-
name: ctx.allocateCopy(string: args.conventionLabel.rawText.bridged),
172-
nameLoc: self.generateSourceLoc(args.conventionLabel),
173-
witnessMethodProtocol: witnessMethodProtocol,
174-
clangType: cTypeName ?? BridgedStringRef(),
175-
clangTypeLoc: cTypeNameLoc ?? BridgedSourceLoc()
176-
)
177188
}
178189

179190
func generateDifferentiableTypeAttr(attribute node: AttributeSyntax) -> BridgedDifferentiableTypeAttr? {
@@ -284,35 +295,43 @@ extension ASTGenVisitor {
284295
)
285296
}
286297

298+
/// E.g.
299+
/// ```
300+
/// @_opaqueReturnTypeOf("$sMangledName", 4)
301+
/// ```
287302
func generateOpaqueReturnTypeOfTypeAttr(attribute node: AttributeSyntax) -> BridgedOpaqueReturnTypeOfTypeAttr? {
288-
// FIXME: This doesn't need custom attribute arguments syntax.
289-
guard let args = node.arguments?.as(OpaqueReturnTypeOfAttributeArgumentsSyntax.self) else {
290-
// TODO: Diagnose
291-
fatalError("expected arguments for @_opaqueReturnTypeOfType type attribute")
292-
}
303+
self.generateWithLabeledExprListArguments(attribute: node) { args in
304+
let mangledLoc = self.generateSourceLoc(args.first?.expression)
305+
let mangledName = self.generateConsumingSimpleStringLiteralAttrOption(args: &args)
306+
guard let mangledName else {
307+
return nil
308+
}
293309

294-
let mangledLoc = self.generateSourceLoc(args.mangledName)
295-
guard let mangled = self.generateStringLiteralTextIfNotInterpolated(expr: args.mangledName) else {
296-
// TODO: Diagnose
297-
fatalError("expected string literal for @_opaqueReturnTypeOfType type attribute")
298-
}
299-
300-
let indexLoc = self.generateSourceLoc(args.ordinal)
301-
let index = Int(args.ordinal.text, radix: 10)
302-
guard let index else {
303-
// TODO: Diagnose
304-
fatalError("expected integer literal for @_opaqueReturnTypeOfType type attribute")
310+
let indexLoc = self.generateSourceLoc(args.first?.expression)
311+
let index: Int? = self.generateConsumingAttrOption(args: &args, label: nil) { expr in
312+
guard let intExpr = expr.as(IntegerLiteralExprSyntax.self) else {
313+
// TODO: Diagnostics.
314+
fatalError("expected integer literal")
315+
// return nil
316+
}
317+
return intExpr.representedLiteralValue
318+
}
319+
guard let index else {
320+
return nil
321+
}
322+
323+
return .createParsed(
324+
self.ctx,
325+
atLoc: self.generateSourceLoc(node.atSign),
326+
nameLoc: self.generateSourceLoc(node.attributeName),
327+
parensRange: self.generateAttrParensRange(attribute: node),
328+
mangled: mangledName,
329+
mangledLoc: mangledLoc,
330+
index: index,
331+
indexLoc: indexLoc
332+
)
305333
}
306334

307-
return .createParsed(
308-
self.ctx,
309-
atLoc: self.generateSourceLoc(node.atSign),
310-
nameLoc: self.generateSourceLoc(node.attributeName),
311-
parensRange: self.generateAttrParensRange(attribute: node),
312-
mangled: mangled,
313-
mangledLoc: mangledLoc,
314-
index: index, indexLoc: indexLoc
315-
)
316335
}
317336

318337
func generateAttrParensRange(attribute node: AttributeSyntax) -> BridgedSourceRange {

0 commit comments

Comments
 (0)