attempt to improve 'suggest' feature

This commit is contained in:
Araq 2011-07-30 15:19:58 +02:00
commit 2d62738bbb
2 changed files with 11 additions and 8 deletions

View file

@ -499,8 +499,8 @@ proc typeSectionFinalPass(c: PContext, n: PNode) =
for i in countup(0, sonsLen(n) - 1): for i in countup(0, sonsLen(n) - 1):
var a = n.sons[i] var a = n.sons[i]
if a.kind == nkCommentStmt: continue if a.kind == nkCommentStmt: continue
if (a.sons[0].kind != nkSym): IllFormedAst(a) if a.sons[0].kind != nkSym: IllFormedAst(a)
var s = a.sons[0].sym var s = a.sons[0].sym
# compute the type's size and check for illegal recursions: # compute the type's size and check for illegal recursions:
if a.sons[1].kind == nkEmpty: if a.sons[1].kind == nkEmpty:
if a.sons[2].kind in {nkSym, nkIdent, nkAccQuoted}: if a.sons[2].kind in {nkSym, nkIdent, nkAccQuoted}:
@ -563,7 +563,7 @@ proc semLambda(c: PContext, n: PNode): PNode =
n.sons[namePos] = newSymNode(s) n.sons[namePos] = newSymNode(s)
pushOwner(s) pushOwner(s)
openScope(c.tab) openScope(c.tab)
if (n.sons[genericParamsPos].kind != nkEmpty): if n.sons[genericParamsPos].kind != nkEmpty:
illFormedAst(n) # process parameters: illFormedAst(n) # process parameters:
if n.sons[paramsPos].kind != nkEmpty: if n.sons[paramsPos].kind != nkEmpty:
semParamList(c, n.sons[ParamsPos], nil, s) semParamList(c, n.sons[ParamsPos], nil, s)
@ -651,7 +651,7 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind,
s = proto s = proto
n.sons[genericParamsPos] = proto.ast.sons[genericParamsPos] n.sons[genericParamsPos] = proto.ast.sons[genericParamsPos]
n.sons[paramsPos] = proto.ast.sons[paramsPos] n.sons[paramsPos] = proto.ast.sons[paramsPos]
if (n.sons[namePos].kind != nkSym): InternalError(n.info, "semProcAux") if n.sons[namePos].kind != nkSym: InternalError(n.info, "semProcAux")
n.sons[namePos].sym = proto n.sons[namePos].sym = proto
proto.ast = n # needed for code generation proto.ast = n # needed for code generation
popOwner() popOwner()

View file

@ -102,8 +102,12 @@ proc suggestOperations(c: PContext, n: PNode, typ: PType) =
assert typ != nil assert typ != nil
wholeSymTab(filterSym(it) and typeFits(c, it, typ), sectionSuggest) wholeSymTab(filterSym(it) and typeFits(c, it, typ), sectionSuggest)
proc suggestEverything(c: PContext, n: PNode) = proc suggestEverything(c: PContext, n: PNode) =
wholeSymTab(filterSym(it), sectionSuggest) # do not produce too many symbols:
for i in countdown(c.tab.tos-1, 1):
for it in items(c.tab.stack[i]):
if filterSym(it):
OutWriteln(SymToStr(it, isLocal = i > ModuleTablePos, sectionSuggest))
proc suggestFieldAccess(c: PContext, n: PNode) = proc suggestFieldAccess(c: PContext, n: PNode) =
# special code that deals with ``myObj.``. `n` is NOT the nkDotExpr-node, but # special code that deals with ``myObj.``. `n` is NOT the nkDotExpr-node, but
@ -144,8 +148,7 @@ proc suggestFieldAccess(c: PContext, n: PNode) =
suggestSymList(typ.n) suggestSymList(typ.n)
suggestOperations(c, n, typ) suggestOperations(c, n, typ)
else: else:
# fallback: suggestOperations(c, n, typ)
suggestEverything(c, n)
proc findClosestDot(n: PNode): PNode = proc findClosestDot(n: PNode): PNode =
if msgs.inCheckpoint(n.info) == cpExact: if msgs.inCheckpoint(n.info) == cpExact: