semLambda removed, semProcAux reworked (#17379)
* simplified proc-like name ident to symbol code * wip - reworking generic param sem * wip - closer to removing nkEmpty generic params * it's hacky but tests pass * slowly tweaking semProcAux to take on semLambda * fix pragma superset check proto vs current * Set the symbol owner earlier * partial progress reworking proto found bug where default values between forward and impl lead to overload resolution issues. * simplified pragma handling and callConv checks Co-authored-by: Clyybber <Clyybber@users.noreply.github.com> * partially working * cgexprs issue * It works! * comment clean-up * clean-up asserts, comments, and other bits * add isGenericParams, inline isGeneric queries * seeing if this is sufficiently consistent * can use this approach or continue it in a further PR * commentary about nullary generics and clean-ups * fixed a mistake in PNode isGenericRoutine * Some small cleanups * Small cleanup * for func lambdas ensure we use lambda pragmas * add some basic compileTime func tests * [ci skip] remove comments Co-authored-by: Clyybber <Clyybber@users.noreply.github.com> Co-authored-by: Clyybber <darkmine956@gmail.com>
This commit is contained in:
parent
144e338abb
commit
72b89eff82
18 changed files with 286 additions and 212 deletions
|
|
@ -1040,6 +1040,7 @@ const
|
|||
declarativeDefs* = {nkProcDef, nkFuncDef, nkMethodDef, nkIteratorDef, nkConverterDef}
|
||||
routineDefs* = declarativeDefs + {nkMacroDef, nkTemplateDef}
|
||||
procDefs* = nkLambdaKinds + declarativeDefs
|
||||
callableDefs* = nkLambdaKinds + routineDefs
|
||||
|
||||
nkSymChoices* = {nkClosedSymChoice, nkOpenSymChoice}
|
||||
nkStrKinds* = {nkStrLit..nkTripleStrLit}
|
||||
|
|
@ -1760,12 +1761,32 @@ proc getStrOrChar*(a: PNode): string =
|
|||
#internalError(a.info, "getStrOrChar")
|
||||
#result = ""
|
||||
|
||||
proc isGenericRoutine*(s: PSym): bool =
|
||||
case s.kind
|
||||
of skProcKinds:
|
||||
result = sfFromGeneric in s.flags or
|
||||
(s.ast != nil and s.ast[genericParamsPos].kind != nkEmpty)
|
||||
else: discard
|
||||
proc isGenericParams*(n: PNode): bool {.inline.} =
|
||||
## used to judge whether a node is generic params.
|
||||
n != nil and n.kind == nkGenericParams
|
||||
|
||||
proc isGenericRoutine*(n: PNode): bool {.inline.} =
|
||||
n != nil and n.kind in callableDefs and n[genericParamsPos].isGenericParams
|
||||
|
||||
proc isGenericRoutineStrict*(s: PSym): bool {.inline.} =
|
||||
## determines if this symbol represents a generic routine
|
||||
## the unusual name is so it doesn't collide and eventually replaces
|
||||
## `isGenericRoutine`
|
||||
s.kind in skProcKinds and s.ast.isGenericRoutine
|
||||
|
||||
proc isGenericRoutine*(s: PSym): bool {.inline.} =
|
||||
## determines if this symbol represents a generic routine or an instance of
|
||||
## one. This should be renamed accordingly and `isGenericRoutineStrict`
|
||||
## should take this name instead.
|
||||
##
|
||||
## Warning/XXX: Unfortunately, it considers a proc kind symbol flagged with
|
||||
## sfFromGeneric as a generic routine. Instead this should likely not be the
|
||||
## case and the concepts should be teased apart:
|
||||
## - generic definition
|
||||
## - generic instance
|
||||
## - either generic definition or instance
|
||||
s.kind in skProcKinds and (sfFromGeneric in s.flags or
|
||||
s.ast.isGenericRoutine)
|
||||
|
||||
proc skipGenericOwner*(s: PSym): PSym =
|
||||
## Generic instantiations are owned by their originating generic
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue