Skip to content

Commit cf9cba3

Browse files
[5.7] properly handle isolated and _const type reprs when printing (#58759)
* properly handle `isolated` and `_const` type reprs when printing rdar://92756749 * make switch non-exhaustive
1 parent 14b1bf5 commit cf9cba3

File tree

4 files changed

+137
-7
lines changed

4 files changed

+137
-7
lines changed

include/swift/AST/TypeReprNodes.def

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@
3131
#define ABSTRACT_TYPEREPR(Id, Parent)
3232
#endif
3333

34+
/// SPECIFIER_TYPEREPR(Id, Parent)
35+
///
36+
/// A specific TypeRepr that's a child of SpecifierTypeRepr.
37+
#ifndef SPECIFIER_TYPEREPR
38+
#define SPECIFIER_TYPEREPR TYPEREPR
39+
#endif
40+
3441
#ifndef LAST_TYPEREPR
3542
#define LAST_TYPEREPR(Id)
3643
#endif
@@ -58,15 +65,16 @@ TYPEREPR(NamedOpaqueReturn, TypeRepr)
5865
TYPEREPR(Existential, TypeRepr)
5966
TYPEREPR(Placeholder, TypeRepr)
6067
ABSTRACT_TYPEREPR(Specifier, TypeRepr)
61-
TYPEREPR(InOut, SpecifierTypeRepr)
62-
TYPEREPR(Shared, SpecifierTypeRepr)
63-
TYPEREPR(Owned, SpecifierTypeRepr)
64-
TYPEREPR(Isolated, SpecifierTypeRepr)
65-
TYPEREPR(CompileTimeConst, SpecifierTypeRepr)
68+
SPECIFIER_TYPEREPR(InOut, SpecifierTypeRepr)
69+
SPECIFIER_TYPEREPR(Shared, SpecifierTypeRepr)
70+
SPECIFIER_TYPEREPR(Owned, SpecifierTypeRepr)
71+
SPECIFIER_TYPEREPR(Isolated, SpecifierTypeRepr)
72+
SPECIFIER_TYPEREPR(CompileTimeConst, SpecifierTypeRepr)
6673
TYPEREPR(Fixed, TypeRepr)
6774
TYPEREPR(SILBox, TypeRepr)
6875
LAST_TYPEREPR(SILBox)
6976

77+
#undef SPECIFIER_TYPEREPR
7078
#undef ABSTRACT_TYPEREPR
7179
#undef TYPEREPR
7280
#undef LAST_TYPEREPR

lib/AST/TypeRepr.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,11 @@ void NamedOpaqueReturnTypeRepr::printImpl(ASTPrinter &Printer,
537537
void SpecifierTypeRepr::printImpl(ASTPrinter &Printer,
538538
const PrintOptions &Opts) const {
539539
switch (getKind()) {
540+
#define TYPEREPR(CLASS, PARENT) case TypeReprKind::CLASS:
541+
#define SPECIFIER_TYPEREPR(CLASS, PARENT)
542+
#include "swift/AST/TypeReprNodes.def"
543+
llvm_unreachable("invalid repr kind");
544+
break;
540545
case TypeReprKind::InOut:
541546
Printer.printKeyword("inout", Opts, " ");
542547
break;
@@ -546,8 +551,11 @@ void SpecifierTypeRepr::printImpl(ASTPrinter &Printer,
546551
case TypeReprKind::Owned:
547552
Printer.printKeyword("__owned", Opts, " ");
548553
break;
549-
default:
550-
llvm_unreachable("unknown specifier type repr");
554+
case TypeReprKind::Isolated:
555+
Printer.printKeyword("isolated", Opts, " ");
556+
break;
557+
case TypeReprKind::CompileTimeConst:
558+
Printer.printKeyword("_const", Opts, " ");
551559
break;
552560
}
553561
printTypeRepr(Base, Printer, Opts);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend %s -module-name Isolated -emit-module -emit-module-path %t/Isolated.swiftmodule -disable-availability-checking
3+
// RUN: %target-swift-symbolgraph-extract -module-name Isolated -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/Isolated.symbols.json
5+
6+
// REQUIRES: concurrency
7+
8+
// prior to being added to the printer impl, `isolated` appeared as `inout` in non-assertion builds.
9+
// ensure it renders correctly.
10+
11+
public actor SomeActor {}
12+
13+
public func asdf(param: isolated SomeActor) {}
14+
15+
// CHECK-LABEL: "precise": "s:8Isolated4asdf5paramyAA9SomeActorCYi_tF",
16+
17+
// the `declarationFragments` token is part of the `functionSignature` first, so skip that
18+
// CHECK: "functionSignature"
19+
// CHECK: "declarationFragments"
20+
21+
// CHECK: "declarationFragments": [
22+
// CHECK-NEXT: {
23+
// CHECK-NEXT: "kind": "keyword",
24+
// CHECK-NEXT: "spelling": "func"
25+
// CHECK-NEXT: },
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: "kind": "text",
28+
// CHECK-NEXT: "spelling": " "
29+
// CHECK-NEXT: },
30+
// CHECK-NEXT: {
31+
// CHECK-NEXT: "kind": "identifier",
32+
// CHECK-NEXT: "spelling": "asdf"
33+
// CHECK-NEXT: },
34+
// CHECK-NEXT: {
35+
// CHECK-NEXT: "kind": "text",
36+
// CHECK-NEXT: "spelling": "("
37+
// CHECK-NEXT: },
38+
// CHECK-NEXT: {
39+
// CHECK-NEXT: "kind": "externalParam",
40+
// CHECK-NEXT: "spelling": "param"
41+
// CHECK-NEXT: },
42+
// CHECK-NEXT: {
43+
// CHECK-NEXT: "kind": "text",
44+
// CHECK-NEXT: "spelling": ": "
45+
// CHECK-NEXT: },
46+
// CHECK-NEXT: {
47+
// CHECK-NEXT: "kind": "keyword",
48+
// CHECK-NEXT: "spelling": "isolated"
49+
// CHECK-NEXT: },
50+
// CHECK-NEXT: {
51+
// CHECK-NEXT: "kind": "text",
52+
// CHECK-NEXT: "spelling": " "
53+
// CHECK-NEXT: },
54+
// CHECK-NEXT: {
55+
// CHECK-NEXT: "kind": "typeIdentifier",
56+
// CHECK-NEXT: "spelling": "SomeActor",
57+
// CHECK-NEXT: "preciseIdentifier": "s:8Isolated9SomeActorC"
58+
// CHECK-NEXT: },
59+
// CHECK-NEXT: {
60+
// CHECK-NEXT: "kind": "text",
61+
// CHECK-NEXT: "spelling": ")"
62+
// CHECK-NEXT: }
63+
// CHECK-NEXT: ],
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -module-name TypeRepr -emit-module -emit-module-path %t/
3+
// RUN: %target-swift-symbolgraph-extract -module-name TypeRepr -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/TypeRepr.symbols.json
5+
6+
// prior to being added to the printer impl, `_const` parameters were rendered as `inout` in
7+
// non-assertion builds. ensure it renders correctly.
8+
9+
public func asdf(param: _const String? = nil) {}
10+
11+
// CHECK-LABEL: "precise": "s:8TypeRepr4asdf5paramySSSgYt_tF"
12+
13+
// the `declarationFragments` token is part of the `functionSignature` first, so skip that
14+
// CHECK: "functionSignature"
15+
// CHECK: "declarationFragments"
16+
17+
// CHECK: "declarationFragments": [
18+
// CHECK-NEXT: {
19+
// CHECK-NEXT: "kind": "keyword",
20+
// CHECK-NEXT: "spelling": "func"
21+
// CHECK-NEXT: },
22+
// CHECK-NEXT: {
23+
// CHECK-NEXT: "kind": "text",
24+
// CHECK-NEXT: "spelling": " "
25+
// CHECK-NEXT: },
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: "kind": "identifier",
28+
// CHECK-NEXT: "spelling": "asdf"
29+
// CHECK-NEXT: },
30+
// CHECK-NEXT: {
31+
// CHECK-NEXT: "kind": "text",
32+
// CHECK-NEXT: "spelling": "("
33+
// CHECK-NEXT: },
34+
// CHECK-NEXT: {
35+
// CHECK-NEXT: "kind": "externalParam",
36+
// CHECK-NEXT: "spelling": "param"
37+
// CHECK-NEXT: },
38+
// CHECK-NEXT: {
39+
// CHECK-NEXT: "kind": "text",
40+
// CHECK-NEXT: "spelling": ": "
41+
// CHECK-NEXT: },
42+
// CHECK-NEXT: {
43+
// CHECK-NEXT: "kind": "typeIdentifier",
44+
// CHECK-NEXT: "spelling": "String",
45+
// CHECK-NEXT: "preciseIdentifier": "s:SS"
46+
// CHECK-NEXT: },
47+
// CHECK-NEXT: {
48+
// CHECK-NEXT: "kind": "text",
49+
// CHECK-NEXT: "spelling": "? = nil)"
50+
// CHECK-NEXT: }
51+
// CHECK-NEXT: ],

0 commit comments

Comments
 (0)