@@ -210,18 +210,18 @@ func (tv *tokenVisitor) comment(c *ast.Comment, importByName map[string]*types.P
210
210
}
211
211
}
212
212
213
- tokenTypeByObject := func (obj types.Object ) semtok.TokenType {
213
+ tokenTypeByObject := func (obj types.Object ) ( semtok.TokenType , [] string ) {
214
214
switch obj .(type ) {
215
215
case * types.PkgName :
216
- return semtok .TokNamespace
216
+ return semtok .TokNamespace , nil
217
217
case * types.Func :
218
- return semtok .TokFunction
218
+ return semtok .TokFunction , nil
219
219
case * types.TypeName :
220
- return semtok . TokType
220
+ return underlineType ( obj )
221
221
case * types.Const , * types.Var :
222
- return semtok .TokVariable
222
+ return semtok .TokVariable , nil
223
223
default :
224
- return semtok .TokComment
224
+ return semtok .TokComment , nil
225
225
}
226
226
}
227
227
@@ -244,7 +244,8 @@ func (tv *tokenVisitor) comment(c *ast.Comment, importByName map[string]*types.P
244
244
}
245
245
id , rest , _ := strings .Cut (name , "." )
246
246
name = rest
247
- tv .token (offset , len (id ), tokenTypeByObject (obj ), nil )
247
+ tok , mods := tokenTypeByObject (obj )
248
+ tv .token (offset , len (id ), tok , mods )
248
249
offset += token .Pos (len (id ))
249
250
}
250
251
last = idx [3 ]
@@ -483,6 +484,31 @@ func (tv *tokenVisitor) inspect(n ast.Node) (descend bool) {
483
484
return true
484
485
}
485
486
487
+ func underlineType (obj types.Object ) (semtok.TokenType , []string ) {
488
+ switch obj .Type ().Underlying ().(type ) {
489
+ case * types.Interface :
490
+ return semtok .TokType , []string {"interface" }
491
+ case * types.Struct :
492
+ return semtok .TokType , []string {"struct" }
493
+ case * types.Signature :
494
+ return semtok .TokType , []string {"signature" }
495
+ case * types.Pointer :
496
+ return semtok .TokType , []string {"pointer" }
497
+ case * types.Array :
498
+ return semtok .TokType , []string {"array" }
499
+ case * types.Map :
500
+ return semtok .TokType , []string {"map" }
501
+ case * types.Slice :
502
+ return semtok .TokType , []string {"slice" }
503
+ case * types.Chan :
504
+ return semtok .TokType , []string {"chan" }
505
+ case * types.Basic :
506
+ return semtok .TokType , []string {"defaultLibrary" }
507
+ default :
508
+ return semtok .TokType , nil
509
+ }
510
+ }
511
+
486
512
func (tv * tokenVisitor ) ident (id * ast.Ident ) {
487
513
var obj types.Object
488
514
@@ -535,10 +561,9 @@ func (tv *tokenVisitor) ident(id *ast.Ident) {
535
561
case * types.TypeName : // could be a TypeParam
536
562
if is [* types.TypeParam ](aliases .Unalias (obj .Type ())) {
537
563
emit (semtok .TokTypeParam )
538
- } else if is [* types.Basic ](obj .Type ()) {
539
- emit (semtok .TokType , "defaultLibrary" )
540
564
} else {
541
- emit (semtok .TokType )
565
+ tok , mods := underlineType (obj )
566
+ emit (tok , mods ... )
542
567
}
543
568
case * types.Var :
544
569
if is [* types.Signature ](aliases .Unalias (obj .Type ())) {
@@ -795,11 +820,15 @@ func (tv *tokenVisitor) definitionFor(id *ast.Ident, obj types.Object) (semtok.T
795
820
if fld , ok := fldm .(* ast.Field ); ok {
796
821
// if len(fld.names) == 0 this is a semtok.TokType, being used
797
822
if len (fld .Names ) == 0 {
798
- return semtok .TokType , nil
823
+ tok , mods := underlineType (obj )
824
+ modifiers = append (modifiers , mods ... )
825
+ return tok , modifiers
799
826
}
800
827
return semtok .TokVariable , modifiers
801
828
}
802
- return semtok .TokType , modifiers
829
+ tok , mods := underlineType (obj )
830
+ modifiers = append (modifiers , mods ... )
831
+ return tok , modifiers
803
832
}
804
833
}
805
834
// can't happen
0 commit comments