summary refs log tree commit diff stats
path: root/nim/sem.pas
diff options
context:
space:
mode:
authorAndreas Rumpf <andreasrumpf@noname>2009-09-15 23:22:22 +0200
committerAndreas Rumpf <andreasrumpf@noname>2009-09-15 23:22:22 +0200
commit66a7e3d37c0303997a6b1a3b7ec263dfb8c07748 (patch)
tree40ae1ab8aeb9086b7310ea73ab8a2ed6b597f88b /nim/sem.pas
parent300430fbba28b408f7ac86ca46b03d9d50839399 (diff)
downloadNim-66a7e3d37c0303997a6b1a3b7ec263dfb8c07748.tar.gz
added tools and web dirs
Diffstat (limited to 'nim/sem.pas')
-rwxr-xr-x[-rw-r--r--]nim/sem.pas60
1 files changed, 29 insertions, 31 deletions
diff --git a/nim/sem.pas b/nim/sem.pas
index 1fd141f5a..029ba869f 100644..100755
--- a/nim/sem.pas
+++ b/nim/sem.pas
@@ -15,7 +15,7 @@ interface
 {$include 'config.inc'}
 
 uses
-  sysutils, nsystem, charsets, strutils,
+  sysutils, nsystem, charsets, strutils, nhashes,
   lists, options, scanner, ast, astalgo, trees, treetab, wordrecg,
   ropes, msgs, nos, condsyms, idents, rnimsyn, types, platform,
   nmath, magicsys, pnimsyn, nversion, nimsets,
@@ -29,8 +29,6 @@ function semPass(): TPass;
 
 implementation
 
-function semp(c: PContext; n: PNode): PNode; forward;
-
 function considerAcc(n: PNode): PIdent;
 var
   x: PNode;
@@ -47,6 +45,11 @@ begin
   end
 end;
 
+function isTopLevel(c: PContext): bool;
+begin
+  result := c.tab.tos <= 2
+end;
+
 function newSymS(const kind: TSymKind; n: PNode; c: PContext): PSym;
 begin
   result := newSym(kind, considerAcc(n), getCurrOwner());
@@ -62,27 +65,32 @@ function semIdentWithPragma(c: PContext; kind: TSymKind;
 function semStmtScope(c: PContext; n: PNode): PNode; forward;
 
 type
-  TExprFlag = (efAllowType, efLValue);
+  TExprFlag = (efAllowType, efLValue, efWantIterator);
   TExprFlags = set of TExprFlag;
 
 function semExpr(c: PContext; n: PNode;
                  flags: TExprFlags = {@set}[]): PNode; forward;
 function semExprWithType(c: PContext; n: PNode;
                          flags: TExprFlags = {@set}[]): PNode; forward;
+function fitNode(c: PContext; formal: PType; arg: PNode): PNode; forward;
 function semLambda(c: PContext; n: PNode): PNode; forward;
 function semTypeNode(c: PContext; n: PNode; prev: PType): PType; forward;
 function semStmt(c: PContext; n: PNode): PNode; forward;
+procedure semParamList(c: PContext; n, genericParams: PNode; s: PSym); forward;
+procedure addParams(c: PContext; n: PNode); forward;
+procedure addResult(c: PContext; t: PType; const info: TLineInfo); forward;
+procedure addResultNode(c: PContext; n: PNode); forward;
+
+function instGenericContainer(c: PContext; n: PNode; header: PType): PType; forward;
 
 function semConstExpr(c: PContext; n: PNode): PNode;
-var
-  e: PNode;
 begin
-  e := semExprWithType(c, n);
-  if e = nil then begin
+  result := semExprWithType(c, n);
+  if result = nil then begin
     liMessage(n.info, errConstExprExpected);
-    result := nil; exit
+    exit
   end;
-  result := getConstExpr(c.module, e);
+  result := getConstExpr(c.module, result);
   if result = nil then 
     liMessage(n.info, errConstExprExpected);
 end;
@@ -105,24 +113,19 @@ begin
   end
 end;
 
-function semAfterMacroCall(c: PContext; n, p: PNode): PNode;
+function semAfterMacroCall(c: PContext; n: PNode; s: PSym): PNode;
 begin
   result := n;
-  if (p = nil) or (p.kind <> nkIdent) then
-    liMessage(n.info, errInvalidParamKindX, renderTree(p))
-  else begin
-    case p.ident.id of
-      ord(wExpr): result := semExprWithType(c, result);
-      ord(wStmt): result := semStmt(c, result);
-      ord(wTypeDesc): 
-        result.typ := semTypeNode(c, result, nil);
-      else
-        liMessage(p.info, errInvalidParamKindX, p.ident.s)
-    end
+  case s.typ.sons[0].kind of
+    tyExpr: result := semExprWithType(c, result);
+    tyStmt: result := semStmt(c, result);
+    tyTypeDesc: result.typ := semTypeNode(c, result, nil);
+    else liMessage(s.info, errInvalidParamKindX, typeToString(s.typ.sons[0]))
   end
 end;
 
-function semMacroExpr(c: PContext; n: PNode; sym: PSym): PNode;
+function semMacroExpr(c: PContext; n: PNode; sym: PSym;
+                      semCheck: bool = true): PNode;
 var
   p: PEvalContext;
   s: PStackFrame;
@@ -139,9 +142,8 @@ begin
   result := s.params[0];
   popStackFrame(p);
   if cyclicTree(result) then liMessage(n.info, errCyclicTree);
-  result := semAfterMacroCall(c, result, sym.ast.sons[paramsPos].sons[0]);
-  // now, that was easy ...
-  // and we get more flexibility than in any other programming language
+  if semCheck then
+    result := semAfterMacroCall(c, result, sym);
 end;
 
 {$include 'semtempl.pas'}
@@ -164,13 +166,9 @@ end;
 
 {$include 'semtypes.pas'}
 {$include 'semexprs.pas'}
+{$include 'semgnrc.pas'}
 {$include 'semstmts.pas'}
 
-function semp(c: PContext; n: PNode): PNode;
-begin
-  result := semStmt(c, n);
-end;
-
 procedure addCodeForGenerics(c: PContext; n: PNode);
 var
   i: int;