@@ -69,4 +69,68 @@ final class InterfaceTypeTests: XCTestCase {
69
69
XCTAssertEqual ( symbol. api. name, " A " )
70
70
}
71
71
}
72
+
73
+ func testFunctionsInPublicExtension( ) throws {
74
+ let source = #"""
75
+ public extension Int {
76
+ func a() {}
77
+ public func b() {}
78
+ internal func c() {}
79
+ fileprivate func d() {}
80
+ private func e() {}
81
+ }
82
+ """#
83
+
84
+ let url = try temporaryFile ( contents: source)
85
+ let sourceFile = try SourceFile ( file: url, relativeTo: url. deletingLastPathComponent ( ) )
86
+ let module = Module ( name: " Module " , sourceFiles: [ sourceFile] )
87
+
88
+ XCTAssertEqual ( sourceFile. symbols. count, 5 )
89
+ XCTAssertTrue ( sourceFile. symbols [ 0 ] . isPublic, " Function `a()` should BE marked as public - its visibility is specified by extension " )
90
+ XCTAssertTrue ( sourceFile. symbols [ 1 ] . isPublic, " Function `b()` should BE marked as public - its visibility is public " )
91
+ XCTAssertFalse ( sourceFile. symbols [ 2 ] . isPublic, " Function `c()` should NOT be marked as public - its visibility is internal " )
92
+ XCTAssertFalse ( sourceFile. symbols [ 3 ] . isPublic, " Function `d()` should NOT be marked as public - its visibility is fileprivate " )
93
+ XCTAssertFalse ( sourceFile. symbols [ 4 ] . isPublic, " Function `e()` should NOT be marked as public - its visibility is private " )
94
+
95
+ XCTAssertEqual ( module. interface. symbols. count, 2 )
96
+ XCTAssertEqual ( module. interface. symbols [ 0 ] . name, " a() " , " Function `a()` should be in documented interface " )
97
+ XCTAssertEqual ( module. interface. symbols [ 1 ] . name, " b() " , " Function `b()` should be in documented interface " )
98
+ }
99
+
100
+ func testNestedPropertiesInPublicExtension( ) throws {
101
+ let source = #"""
102
+ public class RootController {}
103
+
104
+ public extension RootController {
105
+ class ControllerExtension {
106
+ public var public_properties: ExtendedProperties = ExtendedProperties()
107
+ internal var internal_properties: InternalProperties = InternalProperties()
108
+ }
109
+ }
110
+
111
+ public extension RootController.ControllerExtension {
112
+ struct ExtendedProperties {
113
+ public var public_prop: Int = 1
114
+ }
115
+ }
116
+
117
+ internal extension RootController.ControllerExtension {
118
+ struct InternalProperties {
119
+ internal var internal_prop: String = "FOO"
120
+ }
121
+ }
122
+ """#
123
+
124
+
125
+ let url = try temporaryFile ( contents: source)
126
+ let sourceFile = try SourceFile ( file: url, relativeTo: url. deletingLastPathComponent ( ) )
127
+ let module = Module ( name: " Module " , sourceFiles: [ sourceFile] )
128
+
129
+ XCTAssertEqual ( module. interface. symbols. count, 5 )
130
+ XCTAssertEqual ( module. interface. symbols [ 0 ] . name, " RootController " )
131
+ XCTAssertEqual ( module. interface. symbols [ 1 ] . name, " ControllerExtension " )
132
+ XCTAssertEqual ( module. interface. symbols [ 2 ] . name, " public_properties " )
133
+ XCTAssertEqual ( module. interface. symbols [ 3 ] . name, " ExtendedProperties " )
134
+ XCTAssertEqual ( module. interface. symbols [ 4 ] . name, " public_prop " )
135
+ }
72
136
}
0 commit comments