@@ -1209,18 +1209,19 @@ func formatHover(h *hoverJSON, options *settings.Options, pkgURL func(path Packa
1209
1209
// StdSymbolOf returns the std lib symbol information of the given obj.
1210
1210
// It returns nil if the input obj is not an exported standard library symbol.
1211
1211
func StdSymbolOf (obj types.Object ) * stdlib.Symbol {
1212
- if ! obj .Exported () {
1212
+ if ! obj .Exported () || obj .Pkg () == nil {
1213
+ return nil
1214
+ }
1215
+
1216
+ // Symbols that not defined in standard library should return early.
1217
+ // TODO(hxjiang): The returned slices is binary searchable.
1218
+ symbols := stdlib .PackageSymbols [obj .Pkg ().Path ()]
1219
+ if symbols == nil {
1213
1220
return nil
1214
1221
}
1215
1222
1216
1223
// Handle Function, Type, Const & Var.
1217
1224
if isPackageLevel (obj ) {
1218
- // Symbols defined not in std lib package should return early.
1219
- symbols := stdlib .PackageSymbols [obj .Pkg ().Path ()]
1220
- if symbols == nil {
1221
- return nil
1222
- }
1223
- // TODO(hxjiang): This is binary searchable.
1224
1225
for _ , s := range symbols {
1225
1226
if s .Kind == stdlib .Method || s .Kind == stdlib .Field {
1226
1227
continue
@@ -1236,7 +1237,7 @@ func StdSymbolOf(obj types.Object) *stdlib.Symbol {
1236
1237
if fn , _ := obj .(* types.Func ); fn != nil {
1237
1238
isPtr , named := typesinternal .ReceiverNamed (fn .Type ().(* types.Signature ).Recv ())
1238
1239
if isPackageLevel (named .Obj ()) {
1239
- for _ , s := range stdlib . PackageSymbols [ obj . Pkg (). Path ()] {
1240
+ for _ , s := range symbols {
1240
1241
if s .Kind != stdlib .Method {
1241
1242
continue
1242
1243
}
@@ -1249,7 +1250,30 @@ func StdSymbolOf(obj types.Object) *stdlib.Symbol {
1249
1250
}
1250
1251
}
1251
1252
1252
- // TODO(hxjiang): handle exported fields of package level types.
1253
+ // Handle Field.
1254
+ if v , _ := obj .(* types.Var ); v != nil && v .IsField () {
1255
+ for _ , s := range symbols {
1256
+ if s .Kind != stdlib .Field {
1257
+ continue
1258
+ }
1259
+
1260
+ typeName , fieldName := s .SplitField ()
1261
+ if fieldName != v .Name () {
1262
+ continue
1263
+ }
1264
+
1265
+ typeObj := obj .Pkg ().Scope ().Lookup (typeName )
1266
+ if typeObj == nil {
1267
+ continue
1268
+ }
1269
+
1270
+ if fieldObj , _ , _ := types .LookupFieldOrMethod (typeObj .Type (), true , obj .Pkg (), fieldName ); obj == fieldObj {
1271
+ return & s
1272
+ }
1273
+ }
1274
+ return nil
1275
+ }
1276
+
1253
1277
return nil
1254
1278
}
1255
1279
0 commit comments