@@ -247,6 +247,15 @@ extension MockedMethodMacro {
247247 ifTypeIsContainedIn: genericParameters,
248248 typeConstrainedBy: genericWhereClause
249249 )
250+ case var . inlineArrayType( type) :
251+ let ( element, didTypeEraseElement) = self . syntax (
252+ type. element,
253+ ifTypeIsContainedIn: genericParameters,
254+ typeConstrainedBy: genericWhereClause
255+ )
256+
257+ type = type. with ( \. element, element)
258+ result = ( newType: type, didTypeErase: didTypeEraseElement)
250259 case let . tupleType( type) :
251260 result = self . syntax (
252261 type,
@@ -456,9 +465,7 @@ extension MockedMethodMacro {
456465 ) :
457466 let ( newGenericArgumentClause, didTypeErase) = self . syntax (
458467 genericArgumentClause,
459- withElementsInCollectionAt: \. arguments,
460- typeErasedAt: \. argument,
461- ifTypeIsContainedIn: genericParameters,
468+ typeErasedIfElementsIn: genericParameters,
462469 typeConstrainedBy: genericWhereClause
463470 )
464471 let newType = type. with ( \. genericArgumentClause, newGenericArgumentClause)
@@ -470,15 +477,25 @@ extension MockedMethodMacro {
470477 ) :
471478 let ( newGenericArgumentClause, didTypeErase) = self . syntax (
472479 genericArgumentClause,
473- withElementsInCollectionAt: \. arguments,
474- typeErasedAt: \. argument,
475- ifTypeIsContainedIn: genericParameters,
480+ typeErasedIfElementsIn: genericParameters,
476481 typeConstrainedBy: genericWhereClause
477482 ) { index in
478483 index == . zero ? AnyHashable . self : Any . self
479484 }
480485 let newType = type. with ( \. genericArgumentClause, newGenericArgumentClause)
481486
487+ return ( newType, didTypeErase)
488+ case let . identifierType( type) where self . isIdentifierType (
489+ type,
490+ named: " InlineArray "
491+ ) :
492+ let ( newGenericArgumentClause, didTypeErase) = self . inlineArrayGenericArgumentClause (
493+ genericArgumentClause,
494+ typeErasingElementsIn: genericParameters,
495+ typeConstrainedBy: genericWhereClause
496+ )
497+ let newType = type. with ( \. genericArgumentClause, newGenericArgumentClause)
498+
482499 return ( newType, didTypeErase)
483500 case let . memberType( type) where self . isMemberType (
484501 type,
@@ -487,9 +504,7 @@ extension MockedMethodMacro {
487504 ) :
488505 let ( newGenericArgumentClause, didTypeErase) = self . syntax (
489506 genericArgumentClause,
490- withElementsInCollectionAt: \. arguments,
491- typeErasedAt: \. argument,
492- ifTypeIsContainedIn: genericParameters,
507+ typeErasedIfElementsIn: genericParameters,
493508 typeConstrainedBy: genericWhereClause
494509 )
495510 let newType = type. with ( \. genericArgumentClause, newGenericArgumentClause)
@@ -502,22 +517,31 @@ extension MockedMethodMacro {
502517 ) :
503518 let ( newGenericArgumentClause, didTypeErase) = self . syntax (
504519 genericArgumentClause,
505- withElementsInCollectionAt: \. arguments,
506- typeErasedAt: \. argument,
507- ifTypeIsContainedIn: genericParameters,
520+ typeErasedIfElementsIn: genericParameters,
508521 typeConstrainedBy: genericWhereClause
509522 ) { index in
510523 index == . zero ? AnyHashable . self : Any . self
511524 }
512525 let newType = type. with ( \. genericArgumentClause, newGenericArgumentClause)
513526
527+ return ( newType, didTypeErase)
528+ case let . memberType( type) where self . isMemberType (
529+ type,
530+ named: " InlineArray " ,
531+ withBaseTypeNamed: " Swift "
532+ ) :
533+ let ( newGenericArgumentClause, didTypeErase) = self . inlineArrayGenericArgumentClause (
534+ genericArgumentClause,
535+ typeErasingElementsIn: genericParameters,
536+ typeConstrainedBy: genericWhereClause
537+ )
538+ let newType = type. with ( \. genericArgumentClause, newGenericArgumentClause)
539+
514540 return ( newType, didTypeErase)
515541 default :
516542 let ( _, didTypeErase) = self . syntax (
517543 genericArgumentClause,
518- withElementsInCollectionAt: \. arguments,
519- typeErasedAt: \. argument,
520- ifTypeIsContainedIn: genericParameters,
544+ typeErasedIfElementsIn: genericParameters,
521545 typeConstrainedBy: genericWhereClause
522546 )
523547
@@ -531,6 +555,108 @@ extension MockedMethodMacro {
531555 }
532556 }
533557
558+ private static func syntax(
559+ _ argument: GenericArgumentSyntax ,
560+ ifTypeIsContainedIn genericParameters: GenericParameterListSyntax ? ,
561+ typeConstrainedBy genericWhereClause: GenericWhereClauseSyntax ? ,
562+ typeErasedType: ( some Any ) . Type = Any . self
563+ ) -> ( GenericArgumentSyntax , Bool ) {
564+ guard case let . type( type) = argument. argument else {
565+ return ( argument, false )
566+ }
567+
568+ let ( erasedType, didTypeErase) = self . type (
569+ type,
570+ typeErasedIfNecessaryUsing: genericParameters,
571+ typeConstrainedBy: genericWhereClause,
572+ typeErasedType: typeErasedType
573+ )
574+
575+ let newArgument = argument. with (
576+ \. argument,
577+ . type( TypeSyntax ( erasedType) )
578+ )
579+
580+ return ( newArgument, didTypeErase)
581+ }
582+
583+ private static func syntax(
584+ _ clause: GenericArgumentClauseSyntax ,
585+ typeErasedIfElementsIn genericParameters: GenericParameterListSyntax ? ,
586+ typeConstrainedBy genericWhereClause: GenericWhereClauseSyntax ? ,
587+ typeErasedType: ( Int ) -> Any . Type
588+ ) -> ( GenericArgumentClauseSyntax , Bool ) {
589+ var didTypeErase = false
590+ var newArguments : [ GenericArgumentSyntax ] = [ ]
591+
592+ for (index, argument) in clause. arguments. enumerated ( ) {
593+ let ( newArgument, didTypeEraseArgument) = self . syntax (
594+ argument,
595+ ifTypeIsContainedIn: genericParameters,
596+ typeConstrainedBy: genericWhereClause,
597+ typeErasedType: typeErasedType ( index)
598+ )
599+
600+ newArguments. append ( newArgument)
601+ didTypeErase = didTypeErase || didTypeEraseArgument
602+ }
603+
604+ let newClause = clause. with (
605+ \. arguments,
606+ GenericArgumentListSyntax ( newArguments)
607+ )
608+
609+ return ( newClause, didTypeErase)
610+ }
611+
612+ private static func syntax(
613+ _ clause: GenericArgumentClauseSyntax ,
614+ typeErasedIfElementsIn genericParameters: GenericParameterListSyntax ? ,
615+ typeConstrainedBy genericWhereClause: GenericWhereClauseSyntax ?
616+ ) -> ( GenericArgumentClauseSyntax , Bool ) {
617+ self . syntax (
618+ clause,
619+ typeErasedIfElementsIn: genericParameters,
620+ typeConstrainedBy: genericWhereClause
621+ ) { _ in Any . self }
622+ }
623+
624+ private static func inlineArrayGenericArgumentClause(
625+ _ clause: GenericArgumentClauseSyntax ,
626+ typeErasingElementsIn genericParameters: GenericParameterListSyntax ? ,
627+ typeConstrainedBy genericWhereClause: GenericWhereClauseSyntax ?
628+ ) -> ( GenericArgumentClauseSyntax , Bool ) {
629+ guard !clause. arguments. isEmpty else {
630+ return ( clause, false )
631+ }
632+
633+ var didTypeErase = false
634+ var newArguments : [ GenericArgumentSyntax ] = [ ]
635+
636+ for (index, argument) in clause. arguments. enumerated ( ) {
637+ if index == . zero {
638+ newArguments. append ( argument)
639+ continue
640+ }
641+
642+ let ( newArgument, didTypeEraseArgument) = self . syntax (
643+ argument,
644+ ifTypeIsContainedIn: genericParameters,
645+ typeConstrainedBy: genericWhereClause
646+ )
647+
648+ newArguments. append ( newArgument)
649+ didTypeErase = didTypeErase || didTypeEraseArgument
650+ }
651+
652+ let newClause = clause. with (
653+ \. arguments,
654+ GenericArgumentListSyntax ( newArguments)
655+ )
656+
657+ return ( newClause, didTypeErase)
658+ }
659+
534660 /// Returns a Boolean value indicating whether the provided identifier
535661 /// type's name matches any of the provided `names`.
536662 ///
0 commit comments