@@ -74,19 +74,6 @@ func parameterFromGoTypesType(v *types.Var, variadic bool) (*Parameter, error) {
7474}
7575
7676func typeFromGoTypesType (t types.Type ) (Type , error ) {
77- if t , ok := t .(* types.Named ); ok {
78- tn := t .Obj ()
79- if tn .Pkg () == nil {
80- return PredeclaredType (tn .Name ()), nil
81- }
82- return & NamedType {
83- Package : tn .Pkg ().Path (),
84- Type : tn .Name (),
85- }, nil
86- }
87-
88- // only unnamed or predeclared types after here
89-
9077 // Lots of types have element types. Let's do the parsing and error checking for all of them.
9178 var elemType Type
9279 if t , ok := t .(interface { Elem () types.Type }); ok {
@@ -154,6 +141,39 @@ func typeFromGoTypesType(t types.Type) (Type, error) {
154141 return PredeclaredType ("struct{}" ), nil
155142 }
156143 // TODO: UnsafePointer
144+ case * types.Named , * types.Alias :
145+ object := t .(interface { Obj () * types.TypeName })
146+ name := object .Obj ().Name ()
147+ var pkg string
148+ if object .Obj ().Pkg () != nil {
149+ pkg = object .Obj ().Pkg ().Path ()
150+ }
151+
152+ // TypeArgs method not available for aliases in go1.22
153+ genericType , ok := t .(interface { TypeArgs () * types.TypeList })
154+ if ! ok || genericType .TypeArgs () == nil {
155+ return & NamedType {
156+ Package : pkg ,
157+ Type : name ,
158+ }, nil
159+ }
160+
161+ typeParams := & TypeParametersType {TypeParameters : make ([]Type , genericType .TypeArgs ().Len ())}
162+ for i := range genericType .TypeArgs ().Len () {
163+ typeParam := genericType .TypeArgs ().At (i )
164+ typedParam , err := typeFromGoTypesType (typeParam )
165+ if err != nil {
166+ return nil , fmt .Errorf ("parse type parameter %v: %w" , typeParam .String (), err )
167+ }
168+
169+ typeParams .TypeParameters [i ] = typedParam
170+ }
171+
172+ return & NamedType {
173+ Package : pkg ,
174+ Type : name ,
175+ TypeParams : typeParams ,
176+ }, nil
157177 }
158178
159179 return nil , fmt .Errorf ("can't yet turn %v (%T) into a model.Type" , t .String (), t )
0 commit comments