File tree Expand file tree Collapse file tree
SourceryRuntime/Sources/Common/Composer Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -237,8 +237,15 @@ internal struct ParserResultsComposed {
237237 typealiasesByNames. forEach { _, alias in
238238 var aliasNamesToReplace = [ alias. name]
239239 var finalAlias = alias
240+ var visitedAliasNames = Set < String > ( )
241+ visitedAliasNames. insert ( alias. name)
240242 while let targetAlias = typealiasesByNames [ finalAlias. typeName. name] {
243+ if visitedAliasNames. contains ( targetAlias. name) {
244+ Log . astWarning ( " Detected typealias cycle while resolving ' \( alias. name) ' -> ' \( targetAlias. name) ' (type name: \( finalAlias. typeName. name) ). " )
245+ break
246+ }
241247 aliasNamesToReplace. append ( targetAlias. name)
248+ visitedAliasNames. insert ( targetAlias. name)
242249 finalAlias = targetAlias
243250 }
244251
Original file line number Diff line number Diff line change @@ -1173,6 +1173,21 @@ class ParserComposerSpec: QuickSpec {
11731173 }
11741174 }
11751175
1176+ it ( " does not loop forever when typealiases form a cycle " ) {
1177+ let code = """
1178+ typealias Foo = Bar
1179+ typealias Bar = Foo
1180+ """
1181+
1182+ guard let parserResult = try ? makeParser ( for: code) . parse ( ) else {
1183+ fail ( " Failed to parse typealias cycle fixture " )
1184+ return
1185+ }
1186+
1187+ let composed = ParserResultsComposed ( parserResult: parserResult)
1188+ expect ( composed. resolvedTypealiases. keys) . to ( contain ( " Foo " , " Bar " ) )
1189+ }
1190+
11761191 xit ( " follows through typealias contained in other types " ) {
11771192 let code =
11781193 """
You can’t perform that action at this time.
0 commit comments