@@ -308,7 +308,7 @@ func TypesFromContext(info *types.Info, path []ast.Node, pos token.Pos) []types.
308308 arg := callExpr .Args [0 ]
309309 composite , ok := arg .(* ast.CompositeLit )
310310 if ok {
311- t := typeFromCompositeLit (info , path , composite )
311+ t := typeFromExpr (info , path , composite )
312312 typs = append (typs , t )
313313 break
314314 }
@@ -325,7 +325,7 @@ func TypesFromContext(info *types.Info, path []ast.Node, pos token.Pos) []types.
325325 arg := callExpr .Args [0 ]
326326 composite , ok := arg .(* ast.CompositeLit )
327327 if ok {
328- t := typeFromCompositeLit (info , path , composite )
328+ t := typeFromExpr (info , path , composite )
329329 t = types .NewPointer (t )
330330 typs = append (typs , t )
331331 break
@@ -345,23 +345,23 @@ func TypesFromContext(info *types.Info, path []ast.Node, pos token.Pos) []types.
345345 // a variable
346346 ident , ok := rh .(* ast.Ident )
347347 if ok {
348- if t := typeFromIdent (info , path , ident ); t != nil {
348+ if t := typeFromExpr (info , path , ident ); t != nil {
349349 typs = append (typs , t )
350350 }
351351 break
352352 }
353353
354354 selectorExpr , ok := rh .(* ast.SelectorExpr )
355355 if ok {
356- if t := typeFromIdent (info , path , selectorExpr .Sel ); t != nil {
356+ if t := typeFromExpr (info , path , selectorExpr .Sel ); t != nil {
357357 typs = append (typs , t )
358358 }
359359 break
360360 }
361361 // composite
362362 composite , ok := rh .(* ast.CompositeLit )
363363 if ok {
364- t := typeFromCompositeLit (info , path , composite )
364+ t := typeFromExpr (info , path , composite )
365365 typs = append (typs , t )
366366 break
367367 }
@@ -386,7 +386,7 @@ func TypesFromContext(info *types.Info, path []ast.Node, pos token.Pos) []types.
386386 if ok {
387387 ident , ok := starExpr .X .(* ast.Ident )
388388 if ok {
389- if t := typeFromIdent (info , path , ident ); t != nil {
389+ if t := typeFromExpr (info , path , ident ); t != nil {
390390 if pointer , ok := t .(* types.Pointer ); ok {
391391 t = pointer .Elem ()
392392 }
@@ -487,102 +487,54 @@ func lastSection(identName string) string {
487487 }
488488}
489489
490- func typeFromCompositeLit (info * types.Info , path []ast.Node , composite * ast.CompositeLit ) types.Type {
491- if t := info .TypeOf (composite ); t != nil {
492- if ! containsInvalid (t ) {
493- t = types .Default (t )
494- if named , ok := t .(* types.Named ); ok {
495- if pkg := named .Obj ().Pkg (); pkg != nil {
496- // Find the file in the path that contains this assignment
497- var file * ast.File
498- for _ , n := range path {
499- if f , ok := n .(* ast.File ); ok {
500- file = f
501- break
502- }
503- }
504-
505- if file != nil {
506- // Look for any import spec that imports this package
507- var pkgName string
508- for _ , imp := range file .Imports {
509- if path , _ := strconv .Unquote (imp .Path .Value ); path == pkg .Path () {
510- // Use the alias if specified, otherwise use package name
511- if imp .Name != nil {
512- pkgName = imp .Name .Name
513- } else {
514- pkgName = pkg .Name ()
515- }
516- break
517- }
518- }
519- if pkgName == "" {
520- pkgName = pkg .Name () // fallback to package name if no import found
521- }
490+ func typeFromExpr (info * types.Info , path []ast.Node , expr ast.Expr ) types.Type {
491+ t := info .TypeOf (expr )
492+ if t == nil {
493+ return nil
494+ }
522495
523- // Create new package with the correct name (either alias or original)
524- newPkg := types .NewPackage (pkgName , pkgName )
525- newName := types .NewTypeName (named .Obj ().Pos (), newPkg , named .Obj ().Name (), nil )
526- t = types .NewNamed (newName , named .Underlying (), nil )
496+ if ! containsInvalid (t ) {
497+ t = types .Default (t )
498+ if named , ok := t .(* types.Named ); ok {
499+ if pkg := named .Obj ().Pkg (); pkg != nil {
500+ // find the file in the path that contains this assignment
501+ var file * ast.File
502+ for _ , n := range path {
503+ if f , ok := n .(* ast.File ); ok {
504+ file = f
505+ break
527506 }
528507 }
529- return t
530- }
531- } else {
532- t = anyType
533- }
534- return t
535- }
536- return nil
537- }
538508
539- func typeFromIdent ( info * types. Info , path []ast. Node , ident * ast. Ident ) types. Type {
540- if t := info . TypeOf ( ident ); t != nil {
541- if ! containsInvalid ( t ) {
542- t = types . Default ( t )
543- if named , ok := t .( * types. Named ); ok {
544- if pkg := named . Obj (). Pkg (); pkg != nil {
545- // find the file in the path that contains this assignment
546- var file * ast. File
547- for _ , n := range path {
548- if f , ok := n .( * ast. File ); ok {
549- file = f
509+ if file != nil {
510+ // look for any import spec that imports this package
511+ var pkgName string
512+ for _ , imp := range file . Imports {
513+ if path , _ := strconv . Unquote ( imp . Path . Value ); path == pkg . Path () {
514+ // use the alias if specified, otherwise use package name
515+ if imp . Name != nil {
516+ pkgName = imp . Name . Name
517+ } else {
518+ pkgName = pkg . Name ()
519+ }
550520 break
551521 }
552522 }
553-
554- if file != nil {
555- // look for any import spec that imports this package
556- var pkgName string
557- for _ , imp := range file .Imports {
558- if path , _ := strconv .Unquote (imp .Path .Value ); path == pkg .Path () {
559- // use the alias if specified, otherwise use package name
560- if imp .Name != nil {
561- pkgName = imp .Name .Name
562- } else {
563- pkgName = pkg .Name ()
564- }
565- break
566- }
567- }
568- // fallback to package name if no import found
569- if pkgName == "" {
570- pkgName = pkg .Name ()
571- }
572-
573- // create new package with the correct name (either alias or original)
574- newPkg := types .NewPackage (pkgName , pkgName )
575- newName := types .NewTypeName (named .Obj ().Pos (), newPkg , named .Obj ().Name (), nil )
576- t = types .NewNamed (newName , named .Underlying (), nil )
523+ // fallback to package name if no import found
524+ if pkgName == "" {
525+ pkgName = pkg .Name ()
577526 }
527+
528+ // create new package with the correct name (either alias or original)
529+ newPkg := types .NewPackage (pkgName , pkgName )
530+ newName := types .NewTypeName (named .Obj ().Pos (), newPkg , named .Obj ().Name (), nil )
531+ t = types .NewNamed (newName , named .Underlying (), nil )
578532 }
579- return t
580533 }
581- } else {
582- t = anyType
534+ return t
583535 }
584- return t
536+ } else {
537+ t = anyType
585538 }
586-
587- return nil
539+ return t
588540}
0 commit comments