diff options
Diffstat (limited to 'compiler/sem.nim')
-rwxr-xr-x | compiler/sem.nim | 51 |
1 files changed, 2 insertions, 49 deletions
diff --git a/compiler/sem.nim b/compiler/sem.nim index 24bee4a22..0f2627998 100755 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -103,55 +103,7 @@ proc semConstExpr(c: PContext, n: PNode): PNode = return n result = evalTypedExpr(c, e) -proc evalPattern(c: PContext, n: PNode, info: TLineInfo): PNode = - InternalAssert n.kind == nkCall and n.sons[0].kind == nkSym - # we need to ensure that the resulting AST is semchecked. However, it's - # aweful to semcheck before macro invocation, so we don't and treat - # templates and macros as immediate in this context. - var rule: string - if optHints in gOptions and hintPattern in gNotes: - rule = renderTree(n, {renderNoComments}) - let s = n.sons[0].sym - case s.kind - of skMacro: - result = semMacroExpr(c, n, n, s) - of skTemplate: - result = semTemplateExpr(c, n, s) - else: - result = semDirectOp(c, n, {}) - if optHints in gOptions and hintPattern in gNotes: - Message(info, hintPattern, rule & " --> '" & - renderTree(result, {renderNoComments}) & "'") - -proc applyPatterns(c: PContext, n: PNode): PNode = - # fast exit: - if c.patterns.len == 0 or optPatterns notin gOptions: return n - result = n - # we apply the last pattern first, so that pattern overriding is possible; - # however the resulting AST would better not trigger the old rule then - # anymore ;-) - for i in countdown(<c.patterns.len, 0): - let pattern = c.patterns[i] - if not isNil(pattern): - let x = applyRule(c, pattern, result) - if not isNil(x): - assert x.kind in {nkStmtList, nkCall} - inc(evalTemplateCounter) - if evalTemplateCounter > 100: - GlobalError(n.info, errTemplateInstantiationTooNested) - # deactivate this pattern: - c.patterns[i] = nil - if x.kind == nkStmtList: - assert x.len == 3 - x.sons[1] = evalPattern(c, x.sons[1], n.info) - result = flattenStmts(x) - else: - result = evalPattern(c, x, n.info) - dec(evalTemplateCounter) - # activate this pattern again: - c.patterns[i] = pattern - -include seminst, semcall +include hlo, seminst, semcall proc semAfterMacroCall(c: PContext, n: PNode, s: PSym): PNode = inc(evalTemplateCounter) @@ -251,6 +203,7 @@ proc SemStmtAndGenerateGenerics(c: PContext, n: PNode): PNode = # a generic has been added to `a`: if result.kind != nkEmpty: addSon(a, result) result = a + result = hloStmt(c, result) result = transformStmt(c.module, result) proc RecoverContext(c: PContext) = |