@@ -94,7 +94,7 @@ async Task<VerifyResult> VerifyInner(object? root, Func<Task>? cleanup, IEnumera
9494 return ( cleanup , resultTargets ) ;
9595 }
9696
97- async Task < ( List < ResolvedTarget > targets , Func < Task > cleanup , bool applyScrubbers , List < object > converterInfos ) > ResolveTarget ( Target target )
97+ async Task < ( List < ResolvedTarget > targets , Func < Task > cleanup , bool applyScrubbers , List < object > converterInfos ) > ResolveTarget ( Target target , string ? skipConverterForExtension = null )
9898 {
9999 var cleanup = ( ) => Task . CompletedTask ;
100100 var results = new List < ResolvedTarget > ( ) ;
@@ -105,13 +105,23 @@ async Task<VerifyResult> VerifyInner(object? root, Func<Task>? cleanup, IEnumera
105105 {
106106 if ( target . TryGetStream ( out var stream ) )
107107 {
108- if ( target . PerformConversion )
108+ // Skip converter if same extension (prevents infinite recursion)
109+ if ( target . PerformConversion && target . Extension != skipConverterForExtension )
109110 {
110111 var ( streamResults , streamCleanup , infos ) = await ResolveStream ( stream , target . Extension , target . Name ) ;
111112 return ( streamResults , streamCleanup , true , infos ) ;
112113 }
113114
114- results . Add ( new ( target . Extension , stream , target . Name ) ) ;
115+ // Direct conversion without converter
116+ stream . MoveToStart ( ) ;
117+ if ( FileExtensions . IsTextExtension ( target . Extension ) )
118+ {
119+ results . Add ( new ( target . Extension , await stream . ReadStringBuilderWithFixedLines ( ) , target . Name ) ) ;
120+ }
121+ else
122+ {
123+ results . Add ( new ( target . Extension , stream , target . Name ) ) ;
124+ }
115125 }
116126 else if ( target . TryGetStringBuilder ( out var sb ) )
117127 {
@@ -180,13 +190,6 @@ async Task<VerifyResult> VerifyInner(object? root, Func<Task>? cleanup, IEnumera
180190 throw new ( "Use Verify(IEnumerable<T> targets, string extension)" ) ;
181191 }
182192
183- // Handle StringBuilder - apply scrubbers
184- if ( data is StringBuilder sb2 )
185- {
186- results . Add ( new ( "txt" , sb2 , target . Name ) ) ;
187- return ( results , cleanup , true , converterInfos ) ;
188- }
189-
190193 // Handle string - check for JSON appenders first (matches TryGetRootTarget behavior)
191194 if ( data is string str )
192195 {
@@ -286,9 +289,10 @@ async Task<VerifyResult> VerifyInner(object? root, Func<Task>? cleanup, IEnumera
286289 }
287290
288291 // Recursively resolve converted targets (they may contain objects)
292+ // Pass extension to prevent infinite recursion for same-extension targets
289293 foreach ( var convTarget in converted )
290294 {
291- var ( resolved , resolveCleanup , _, nestedInfos ) = await ResolveTarget ( convTarget ) ;
295+ var ( resolved , resolveCleanup , _, nestedInfos ) = await ResolveTarget ( convTarget , extension ) ;
292296 cleanup += resolveCleanup ;
293297 results . AddRange ( resolved ) ;
294298 converterInfos . AddRange ( nestedInfos ) ;
0 commit comments