diff options
-rw-r--r-- | compiler/semstmts.nim | 4 | ||||
-rw-r--r-- | compiler/suggest.nim | 5 | ||||
-rw-r--r-- | compiler/types.nim | 15 | ||||
-rw-r--r-- | nimsuggest/nimsuggest.nim | 2 |
4 files changed, 20 insertions, 6 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 0196b9d03..336c80c20 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -823,9 +823,11 @@ proc semConst(c: PContext, n: PNode): PNode = addToVarSection(c, result, b) continue + var hasUserSpecifiedType = false var typ: PType = nil if a[^2].kind != nkEmpty: typ = semTypeNode(c, a[^2], nil) + hasUserSpecifiedType = true var typFlags: TTypeAllowedFlags = {} @@ -866,6 +868,8 @@ proc semConst(c: PContext, n: PNode): PNode = else: for j in 0..<a.len-2: var v = semIdentDef(c, a[j], skConst) + when defined(nimsuggest): + v.hasUserSpecifiedType = hasUserSpecifiedType if sfGenSym notin v.flags: addInterfaceDecl(c, v) elif v.owner == nil: v.owner = getCurrOwner(c) styleCheckDef(c, v) diff --git a/compiler/suggest.nim b/compiler/suggest.nim index 1d84fada5..3f9806010 100644 --- a/compiler/suggest.nim +++ b/compiler/suggest.nim @@ -158,7 +158,10 @@ proc symToSuggest*(g: ModuleGraph; s: PSym, isLocal: bool, section: IdeCmd, info result.qualifiedPath.add(s.name.s) if s.typ != nil: - result.forth = typeToString(s.typ) + if section == ideInlayHints: + result.forth = typeToString(s.typ, preferInlayHint) + else: + result.forth = typeToString(s.typ) else: result.forth = "" when defined(nimsuggest) and not defined(noDocgen) and not defined(leanCompiler): diff --git a/compiler/types.nim b/compiler/types.nim index 4bc78cbb8..b9c69d871 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -30,6 +30,7 @@ type preferMixed, # most useful, shows: symbol + resolved symbols if it differs, e.g.: # tuple[a: MyInt{int}, b: float] + preferInlayHint, TTypeRelation* = enum # order is important! isNone, isConvertible, @@ -512,7 +513,7 @@ const "void", "iterable"] const preferToResolveSymbols = {preferName, preferTypeName, preferModuleInfo, - preferGenericArg, preferResolved, preferMixed} + preferGenericArg, preferResolved, preferMixed, preferInlayHint} template bindConcreteTypeToUserTypeClass*(tc, concrete: PType) = tc.add concrete @@ -546,7 +547,10 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = if prefer in preferToResolveSymbols and t.sym != nil and sfAnon notin t.sym.flags and t.kind != tySequence: if t.kind == tyInt and isIntLit(t): - result = t.sym.name.s & " literal(" & $t.n.intVal & ")" + if prefer == preferInlayHint: + result = t.sym.name.s + else: + result = t.sym.name.s & " literal(" & $t.n.intVal & ")" elif t.kind == tyAlias and t[0].kind != tyAlias: result = typeToString(t[0]) elif prefer in {preferResolved, preferMixed}: @@ -562,7 +566,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = result = t.sym.name.s if prefer == preferMixed and result != t.sym.name.s: result = t.sym.name.s & "{" & result & "}" - elif prefer in {preferName, preferTypeName} or t.sym.owner.isNil: + elif prefer in {preferName, preferTypeName, preferInlayHint} or t.sym.owner.isNil: # note: should probably be: {preferName, preferTypeName, preferGenericArg} result = t.sym.name.s if t.kind == tyGenericParam and t.len > 0: @@ -581,8 +585,11 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = if not isIntLit(t) or prefer == preferExported: result = typeToStr[t.kind] else: - if prefer == preferGenericArg: + case prefer: + of preferGenericArg: result = $t.n.intVal + of preferInlayHint: + result = "int" else: result = "int literal(" & $t.n.intVal & ")" of tyGenericInst, tyGenericInvocation: diff --git a/nimsuggest/nimsuggest.nim b/nimsuggest/nimsuggest.nim index 3834acb93..21baf131e 100644 --- a/nimsuggest/nimsuggest.nim +++ b/nimsuggest/nimsuggest.nim @@ -1115,7 +1115,7 @@ proc executeNoHooksV3(cmd: IdeCmd, file: AbsoluteFile, dirtyfile: AbsoluteFile, i += parseInt(tag, endCol, i) let s = graph.findSymDataInRange(file, line, col, endLine, endCol) for q in s: - if q.sym.kind in {skLet, skVar, skForVar} and q.isDecl and not q.sym.hasUserSpecifiedType: + if q.sym.kind in {skLet, skVar, skForVar, skConst} and q.isDecl and not q.sym.hasUserSpecifiedType: graph.suggestInlayHintResult(q.sym, q.info, ideInlayHints) else: myLog fmt "Discarding {cmd}" |