diff options
Diffstat (limited to 'rod/sem.nim')
-rwxr-xr-x | rod/sem.nim | 71 |
1 files changed, 24 insertions, 47 deletions
diff --git a/rod/sem.nim b/rod/sem.nim index 1b1072cac..2f9f90335 100755 --- a/rod/sem.nim +++ b/rod/sem.nim @@ -9,8 +9,7 @@ # This module implements the semantic checking pass. -import #var - # point: array [0..3] of int; +import strutils, nhashes, lists, options, scanner, ast, astalgo, trees, treetab, wordrecg, ropes, msgs, os, condsyms, idents, rnimsyn, types, platform, math, magicsys, pnimsyn, nversion, nimsets, semdata, evals, semfold, importer, @@ -20,8 +19,7 @@ proc semPass*(): TPass # implementation proc considerAcc(n: PNode): PIdent = - var x: PNode - x = n + var x = n if x.kind == nkAccQuoted: x = x.sons[0] case x.kind of nkIdent: result = x.ident @@ -62,6 +60,7 @@ proc addParams(c: PContext, n: PNode) proc addResult(c: PContext, t: PType, info: TLineInfo) proc addResultNode(c: PContext, n: PNode) proc instGenericContainer(c: PContext, n: PNode, header: PType): PType + proc semConstExpr(c: PContext, n: PNode): PNode = result = semExprWithType(c, n) if result == nil: @@ -71,8 +70,7 @@ proc semConstExpr(c: PContext, n: PNode): PNode = if result == nil: liMessage(n.info, errConstExprExpected) proc semAndEvalConstExpr(c: PContext, n: PNode): PNode = - var e: PNode - e = semExprWithType(c, n) + var e = semExprWithType(c, n) if e == nil: liMessage(n.info, errConstExprExpected) return nil @@ -91,19 +89,16 @@ proc semAfterMacroCall(c: PContext, n: PNode, s: PSym): PNode = of tyTypeDesc: result.typ = semTypeNode(c, result, nil) else: liMessage(s.info, errInvalidParamKindX, typeToString(s.typ.sons[0])) -include - "semtempl.nim" +include "semtempl.nim" -proc semMacroExpr(c: PContext, n: PNode, sym: PSym, semCheck: bool = true): PNode = - var - p: PEvalContext - s: PStackFrame +proc semMacroExpr(c: PContext, n: PNode, sym: PSym, + semCheck: bool = true): PNode = inc(evalTemplateCounter) if evalTemplateCounter > 100: liMessage(n.info, errTemplateInstantiationTooNested) markUsed(n, sym) - p = newEvalContext(c.module, "", false) - s = newStackFrame() + var p = newEvalContext(c.module, "", false) + var s = newStackFrame() s.call = n setlen(s.params, 2) s.params[0] = newNodeIT(nkNilLit, n.info, sym.typ.sons[0]) @@ -116,11 +111,7 @@ proc semMacroExpr(c: PContext, n: PNode, sym: PSym, semCheck: bool = true): PNod if semCheck: result = semAfterMacroCall(c, result, sym) dec(evalTemplateCounter) -include - "seminst.nim" - -include - "sigmatch.nim" +include "seminst.nim", "sigmatch.nim" proc CheckBool(t: PNode) = if (t.Typ == nil) or @@ -132,37 +123,27 @@ proc typeMismatch(n: PNode, formal, actual: PType) = typeToString(actual) & ") " & `%`(msgKindToString(errButExpectedX), [typeToString(formal)])) -include - "semtypes.nim" - -include - "semexprs.nim" - -include - "semgnrc.nim" - -include - "semstmts.nim" +include "semtypes.nim", "semexprs.nim", "semgnrc.nim", "semstmts.nim" proc addCodeForGenerics(c: PContext, n: PNode) = - var - prc: PSym - it: PNode for i in countup(c.lastGenericIdx, sonsLen(c.generics) - 1): - it = c.generics.sons[i].sons[1] + var it = c.generics.sons[i].sons[1] if it.kind != nkSym: InternalError("addCodeForGenerics") - prc = it.sym + var prc = it.sym if (prc.kind in {skProc, skMethod, skConverter}) and (prc.magic == mNone): if (prc.ast == nil) or (prc.ast.sons[codePos] == nil): InternalError(prc.info, "no code for " & prc.name.s) addSon(n, prc.ast) c.lastGenericIdx = sonsLen(c.generics) +proc semExprNoFlags(c: PContext, n: PNode): PNode = + result = semExpr(c, n, {}) + proc myOpen(module: PSym, filename: string): PPassContext = - var c: PContext - c = newContext(module, filename) + var c = newContext(module, filename) if (c.p != nil): InternalError(module.info, "sem.myOpen") c.semConstExpr = semConstExpr + c.semExpr = semExprNoFlags c.p = newProcCon(module) pushOwner(c.module) openScope(c.tab) # scope for imported symbols @@ -177,20 +158,17 @@ proc myOpen(module: PSym, filename: string): PPassContext = result = c proc myOpenCached(module: PSym, filename: string, rd: PRodReader): PPassContext = - var c: PContext - c = PContext(myOpen(module, filename)) + var c = PContext(myOpen(module, filename)) c.fromCache = true result = c proc myProcess(context: PPassContext, n: PNode): PNode = - var - c: PContext - a: PNode result = nil - c = PContext(context) - result = semStmt(c, n) # BUGFIX: process newly generated generics here, not at the end! + var c = PContext(context) + result = semStmt(c, n) + # BUGFIX: process newly generated generics here, not at the end! if sonsLen(c.generics) > 0: - a = newNodeI(nkStmtList, n.info) + var a = newNodeI(nkStmtList, n.info) addCodeForGenerics(c, a) if sonsLen(a) > 0: # a generic has been added to `a`: @@ -198,8 +176,7 @@ proc myProcess(context: PPassContext, n: PNode): PNode = result = a proc myClose(context: PPassContext, n: PNode): PNode = - var c: PContext - c = PContext(context) + var c = PContext(context) closeScope(c.tab) # close module's scope rawCloseScope(c.tab) # imported symbols; don't check for unused ones! if n == nil: |