@@ -57,7 +57,7 @@ struct CodeOwnersTool: AsyncParsableCommand {
5757 renames: renames
5858 )
5959
60- var mappings : [ Substring : Set < String > ] = [ : ]
60+ var mappings : [ Substring : [ String ] ] = [ : ]
6161
6262 try fm. walkFiles ( at: sources) { sourceFile in
6363 if sourceFile. pathExtension != " swift " { return }
@@ -67,7 +67,7 @@ struct CodeOwnersTool: AsyncParsableCommand {
6767
6868 do {
6969 for typeName in try collectTypes ( from: sourceFile) {
70- mappings [ typeName] = ( mappings [ typeName] ?? [ ] ) . union ( owners)
70+ mappings [ typeName] = ( mappings [ typeName] ?? [ ] ) + owners
7171 }
7272
7373 } catch {
@@ -92,7 +92,7 @@ struct CodeOwnersTool: AsyncParsableCommand {
9292 return collector. rootTypes
9393 }
9494
95- private func generateContent( _ mappings: [ Substring : Set < String > ] ) -> String {
95+ private func generateContent( _ mappings: [ Substring : [ String ] ] ) -> String {
9696 if mappings. isEmpty { return " " }
9797
9898 var content = """
@@ -103,7 +103,7 @@ struct CodeOwnersTool: AsyncParsableCommand {
103103
104104 """
105105 for typeName in mappings. keys. sorted ( ) {
106- let owners = mappings [ typeName] !. sorted ( ) . map { " \" \( $0) \" " } . joined ( separator: " , " )
106+ let owners = mappings [ typeName] !. distinct ( ) . map { " \" \( $0) \" " } . joined ( separator: " , " )
107107
108108 content += " \" \( typeName) \" : [ \( owners) ], \n "
109109 }
@@ -121,3 +121,10 @@ private func asRenameRule(regex: String, replace: String) -> RenameRule {
121121 if let rule = RenameRule ( argument: argument) { return rule }
122122 fatalError ( " Rename rule should be in the <regex>=<replacement> format: \( argument) " )
123123}
124+
125+ private extension Sequence where Iterator. Element: Hashable {
126+ func distinct( ) -> [ Iterator . Element ] {
127+ var seen : Set < Iterator . Element > = [ ]
128+ return filter { seen. insert ( $0) . inserted }
129+ }
130+ }
0 commit comments