Skip to content

Commit 511db0c

Browse files
Harlan HaskinsCodaFi
authored andcommitted
[ModuleInterface] Add printing for new attributes
Specially print @_hasMissingDesignatedInitializers and @_inheritsConvenienceInitializers in module interfaces Fixes rdar://51249311
1 parent 283854a commit 511db0c

8 files changed

+176
-12
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,22 @@ void PrintAST::printAttributes(const Decl *D) {
990990
Printer << " ";
991991
}
992992
}
993+
994+
// If the declaration has designated inits that won't be visible to
995+
// clients, or if it inherits superclass convenience initializers,
996+
// then print those attributes specially.
997+
if (auto CD = dyn_cast<ClassDecl>(D)) {
998+
if (Options.PrintImplicitAttrs) {
999+
if (CD->inheritsSuperclassInitializers()) {
1000+
Printer.printAttrName("@_inheritsConvenienceInitializers");
1001+
Printer << " ";
1002+
}
1003+
if (CD->hasMissingDesignatedInitializers()) {
1004+
Printer.printAttrName("@_hasMissingDesignatedInitializers");
1005+
Printer << " ";
1006+
}
1007+
}
1008+
}
9931009
}
9941010

9951011
D->getAttrs().print(Printer, Options, D);

test/IDE/print_ast_tc_decls.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ class d0120_TestClassBase {
452452
}
453453

454454
class d0121_TestClassDerived : d0120_TestClassBase {
455-
// PASS_COMMON-LABEL: {{^}}class d0121_TestClassDerived : d0120_TestClassBase {{{$}}
455+
// PASS_COMMON-LABEL: {{^}}@_inheritsConvenienceInitializers {{()?}}class d0121_TestClassDerived : d0120_TestClassBase {{{$}}
456456

457457
required init() { super.init() }
458458
// PASS_COMMON-NEXT: {{^}} required init(){{$}}
@@ -611,8 +611,8 @@ struct d0200_EscapedIdentifiers {
611611
// PASS_ONE_LINE_TYPEREPR-DAG: {{^}} typealias `protocol` = `class`{{$}}
612612

613613
class `extension` : `class` {}
614-
// PASS_ONE_LINE_TYPE-DAG: {{^}} class `extension` : d0200_EscapedIdentifiers.`class` {{{$}}
615-
// PASS_ONE_LINE_TYPEREPR-DAG: {{^}} class `extension` : `class` {{{$}}
614+
// PASS_ONE_LINE_TYPE-DAG: {{^}} @_inheritsConvenienceInitializers class `extension` : d0200_EscapedIdentifiers.`class` {{{$}}
615+
// PASS_ONE_LINE_TYPEREPR-DAG: {{^}} @_inheritsConvenienceInitializers class `extension` : `class` {{{$}}
616616
// PASS_COMMON: {{^}} @objc deinit{{$}}
617617
// PASS_COMMON-NEXT: {{^}} {{(override )?}}init(){{$}}
618618
// PASS_COMMON-NEXT: {{^}} }{{$}}
@@ -748,7 +748,7 @@ class d0260_ExplodePattern_TestClassBase {
748748
}
749749

750750
class d0261_ExplodePattern_TestClassDerived : d0260_ExplodePattern_TestClassBase {
751-
// PASS_EXPLODE_PATTERN-LABEL: {{^}}class d0261_ExplodePattern_TestClassDerived : d0260_ExplodePattern_TestClassBase {{{$}}
751+
// PASS_EXPLODE_PATTERN-LABEL: {{^}}@_inheritsConvenienceInitializers class d0261_ExplodePattern_TestClassDerived : d0260_ExplodePattern_TestClassBase {{{$}}
752752

753753
override final var baseProp2: Int {
754754
get {
@@ -791,13 +791,13 @@ class ClassWithInheritance2 : FooProtocol, BarProtocol {}
791791
// PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance2 : FooProtocol, BarProtocol {{{$}}
792792

793793
class ClassWithInheritance3 : FooClass {}
794-
// PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance3 : FooClass {{{$}}
794+
// PASS_ONE_LINE-DAG: {{^}}@_inheritsConvenienceInitializers class ClassWithInheritance3 : FooClass {{{$}}
795795

796796
class ClassWithInheritance4 : FooClass, FooProtocol {}
797-
// PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance4 : FooClass, FooProtocol {{{$}}
797+
// PASS_ONE_LINE-DAG: {{^}}@_inheritsConvenienceInitializers class ClassWithInheritance4 : FooClass, FooProtocol {{{$}}
798798

799799
class ClassWithInheritance5 : FooClass, FooProtocol, BarProtocol {}
800-
// PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance5 : FooClass, FooProtocol, BarProtocol {{{$}}
800+
// PASS_ONE_LINE-DAG: {{^}}@_inheritsConvenienceInitializers class ClassWithInheritance5 : FooClass, FooProtocol, BarProtocol {{{$}}
801801

802802
class ClassWithInheritance6 : QuxProtocol, SubFooProtocol {
803803
typealias Qux = Int
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Compile the imported module to a .swiftinterface and ensure the convenience
2+
// init delegates through the subclasses correctly.
3+
4+
// RUN: %empty-directory(%t)
5+
// RUN: %target-build-swift-dylib(%t/%target-library-name(Module)) %S/inherits-superclass-initializers.swift -emit-module-path %t/Module.swiftmodule -emit-module-interface-path %t/Module.swiftinterface -module-name Module -enable-library-evolution
6+
// RUN: rm %t/Module.swiftmodule
7+
// RUN: %target-build-swift %s -I %t -L %t -lModule -o %t/main %target-rpath(%t)
8+
// RUN: %target-codesign %t/main %t/%target-library-name(Module)
9+
// RUN: %target-run %t/main %t/%target-library-name(Module) | %FileCheck %s
10+
11+
// Make sure the same error is emitted when importing a .swiftmodule
12+
13+
// RUN: %empty-directory(%t)
14+
// RUN: %target-build-swift-dylib(%t/%target-library-name(Module)) %S/inherits-superclass-initializers.swift -emit-module-path %t/Module.swiftmodule -module-name Module -enable-library-evolution
15+
// RUN: %target-build-swift %s -I %t -L %t -lModule -o %t/main %target-rpath(%t)
16+
// RUN: %target-codesign %t/main %t/%target-library-name(Module)
17+
// RUN: %target-run %t/main %t/%target-library-name(Module) | %FileCheck %s
18+
19+
import Module
20+
21+
_ = Base()
22+
// CHECK: secret init from Base
23+
24+
_ = Sub()
25+
// CHECK: secret init from Sub
26+
// CHECK: secret init from Base
27+
28+
_ = SubSub()
29+
// CHECK: secret init from SubSub
30+
// CHECK: secret init from Sub
31+
// CHECK: secret init from Base
32+
33+
test()
34+
// CHECK: secret init from Sub
35+
// CHECK: secret init from Base
36+
37+
// CHECK: secret init from SubSub
38+
// CHECK: secret init from Sub
39+
// CHECK: secret init from Base
40+
41+
// CHECK-NOT: public init
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Note: this test has a client: inherits-superclass-initializers-client.swift
2+
3+
// RUN: %empty-directory(%t)
4+
5+
// RUN: %target-swift-frontend -typecheck %s -emit-module-interface-path %t/Module.swiftinterface -module-name Module -enable-library-evolution
6+
// RUN: %FileCheck %s < %t/Module.swiftinterface
7+
8+
// CHECK: @_hasMissingDesignatedInitializers open class Base {
9+
open class Base {
10+
// CHECK-NEXT: public init(arg: Swift.Int)
11+
public init(arg: Int) {
12+
print("public init from Base")
13+
}
14+
// CHECK-NOT: init(secret: Swift.Int)
15+
internal init(secret: Int) {
16+
print("secret init from Base")
17+
}
18+
19+
// CHECK: convenience public init()
20+
public convenience init() {
21+
self.init(secret: 4)
22+
}
23+
24+
// CHECK: }
25+
}
26+
27+
// CHECK: @_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers public class Sub : Module.Base {
28+
public class Sub : Base {
29+
// CHECK: override public init(arg: Swift.Int)
30+
public override init(arg: Int) {
31+
print("public init from Sub")
32+
super.init(arg: arg)
33+
}
34+
// CHECK-NOT: init(secret: Swift.Int)
35+
internal override init(secret: Int) {
36+
print("secret init from Sub")
37+
super.init(secret: secret)
38+
}
39+
// CHECK: }
40+
}
41+
42+
// CHECK: @_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers public class SubSub : Module.Sub {
43+
public class SubSub: Sub {
44+
// CHECK: override public init(arg: Swift.Int)
45+
public override init(arg: Int) {
46+
print("public init from SubSub")
47+
super.init(arg: arg)
48+
}
49+
// CHECK-NOT: init(secret: Swift.Int)
50+
internal override init(secret: Int) {
51+
print("secret init from SubSub")
52+
super.init(secret: secret)
53+
}
54+
// CHECK: }
55+
}
56+
57+
@inlinable public func test() {
58+
_ = Sub()
59+
_ = SubSub()
60+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Compile the imported module to a .swiftinterface and ensure the convenience
2+
// init cannot be called.
3+
4+
// RUN: %empty-directory(%t)
5+
// RUN: %target-swift-frontend -typecheck %S/non-public-designated-inits.swift -emit-module-interface-path %t/Module.swiftinterface -module-name Module -enable-library-evolution
6+
// RUN: %target-swift-frontend -typecheck -verify %s -I %t
7+
8+
// Make sure the same error is emitted when importing a .swiftmodule
9+
10+
// RUN: %empty-directory(%t)
11+
// RUN: %target-swift-frontend -emit-module -o %t/Module.swiftmodule %S/non-public-designated-inits.swift -module-name Module -enable-library-evolution
12+
// RUN: %target-swift-frontend -typecheck -verify %s -I %t
13+
14+
import Module
15+
16+
open class B : A {
17+
var x: Int
18+
19+
public override init(_ x: Int) {
20+
self.x = x
21+
super.init(x)
22+
}
23+
}
24+
25+
print(B(hi: ())) // expected-error {{cannot convert value of type '()' to expected argument type 'Int'}}
26+
// expected-error @-1 {{extraneous argument label 'hi:' in call}}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Note: This test has a client: non-public-designated-inits-client.swift
2+
3+
// RUN: %empty-directory(%t)
4+
5+
// RUN: %target-swift-frontend -typecheck %s -emit-module-interface-path %t/Module.swiftinterface -module-name Module -enable-library-evolution
6+
// RUN: %FileCheck %s < %t/Module.swiftinterface
7+
8+
// CHECK: @_hasMissingDesignatedInitializers open class A {
9+
open class A {
10+
// This is a non-public designated init, which means the convenience
11+
// init should not be inheritable.
12+
init() {}
13+
14+
// CHECK-NEXT: public init(_: Swift.Int)
15+
public init(_: Int) {}
16+
17+
// CHECK-NEXT: convenience public init(hi: ())
18+
public convenience init(hi: ()) { self.init() }
19+
20+
// CHECK: }
21+
}

test/ModuleInterface/nsmanaged-attr.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import CoreData
1717
import Foundation
1818

19-
// CHECK: @objc public class MyObject : CoreData.NSManagedObject {
19+
// CHECK: @objc @_inheritsConvenienceInitializers public class MyObject : CoreData.NSManagedObject {
2020
public class MyObject: NSManagedObject {
2121
// CHECK: @objc @NSManaged dynamic public var myVar: Swift.String {
2222
// CHECK-NEXT: @objc get

test/attr/attr_objc.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,7 +1534,7 @@ class infer_instanceVar2<
15341534
}
15351535

15361536
class infer_instanceVar3 : Class_ObjC1 {
1537-
// CHECK-LABEL: @objc class infer_instanceVar3 : Class_ObjC1 {
1537+
// CHECK-LABEL: @objc @_inheritsConvenienceInitializers class infer_instanceVar3 : Class_ObjC1 {
15381538

15391539
var v1: Int = 0
15401540
// CHECK-LABEL: @objc @_hasInitialValue var v1: Int
@@ -1599,13 +1599,13 @@ protocol infer_throughConformanceProto1 {
15991599
}
16001600

16011601
class infer_class1 : PlainClass {}
1602-
// CHECK-LABEL: {{^}}class infer_class1 : PlainClass {
1602+
// CHECK-LABEL: {{^}}@_inheritsConvenienceInitializers class infer_class1 : PlainClass {
16031603

16041604
class infer_class2 : Class_ObjC1 {}
1605-
// CHECK-LABEL: @objc class infer_class2 : Class_ObjC1 {
1605+
// CHECK-LABEL: @objc @_inheritsConvenienceInitializers class infer_class2 : Class_ObjC1 {
16061606

16071607
class infer_class3 : infer_class2 {}
1608-
// CHECK-LABEL: @objc class infer_class3 : infer_class2 {
1608+
// CHECK-LABEL: @objc @_inheritsConvenienceInitializers class infer_class3 : infer_class2 {
16091609

16101610
class infer_class4 : Protocol_Class1 {}
16111611
// CHECK-LABEL: {{^}}class infer_class4 : Protocol_Class1 {

0 commit comments

Comments
 (0)