@@ -20,26 +20,49 @@ class ArrayType implements TypeInterface
20
20
*/
21
21
public const DEFAULT_TYPE_NAME = 'array ' ;
22
22
23
+ protected readonly TypeInterface $ key ;
24
+ protected readonly bool $ isKeyPassed ;
25
+
26
+ protected readonly TypeInterface $ value ;
27
+ protected readonly bool $ isValuePassed ;
28
+
23
29
/**
24
30
* @param non-empty-string $name
25
31
*/
26
32
public function __construct (
27
33
protected readonly string $ name = self ::DEFAULT_TYPE_NAME ,
28
- protected readonly TypeInterface $ key = new ArrayKeyType (),
29
- protected readonly TypeInterface $ value = new MixedType (),
30
- ) {}
34
+ ?TypeInterface $ key = null ,
35
+ ?TypeInterface $ value = null ,
36
+ ) {
37
+ $ this ->key = $ key ?? new ArrayKeyType ();
38
+ $ this ->isKeyPassed = $ key !== null ;
39
+
40
+ $ this ->value = $ value ?? new MixedType ();
41
+ $ this ->isValuePassed = $ value !== null ;
42
+ }
31
43
32
44
#[\Override]
33
45
public function getTypeStatement (LocalContext $ context ): TypeStatement
34
46
{
35
47
$ child = $ context ->withDetailedTypes (false );
36
48
49
+ $ arguments = [];
50
+
51
+ if ($ this ->isKeyPassed ) {
52
+ $ arguments [] = new TemplateArgumentNode (
53
+ value: $ this ->key ->getTypeStatement ($ child ),
54
+ );
55
+ }
56
+
57
+ if ($ this ->isValuePassed ) {
58
+ $ arguments [] = new TemplateArgumentNode (
59
+ value: $ this ->value ->getTypeStatement ($ child ),
60
+ );
61
+ }
62
+
37
63
return new NamedTypeNode (
38
64
name: $ this ->name ,
39
- arguments: new TemplateArgumentsListNode ([
40
- new TemplateArgumentNode ($ this ->key ->getTypeStatement ($ child )),
41
- new TemplateArgumentNode ($ this ->value ->getTypeStatement ($ child )),
42
- ]),
65
+ arguments: new TemplateArgumentsListNode ($ arguments ),
43
66
);
44
67
}
45
68
0 commit comments