@@ -86,8 +86,10 @@ public function determineCollectionClassName(string $modelClassName): string
86
86
}
87
87
}
88
88
89
- public function determineCollectionClass (string $ modelClassName ): Type
89
+ public function determineCollectionClass (string $ modelClassName, Type | null $ modelType = null ): Type
90
90
{
91
+ $ modelType ??= new ObjectType ($ modelClassName );
92
+
91
93
$ collectionClassName = $ this ->determineCollectionClassName ($ modelClassName );
92
94
$ collectionReflection = $ this ->reflectionProvider ->getClass ($ collectionClassName );
93
95
@@ -96,12 +98,12 @@ public function determineCollectionClass(string $modelClassName): Type
96
98
97
99
// Specifies key and value
98
100
if ($ typeMap ->count () === 2 ) {
99
- return new GenericObjectType ($ collectionClassName , [new IntegerType (), new ObjectType ( $ modelClassName ) ]);
101
+ return new GenericObjectType ($ collectionClassName , [new IntegerType (), $ modelType ]);
100
102
}
101
103
102
104
// Specifies only value
103
105
if (($ typeMap ->count () === 1 ) && $ typeMap ->hasType ('TModel ' )) {
104
- return new GenericObjectType ($ collectionClassName , [new ObjectType ( $ modelClassName ) ]);
106
+ return new GenericObjectType ($ collectionClassName , [$ modelType ]);
105
107
}
106
108
}
107
109
@@ -124,13 +126,14 @@ public function replaceCollectionsInType(Type $type): Type
124
126
return $ traverse ($ type );
125
127
}
126
128
127
- $ models = $ type ->getTemplateType (EloquentCollection::class, 'TModel ' )->getObjectClassNames ();
128
-
129
- if (count ($ models ) === 0 ) {
130
- return $ type ;
131
- }
129
+ $ templateType = $ type ->getTemplateType (EloquentCollection::class, 'TModel ' );
130
+ $ models = $ templateType ->getObjectClassNames ();
132
131
133
- return TypeCombinator::union (...array_map ([$ this , 'determineCollectionClass ' ], $ models ));
132
+ return match (count ($ models )) {
133
+ 0 => $ type ,
134
+ 1 => $ this ->determineCollectionClass ($ models [0 ], $ templateType ),
135
+ default => TypeCombinator::union (...array_map (fn ($ m ) => $ this ->determineCollectionClass ($ m ), $ models )),
136
+ };
134
137
});
135
138
}
136
139
0 commit comments