Skip to content

Commit a480404

Browse files
author
Harlan Haskins
committed
[ModuleInterface] Qualify all types in module interfaces
We should not be making assumptions about module lookup when we're compiling a module interface, so instead print the types fully qualified. rdar://48445154
1 parent a22b4f7 commit a480404

22 files changed

+222
-189
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ PrintOptions PrintOptions::printParseableInterfaceFile() {
110110
result.EnumRawValues = EnumRawValueMode::PrintObjCOnly;
111111
result.OpaqueReturnTypePrinting =
112112
OpaqueReturnTypePrintingMode::StableReference;
113+
result.PreferTypeRepr = false;
113114

114115
// We should print __consuming, __owned, etc for the module interface file.
115116
result.SkipUnderscoredKeywords = false;
@@ -1004,7 +1005,18 @@ void PrintAST::printAttributes(const Decl *D) {
10041005
void PrintAST::printTypedPattern(const TypedPattern *TP) {
10051006
printPattern(TP->getSubPattern());
10061007
Printer << ": ";
1007-
printTypeLoc(TP->getTypeLoc());
1008+
1009+
// Make sure to check if the underlying var decl is an implicitly unwrapped
1010+
// optional.
1011+
bool isIUO = false;
1012+
if (auto *named = dyn_cast<NamedPattern>(TP->getSubPattern()))
1013+
if (auto decl = named->getDecl())
1014+
isIUO = decl->getAttrs().hasAttribute<ImplicitlyUnwrappedOptionalAttr>();
1015+
1016+
if (isIUO)
1017+
printTypeLocForImplicitlyUnwrappedOptional(TP->getTypeLoc());
1018+
else
1019+
printTypeLoc(TP->getTypeLoc());
10081020
}
10091021

10101022
/// Determines if we are required to print the name of a property declaration,
@@ -2530,6 +2542,14 @@ void PrintAST::visitVarDecl(VarDecl *decl) {
25302542
tyLoc = TypeLoc::withoutLoc(decl->getInterfaceType());
25312543

25322544
Printer.printDeclResultTypePre(decl, tyLoc);
2545+
2546+
// HACK: When printing result types for vars with opaque result types,
2547+
// always print them using the `some` keyword instead of printing
2548+
// the full stable reference.
2549+
llvm::SaveAndRestore<PrintOptions::OpaqueReturnTypePrintingMode>
2550+
x(Options.OpaqueReturnTypePrinting,
2551+
PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword);
2552+
25332553
if (decl->getAttrs().hasAttribute<ImplicitlyUnwrappedOptionalAttr>())
25342554
printTypeLocForImplicitlyUnwrappedOptional(tyLoc);
25352555
else
@@ -2805,6 +2825,14 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
28052825

28062826
Printer.printDeclResultTypePre(decl, ResultTyLoc);
28072827
Printer.callPrintStructurePre(PrintStructureKind::FunctionReturnType);
2828+
2829+
// HACK: When printing result types for funcs with opaque result types,
2830+
// always print them using the `some` keyword instead of printing
2831+
// the full stable reference.
2832+
llvm::SaveAndRestore<PrintOptions::OpaqueReturnTypePrintingMode>
2833+
x(Options.OpaqueReturnTypePrinting,
2834+
PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword);
2835+
28082836
if (decl->getAttrs().hasAttribute<ImplicitlyUnwrappedOptionalAttr>())
28092837
printTypeLocForImplicitlyUnwrappedOptional(ResultTyLoc);
28102838
else
@@ -2947,6 +2975,14 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) {
29472975
Printer.callPrintStructurePre(PrintStructureKind::FunctionReturnType);
29482976
if (!elementTy.getTypeRepr())
29492977
elementTy = TypeLoc::withoutLoc(decl->getElementInterfaceType());
2978+
2979+
// HACK: When printing result types for subscripts with opaque result types,
2980+
// always print them using the `some` keyword instead of printing
2981+
// the full stable reference.
2982+
llvm::SaveAndRestore<PrintOptions::OpaqueReturnTypePrintingMode>
2983+
x(Options.OpaqueReturnTypePrinting,
2984+
PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword);
2985+
29502986
if (decl->getAttrs().hasAttribute<ImplicitlyUnwrappedOptionalAttr>())
29512987
printTypeLocForImplicitlyUnwrappedOptional(elementTy);
29522988
else

test/ParseableInterface/Inputs/enums-layout-helper.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// CHECK-LABEL: public enum FutureproofEnum : Int
1+
// CHECK-LABEL: public enum FutureproofEnum : Swift.Int
22
public enum FutureproofEnum: Int {
33
// CHECK-NEXT: case a{{$}}
44
case a = 1
@@ -8,7 +8,7 @@ public enum FutureproofEnum: Int {
88
case c = 100
99
}
1010

11-
// CHECK-LABEL: public enum FrozenEnum : Int
11+
// CHECK-LABEL: public enum FrozenEnum : Swift.Int
1212
@_frozen public enum FrozenEnum: Int {
1313
// CHECK-NEXT: case a{{$}}
1414
case a = 1
@@ -18,7 +18,7 @@ public enum FutureproofEnum: Int {
1818
case c = 100
1919
}
2020

21-
// CHECK-LABEL: public enum FutureproofObjCEnum : Int32
21+
// CHECK-LABEL: public enum FutureproofObjCEnum : Swift.Int32
2222
@objc public enum FutureproofObjCEnum: Int32 {
2323
// CHECK-NEXT: case a = 1{{$}}
2424
case a = 1
@@ -28,7 +28,7 @@ public enum FutureproofEnum: Int {
2828
case c = 100
2929
}
3030

31-
// CHECK-LABEL: public enum FrozenObjCEnum : Int32
31+
// CHECK-LABEL: public enum FrozenObjCEnum : Swift.Int32
3232
@_frozen @objc public enum FrozenObjCEnum: Int32 {
3333
// CHECK-NEXT: case a = 1{{$}}
3434
case a = 1
@@ -37,4 +37,3 @@ public enum FutureproofEnum: Int {
3737
// CHECK-NEXT: case c = 100{{$}}
3838
case c = 100
3939
}
40-

test/ParseableInterface/ModuleCache/swiftdoc-next-to-swiftinterface.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %target-swift-frontend -emit-module -emit-parseable-module-interface-path %t/Lib.swiftinterface -emit-module-doc -parse-stdlib -o %t/Lib.swiftmodule %s
3-
// RUN: %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x > %t/from-module.txt
3+
// RUN: %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x -prefer-type-repr=false -fully-qualified-types=true > %t/from-module.txt
44
// RUN: %FileCheck %s < %t/from-module.txt
55

66
// RUN: rm %t/Lib.swiftmodule
7-
// RUN: env SWIFT_FORCE_MODULE_LOADING=prefer-serialized %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x > %t/from-interface.txt
7+
// RUN: env SWIFT_FORCE_MODULE_LOADING=prefer-serialized %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x -prefer-type-repr=false -fully-qualified-types=true > %t/from-interface.txt
88
// RUN: diff %t/from-module.txt %t/from-interface.txt
99

1010
// Try again with architecture-specific subdirectories.
1111
// RUN: %empty-directory(%t)
1212
// RUN: %empty-directory(%t/Lib.swiftmodule)
1313
// RUN: %target-swift-frontend -emit-module -emit-parseable-module-interface-path %t/Lib.swiftmodule/%target-cpu.swiftinterface -emit-module-doc -parse-stdlib -o %t/Lib.swiftmodule/%target-swiftmodule-name -module-name Lib %s
14-
// RUN: %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x > %t/from-module.txt
14+
// RUN: %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x -prefer-type-repr=false -fully-qualified-types=true > %t/from-module.txt
1515
// RUN: %FileCheck %s < %t/from-module.txt
1616

1717
// RUN: rm %t/Lib.swiftmodule/%target-swiftmodule-name
18-
// RUN: env SWIFT_FORCE_MODULE_LOADING=prefer-serialized %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x > %t/from-interface.txt
18+
// RUN: env SWIFT_FORCE_MODULE_LOADING=prefer-serialized %target-swift-ide-test -print-module -module-to-print=Lib -access-filter-public -I %t -source-filename=x -prefer-type-repr=false -fully-qualified-types=true > %t/from-interface.txt
1919
// RUN: diff %t/from-module.txt %t/from-interface.txt
2020

2121
/// Very important documentation!

test/ParseableInterface/access-filter.swift

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-frontend -typecheck -emit-parseable-module-interface-path %t.swiftinterface %s
1+
// RUN: %target-swift-frontend -typecheck -emit-parseable-module-interface-path %t.swiftinterface %s -module-name AccessFilter
22
// RUN: %FileCheck %s < %t.swiftinterface
33
// RUN: %FileCheck -check-prefix NEGATIVE %s < %t.swiftinterface
44

@@ -109,7 +109,7 @@ extension UFIProto {
109109

110110
// CHECK: extension PublicStruct {{[{]$}}
111111
extension PublicStruct {
112-
// CHECK: @_hasInitialValue public static var secretlySettable: Int {
112+
// CHECK: @_hasInitialValue public static var secretlySettable: Swift.Int {
113113
// CHECK-NEXT: get
114114
// CHECK-NEXT: }
115115
public private(set) static var secretlySettable: Int = 0
@@ -120,7 +120,7 @@ extension InternalStruct_BAD: PublicProto {
120120
internal static var dummy: Int { return 0 }
121121
}
122122

123-
// CHECK: extension UFIStruct : PublicProto {{[{]$}}
123+
// CHECK: extension UFIStruct : AccessFilter.PublicProto {{[{]$}}
124124
extension UFIStruct: PublicProto {
125125
// CHECK-NEXT: @usableFromInline
126126
// CHECK-NEXT: internal typealias Assoc = Swift.Int
@@ -135,7 +135,7 @@ extension UFIStruct: PublicProto {
135135
public enum PublicEnum {
136136
// CHECK-NEXT: case x
137137
case x
138-
// CHECK-NEXT: case y(Int)
138+
// CHECK-NEXT: case y(Swift.Int)
139139
case y(Int)
140140
} // CHECK-NEXT: {{^[}]$}}
141141

@@ -148,7 +148,7 @@ enum InternalEnum_BAD {
148148
@usableFromInline enum UFIEnum {
149149
// CHECK-NEXT: case x
150150
case x
151-
// CHECK-NEXT: case y(Int)
151+
// CHECK-NEXT: case y(Swift.Int)
152152
case y(Int)
153153
} // CHECK-NEXT: {{^[}]$}}
154154

@@ -167,13 +167,13 @@ class InternalClass_BAD {
167167
// CHECK: public struct GenericStruct<T>
168168
public struct GenericStruct<T> {}
169169

170-
// CHECK: extension GenericStruct where T == main.PublicStruct {{[{]$}}
171-
extension GenericStruct where T == PublicStruct {
170+
// CHECK: extension GenericStruct where T == AccessFilter.PublicStruct {{[{]$}}
171+
extension GenericStruct where T == AccessFilter.PublicStruct {
172172
// CHECK-NEXT: public func constrainedToPublicStruct(){{$}}
173173
public func constrainedToPublicStruct() {}
174174
} // CHECK-NEXT: {{^[}]$}}
175-
// CHECK: extension GenericStruct where T == main.UFIStruct {{[{]$}}
176-
extension GenericStruct where T == UFIStruct {
175+
// CHECK: extension GenericStruct where T == AccessFilter.UFIStruct {{[{]$}}
176+
extension GenericStruct where T == AccessFilter.UFIStruct {
177177
// CHECK-NEXT: @usableFromInline{{$}}
178178
// CHECK-NEXT: internal func constrainedToUFIStruct(){{$}}
179179
@usableFromInline internal func constrainedToUFIStruct() {}
@@ -182,12 +182,12 @@ extension GenericStruct where T == InternalStruct_BAD {
182182
@usableFromInline internal func constrainedToInternalStruct_BAD() {}
183183
}
184184

185-
// CHECK: extension GenericStruct where T == main.PublicStruct {{[{]$}}
185+
// CHECK: extension GenericStruct where T == AccessFilter.PublicStruct {{[{]$}}
186186
extension GenericStruct where PublicStruct == T {
187187
// CHECK-NEXT: public func constrainedToPublicStruct2(){{$}}
188188
public func constrainedToPublicStruct2() {}
189189
} // CHECK-NEXT: {{^[}]$}}
190-
// CHECK: extension GenericStruct where T == main.UFIStruct {{[{]$}}
190+
// CHECK: extension GenericStruct where T == AccessFilter.UFIStruct {{[{]$}}
191191
extension GenericStruct where UFIStruct == T {
192192
// CHECK-NEXT: @usableFromInline{{$}}
193193
// CHECK-NEXT: internal func constrainedToUFIStruct2(){{$}}
@@ -197,12 +197,12 @@ extension GenericStruct where InternalStruct_BAD == T {
197197
@usableFromInline internal func constrainedToInternalStruct2_BAD() {}
198198
}
199199

200-
// CHECK: extension GenericStruct where T : main.PublicProto {{[{]$}}
200+
// CHECK: extension GenericStruct where T : AccessFilter.PublicProto {{[{]$}}
201201
extension GenericStruct where T: PublicProto {
202202
// CHECK-NEXT: public func constrainedToPublicProto(){{$}}
203203
public func constrainedToPublicProto() {}
204204
} // CHECK-NEXT: {{^[}]$}}
205-
// CHECK: extension GenericStruct where T : main.UFIProto {{[{]$}}
205+
// CHECK: extension GenericStruct where T : AccessFilter.UFIProto {{[{]$}}
206206
extension GenericStruct where T: UFIProto {
207207
// CHECK-NEXT: @usableFromInline{{$}}
208208
// CHECK-NEXT: internal func constrainedToUFIProto(){{$}}
@@ -212,12 +212,12 @@ extension GenericStruct where T: InternalProto_BAD {
212212
@usableFromInline internal func constrainedToInternalProto_BAD() {}
213213
}
214214

215-
// CHECK: extension GenericStruct where T : main.PublicClass {{[{]$}}
215+
// CHECK: extension GenericStruct where T : AccessFilter.PublicClass {{[{]$}}
216216
extension GenericStruct where T: PublicClass {
217217
// CHECK-NEXT: public func constrainedToPublicClass(){{$}}
218218
public func constrainedToPublicClass() {}
219219
} // CHECK-NEXT: {{^[}]$}}
220-
// CHECK: extension GenericStruct where T : main.UFIClass {{[{]$}}
220+
// CHECK: extension GenericStruct where T : AccessFilter.UFIClass {{[{]$}}
221221
extension GenericStruct where T: UFIClass {
222222
// CHECK-NEXT: @usableFromInline{{$}}
223223
// CHECK-NEXT: internal func constrainedToUFIClass(){{$}}
@@ -236,21 +236,21 @@ extension GenericStruct where T: AnyObject {
236236
public struct PublicAliasBase {}
237237
internal struct ReallyInternalAliasBase_BAD {}
238238

239-
// CHECK: public typealias PublicAlias = PublicAliasBase
239+
// CHECK: public typealias PublicAlias = AccessFilter.PublicAliasBase
240240
public typealias PublicAlias = PublicAliasBase
241241
internal typealias InternalAlias_BAD = PublicAliasBase
242242
// CHECK: @usableFromInline
243-
// CHECK-NEXT: internal typealias UFIAlias = PublicAliasBase
243+
// CHECK-NEXT: internal typealias UFIAlias = AccessFilter.PublicAliasBase
244244
@usableFromInline internal typealias UFIAlias = PublicAliasBase
245245

246246
internal typealias ReallyInternalAlias_BAD = ReallyInternalAliasBase_BAD
247247

248-
// CHECK: extension GenericStruct where T == main.PublicAlias {{[{]$}}
248+
// CHECK: extension GenericStruct where T == AccessFilter.PublicAlias {{[{]$}}
249249
extension GenericStruct where T == PublicAlias {
250250
// CHECK-NEXT: public func constrainedToPublicAlias(){{$}}
251251
public func constrainedToPublicAlias() {}
252252
} // CHECK-NEXT: {{^[}]$}}
253-
// CHECK: extension GenericStruct where T == main.UFIAlias {{[{]$}}
253+
// CHECK: extension GenericStruct where T == AccessFilter.UFIAlias {{[{]$}}
254254
extension GenericStruct where T == UFIAlias {
255255
// CHECK-NEXT: @usableFromInline{{$}}
256256
// CHECK-NEXT: internal func constrainedToUFIAlias(){{$}}
@@ -275,7 +275,7 @@ extension GenericStruct: PublicProto where T: InternalProto_BAD {
275275

276276
public struct MultiGenericStruct<First, Second> {}
277277

278-
// CHECK: extension MultiGenericStruct where First == main.PublicStruct, Second == main.PublicStruct {{[{]$}}
278+
// CHECK: extension MultiGenericStruct where First == AccessFilter.PublicStruct, Second == AccessFilter.PublicStruct {{[{]$}}
279279
extension MultiGenericStruct where First == PublicStruct, Second == PublicStruct {
280280
// CHECK-NEXT: public func publicPublic(){{$}}
281281
public func publicPublic() {}

test/ParseableInterface/attrs.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
// RUN: %target-swift-frontend -typecheck -emit-parseable-module-interface-path %t.swiftinterface -enable-library-evolution %s
22
// RUN: %FileCheck %s < %t.swiftinterface
33

4-
// CHECK: @_transparent public func glass() -> Int { return 0 }{{$}}
4+
// CHECK: @_transparent public func glass() -> Swift.Int { return 0 }{{$}}
55
@_transparent public func glass() -> Int { return 0 }
66

77
// CHECK: @_effects(readnone) public func illiterate(){{$}}
88
@_effects(readnone) public func illiterate() {}
99

1010
// CHECK-LABEL: @frozen public struct Point {
1111
@frozen public struct Point {
12-
// CHECK-NEXT: public var x: Int
12+
// CHECK-NEXT: public var x: Swift.Int
1313
public var x: Int
14-
// CHECK-NEXT: public var y: Int
14+
// CHECK-NEXT: public var y: Swift.Int
1515
public var y: Int
1616
} // CHECK-NEXT: {{^}$}}

0 commit comments

Comments
 (0)