[Compile Time Constant Extraction] add variadic args extraction support (#85320)

This PR adds support for extracting variadic arguments to allow
expressions like

```
@Parameter(supportedContentTypes: Array(arrayLiteral: .pdf, .text, .jpeg))
var file: IntentFile
```

resolves rdar://163291725

---------

Co-authored-by: Deniz Dizman <ddizman@apple.com>
This commit is contained in:
deniz dizman
2025-12-02 10:23:36 -08:00
committed by GitHub
parent 01360d1b03
commit cf782305fa
2 changed files with 70 additions and 0 deletions

View File

@@ -519,6 +519,11 @@ extractCompileTimeValue(Expr *expr, const DeclContext *declContext) {
return extractCompileTimeValue(openExistentialExpr->getExistentialValue(), declContext);
}
case ExprKind::VarargExpansion: {
auto varargExpansionExpr = cast<VarargExpansionExpr>(expr);
return extractCompileTimeValue(varargExpansionExpr->getSubExpr(), declContext);
}
case ExprKind::ForceValue: {
auto forceValueExpr = cast<ForceValueExpr>(expr);
return extractCompileTimeValue(forceValueExpr->getSubExpr(), declContext);

View File

@@ -0,0 +1,65 @@
// RUN: %empty-directory(%t)
// RUN: echo "[MyProto]" > %t/protocols.json
// RUN: %target-swift-frontend -typecheck -emit-const-values-path %t/ExtractVariadicArgs.swiftconstvalues -const-gather-protocols-file %t/protocols.json -primary-file %s
// RUN: cat %t/ExtractVariadicArgs.swiftconstvalues 2>&1 | %FileCheck %s
protocol MyProto {}
public enum SimpleEnum: MyProto {
static func varargs(args: Int...) -> [Int] {
args
}
}
public struct Driver: MyProto {
static let someInts = SimpleEnum.varargs(args: 1, 2, 3, 4, 5)
}
// CHECK: "typeName": "ExtractVariadicArgs.Driver",
// CHECK: "associatedTypeAliases": [],
// CHECK-NEXT: "properties": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "someInts",
// CHECK-NEXT: "type": "Swift.Array<Swift.Int>",
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
// CHECK-NEXT: "isStatic": "true",
// CHECK-NEXT: "isComputed": "false",
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractVariadicArgs.swift",
// CHECK-NEXT: "line": 16,
// CHECK-NEXT: "valueKind": "StaticFunctionCall",
// CHECK-NEXT: "value": {
// CHECK-NEXT: "type": "Swift.Array<Swift.Int>",
// CHECK-NEXT: "memberLabel": "varargs",
// CHECK-NEXT: "arguments": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "args",
// CHECK-NEXT: "type": "Swift.Int...",
// CHECK-NEXT: "valueKind": "Array",
// CHECK-NEXT: "value": [
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "1"
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "2"
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "3"
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "4"
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "5"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]