compiler/sem*: better lineinfo for templates (#10428)
* compiler/sem*: better lineinfo for templates
Lineinfo for templates is inconsistant across the compiler, for example:
doAssert true
^ ^
a[int](10)
^^ ^
The `^` marks where the compiler thinks the template starts.
For qualified call, we got the same situation with `proc`s before #10427:
system.once
^
Generics lineinfo within template declaration is also incorrect, for
example, this is where the compiler believes the `T` in `[T]` is:
template a[T](b: T)
^
This PR addresses all of these problems.
* nimsuggest: add tests for template highlighting
This commit is contained in:
parent
bad5ad6dc7
commit
35d96d8749
5 changed files with 27 additions and 9 deletions
|
|
@ -24,15 +24,18 @@ const
|
||||||
|
|
||||||
proc semTemplateExpr(c: PContext, n: PNode, s: PSym,
|
proc semTemplateExpr(c: PContext, n: PNode, s: PSym,
|
||||||
flags: TExprFlags = {}): PNode =
|
flags: TExprFlags = {}): PNode =
|
||||||
markUsed(c.config, n.info, s, c.graph.usageSym)
|
let info = getCallLineInfo(n)
|
||||||
onUse(n.info, s)
|
markUsed(c.config, info, s, c.graph.usageSym)
|
||||||
|
onUse(info, s)
|
||||||
|
# Note: This is n.info on purpose. It prevents template from creating an info
|
||||||
|
# context when called from an another template
|
||||||
pushInfoContext(c.config, n.info, s.detailedInfo)
|
pushInfoContext(c.config, n.info, s.detailedInfo)
|
||||||
result = evalTemplate(n, s, getCurrOwner(c), c.config, efFromHlo in flags)
|
result = evalTemplate(n, s, getCurrOwner(c), c.config, efFromHlo in flags)
|
||||||
if efNoSemCheck notin flags: result = semAfterMacroCall(c, n, result, s, flags)
|
if efNoSemCheck notin flags: result = semAfterMacroCall(c, n, result, s, flags)
|
||||||
popInfoContext(c.config)
|
popInfoContext(c.config)
|
||||||
|
|
||||||
# XXX: A more elaborate line info rewrite might be needed
|
# XXX: A more elaborate line info rewrite might be needed
|
||||||
result.info = n.info
|
result.info = info
|
||||||
|
|
||||||
proc semFieldAccess(c: PContext, n: PNode, flags: TExprFlags = {}): PNode
|
proc semFieldAccess(c: PContext, n: PNode, flags: TExprFlags = {}): PNode
|
||||||
|
|
||||||
|
|
@ -1084,8 +1087,9 @@ proc semSym(c: PContext, n: PNode, sym: PSym, flags: TExprFlags): PNode =
|
||||||
if efNoEvaluateGeneric in flags and s.ast[genericParamsPos].len > 0 or
|
if efNoEvaluateGeneric in flags and s.ast[genericParamsPos].len > 0 or
|
||||||
(n.kind notin nkCallKinds and s.requiredParams > 0) or
|
(n.kind notin nkCallKinds and s.requiredParams > 0) or
|
||||||
sfCustomPragma in sym.flags:
|
sfCustomPragma in sym.flags:
|
||||||
markUsed(c.config, n.info, s, c.graph.usageSym)
|
let info = getCallLineInfo(n)
|
||||||
onUse(n.info, s)
|
markUsed(c.config, info, s, c.graph.usageSym)
|
||||||
|
onUse(info, s)
|
||||||
result = symChoice(c, n, s, scClosed)
|
result = symChoice(c, n, s, scClosed)
|
||||||
else:
|
else:
|
||||||
result = semTemplateExpr(c, n, s, flags)
|
result = semTemplateExpr(c, n, s, flags)
|
||||||
|
|
|
||||||
|
|
@ -1015,8 +1015,8 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode,
|
||||||
result = addImplicitGeneric(copyType(paramType, getCurrOwner(c), false))
|
result = addImplicitGeneric(copyType(paramType, getCurrOwner(c), false))
|
||||||
|
|
||||||
of tyGenericParam:
|
of tyGenericParam:
|
||||||
markUsed(c.config, info, paramType.sym, c.graph.usageSym)
|
markUsed(c.config, paramType.sym.info, paramType.sym, c.graph.usageSym)
|
||||||
onUse(info, paramType.sym)
|
onUse(paramType.sym.info, paramType.sym)
|
||||||
if tfWildcard in paramType.flags:
|
if tfWildcard in paramType.flags:
|
||||||
paramType.flags.excl tfWildcard
|
paramType.flags.excl tfWildcard
|
||||||
paramType.sym.kind = skType
|
paramType.sym.kind = skType
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
newSeq[int]()
|
newSeq[int]()
|
||||||
system.newSeq[int]()#[!]#
|
system.newSeq[int]()#[!]#
|
||||||
|
offsetOf[int]()
|
||||||
|
|
||||||
discard """
|
discard """
|
||||||
disabled:true
|
|
||||||
$nimsuggest --tester $file
|
$nimsuggest --tester $file
|
||||||
>highlight $1
|
>highlight $1
|
||||||
highlight;;skType;;1;;7;;3
|
highlight;;skType;;1;;7;;3
|
||||||
|
|
@ -15,4 +15,6 @@ highlight;;skProc;;2;;7;;6
|
||||||
highlight;;skProc;;2;;7;;6
|
highlight;;skProc;;2;;7;;6
|
||||||
highlight;;skType;;2;;14;;3
|
highlight;;skType;;2;;14;;3
|
||||||
highlight;;skProc;;2;;7;;6
|
highlight;;skProc;;2;;7;;6
|
||||||
|
highlight;;skTemplate;;3;;0;;8
|
||||||
|
highlight;;skType;;3;;9;;3
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
system.echo#[!]#
|
system.echo#[!]#
|
||||||
|
system.once
|
||||||
|
|
||||||
discard """
|
discard """
|
||||||
disabled:true
|
|
||||||
$nimsuggest --tester $file
|
$nimsuggest --tester $file
|
||||||
>highlight $1
|
>highlight $1
|
||||||
highlight;;skProc;;1;;7;;4
|
highlight;;skProc;;1;;7;;4
|
||||||
highlight;;skProc;;1;;7;;4
|
highlight;;skProc;;1;;7;;4
|
||||||
|
highlight;;skTemplate;;2;;7;;4
|
||||||
|
highlight;;skTemplate;;2;;7;;4
|
||||||
|
highlight;;skTemplate;;2;;7;;4
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
9
nimsuggest/tests/ttemplate_highlight.nim
Normal file
9
nimsuggest/tests/ttemplate_highlight.nim
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
doAssert true#[!]#
|
||||||
|
|
||||||
|
discard """
|
||||||
|
$nimsuggest --tester $1
|
||||||
|
>highlight $1
|
||||||
|
highlight;;skTemplate;;1;;0;;8
|
||||||
|
highlight;;skTemplate;;1;;0;;8
|
||||||
|
highlight;;skEnumField;;1;;9;;4
|
||||||
|
"""
|
||||||
Loading…
Add table
Add a link
Reference in a new issue