99use  Riverwaysoft \PhpConverter \Dto \DtoList ;
1010use  Riverwaysoft \PhpConverter \Dto \DtoType ;
1111use  Riverwaysoft \PhpConverter \Dto \ExpressionType ;
12- use  Riverwaysoft \PhpConverter \Dto \PhpType \PhpBaseType ;
13- use  Riverwaysoft \PhpConverter \Dto \PhpType \PhpListType ;
14- use  Riverwaysoft \PhpConverter \Dto \PhpType \PhpTypeInterface ;
12+ use  Riverwaysoft \PhpConverter \Dto \PhpType \PhpOptionalType ;
1513use  Riverwaysoft \PhpConverter \Dto \PhpType \PhpUnionType ;
1614use  Riverwaysoft \PhpConverter \Dto \PhpType \PhpUnknownType ;
1715use  Riverwaysoft \PhpConverter \OutputGenerator \OutputGeneratorInterface ;
18- use  Riverwaysoft \PhpConverter \OutputGenerator \UnknownTypeResolver \UnknownTypeResolverInterface ;
19- use  Riverwaysoft \PhpConverter \OutputGenerator \UnsupportedTypeException ;
16+ use  Riverwaysoft \PhpConverter \OutputWriter \OutputFile ;
2017use  Riverwaysoft \PhpConverter \OutputWriter \OutputProcessor \OutputFilesProcessor ;
2118use  Riverwaysoft \PhpConverter \OutputWriter \OutputWriterInterface ;
22- use  Webmozart \Assert \Assert ;
2319use  Exception ;
2420use  function  sprintf ;
2521
2622class  DartOutputGenerator implements  OutputGeneratorInterface
2723{
2824    private  DartEnumValidator $ dartEnumValidator
2925
30-     /** @param UnknownTypeResolverInterface[] $unknownTypeResolvers */ 
3126    public  function  __construct (
3227        private  OutputWriterInterface $ outputWriter
33-         private  array   $ unknownTypeResolvers  = [] ,
28+         private  DartTypeResolver   $ typeResolver 
3429        private  ?OutputFilesProcessor $ outputFilesProcessornull ,
3530        private  ?DartClassFactoryGenerator $ classFactoryGeneratornull ,
3631        private  ?DartEquitableGenerator $ equitableGeneratornull ,
@@ -39,6 +34,7 @@ public function __construct(
3934        $ this dartEnumValidator  = new  DartEnumValidator ();
4035    }
4136
37+     /** @return OutputFile[] */ 
4238    public  function  generate (ConverterResult $ converterResultarray 
4339    {
4440        $ this outputWriter ->reset ();
@@ -88,7 +84,7 @@ private function convertToDartProperties(DtoType $dto, DtoList $dtoList): string
8884        $ properties$ dtogetProperties ();
8985
9086        foreach  ($ propertiesas  $ property
91-             $ stringsprintf ("\n  final %s %s; " , $ this getDartTypeFromPhp ($ propertygetType (), $ dto$ dtoList$ propertygetName ());
87+             $ stringsprintf ("\n  final %s %s; " , $ this typeResolver -> getDartTypeFromPhp ($ propertygetType (), $ dto$ dtoList$ propertygetName ());
9288        }
9389
9490        return  $ string
@@ -99,83 +95,21 @@ private function generateConstructor(DtoType $dtoType): string
9995        $ string'' ;
10096
10197        foreach  ($ dtoTypegetProperties () as  $ property
98+             $ type$ propertygetType ();
99+             if  ($ typeinstanceof  PhpOptionalType) {
100+                 $ type$ typegetType ();
101+             }
102+ 
102103            $ stringsprintf (
103104                "\n    %sthis.%s, " ,
104-                 $ property -> getType ()  instanceof  PhpUnionType && $ property -> getType () ->isNullable () ? ''  : 'required  ' ,
105+                 $ type instanceof  PhpUnionType && $ type isNullable () ? ''  : 'required  ' ,
105106                $ propertygetName ()
106107            );
107108        }
108109
109110        return  sprintf ("%s({%s \n  }); " , $ dtoTypegetName (), $ string
110111    }
111112
112-     private  function  getDartTypeFromPhp (PhpTypeInterface $ typeDtoType $ dtoDtoList $ dtoListstring 
113-     {
114-         if  ($ typeinstanceof  PhpUnionType) {
115-             Assert::greaterThan ($ typegetTypes (), 2 , "Dart does not support union types " );
116-             if  (!$ typeisNullable ()) {
117-                 return  $ this getDartTypeFromPhp (PhpBaseType::mixed (), $ dto$ dtoList
118-             }
119-             $ notNullType$ typegetFirstNotNullType ();
120-             return  sprintf ('%s? ' , $ this getDartTypeFromPhp ($ notNullType$ dto$ dtoList
121-         }
122- 
123-         if  ($ typeinstanceof  PhpListType) {
124-             return  sprintf ('List<%s> ' , $ this getDartTypeFromPhp ($ typegetType (), $ dto$ dtoList
125-         }
126- 
127-         if  ($ typeinstanceof  PhpBaseType) {
128-             /** @var PhpBaseType $type */ 
129-             return  match  (true ) {
130-                 $ typeequalsTo (PhpBaseType::int ()) => 'int ' ,
131-                 $ typeequalsTo (PhpBaseType::float ()) => 'num ' ,
132-                 $ typeequalsTo (PhpBaseType::string ()) => 'String ' ,
133-                 $ typeequalsTo (PhpBaseType::bool ()) => 'bool ' ,
134-                 $ typeequalsTo (PhpBaseType::mixed ()), $ typeequalsTo (PhpBaseType::iterable ()), $ typeequalsTo (PhpBaseType::array ()) => 'dynamic ' ,
135-                 $ typeequalsTo (PhpBaseType::null ()) => 'null ' ,
136-                 $ typeequalsTo (PhpBaseType::self ()) => $ dtogetName (),
137-                 default  => throw  new  Exception (sprintf ("Unknown base PHP type: %s " , $ typejsonSerialize ()))
138-             };
139-         }
140- 
141-         /** @var PhpUnknownType $type */ 
142-         $ result$ this handleUnknownType ($ type$ dto$ dtoList
143- 
144-         if  ($ resultinstanceof  PhpTypeInterface) {
145-             return  $ this getDartTypeFromPhp ($ result$ dto$ dtoList
146-         }
147- 
148-         return  $ result
149-     }
150- 
151-     private  function  handleUnknownType (PhpUnknownType $ typeDtoType null  $ dtoDtoList $ dtoListstring |PhpTypeInterface 
152-     {
153-         if  ($ typeinstanceof  PhpUnknownType && $ dto$ dtohasGeneric ($ type
154-             return  $ typegetName ();
155-         }
156- 
157-         if  ($ typeinstanceof  PhpUnknownType && $ typehasGenerics () && $ dtoListhasDtoWithType ($ typegetName ())) {
158-             $ result$ typegetName ();
159- 
160-             $ genericsarray_map (fn  (PhpTypeInterface $ innerGeneric$ this getDartTypeFromPhp (
161-                 $ innerGeneric
162-                 $ dto
163-                 $ dtoList
164-             ), $ typegetGenerics ());
165- 
166-             $ resultsprintf ("<%s> " , join (',  ' , $ generics
167-             return  $ result
168-         }
169- 
170-         foreach  ($ this unknownTypeResolvers  as  $ unknownTypeResolver
171-             if  ($ unknownTypeResolversupports ($ type$ dto$ dtoList
172-                 return  $ unknownTypeResolverresolve ($ type$ dto$ dtoList
173-             }
174-         }
175- 
176-         throw  UnsupportedTypeException::forType ($ type$ dto'' );
177-     }
178- 
179113    /** @param DtoEnumProperty[] $properties */ 
180114    private  function  convertEnumToTypeScriptProperties (array  $ propertiesstring 
181115    {
0 commit comments