[svn] r6141: nemerle/trunk/ncc: parsing/MainParser.n testsuite/positive/macrolib.n testsuite/positive/macr...

nazgul svnadmin at nemerle.org
Tue Feb 28 22:40:45 CET 2006


Log:
Allow ellipsis for specifing list of members in defined class (#631)

Author: nazgul
Date: Tue Feb 28 22:40:41 2006
New Revision: 6141

Modified:
   nemerle/trunk/ncc/parsing/MainParser.n
   nemerle/trunk/ncc/testsuite/positive/macrolib.n
   nemerle/trunk/ncc/testsuite/positive/macroprog.n
   nemerle/trunk/ncc/typing/Macros.n

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Tue Feb 28 22:40:41 2006
@@ -571,9 +571,18 @@
                 unless (key == "type")
                   match (get_token ()) {
                     | Token.BracesGroup (children) =>
+                      push_stream (children);
+                      match (maybe_parse_ellipsis ()) {
+                        | Some(e) =>
+                          pop_stream ();
+                          members = [ClassMember.Field (e.loc, null, null, e)]; // special encoding for <[ decl: class A { ..$mems } ]>
+                          
+                        | _ =>
+                          pop_stream ();
                       when (key == "variant") in_variant = true;
                       members = process_groups (children, "type member", ParseClassMember);
-                      in_variant = false;
+                          in_variant = false
+                      }
                         
                     | x => Error (x, "expecting type body");
                   }

Modified: nemerle/trunk/ncc/testsuite/positive/macrolib.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/macrolib.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/macrolib.n	Tue Feb 28 22:40:41 2006
@@ -323,3 +323,24 @@
   }
   
 }
+
+macro metaclass(className, body)
+syntax ("metaclass", className, body)
+{
+  def ctx = Nemerle.Macros.ImplicitCTX();
+  mutable code = [];
+  match ((className, body)) {
+    | (<[ $(nm : name) ]>, <[ { .. $props } ]>) =>
+      foreach(<[ $(n : name) : $(t : name) ]> in props) {
+        code ::= <[ decl:
+          [Nemerle.Utility.Accessor]
+          mutable $(n.NewName("_" + n.Id) : name) : $(t : name) ;
+        ]>;
+      }
+     def builder = ctx.Env.Define(<[ decl: [Record] public class $(nm : name) { .. $(code.Reverse()) } ]>);
+     builder.Compile();
+      
+    | _ => Message.FatalError($"Invalid metaclass syntax, expected properties definition, got $body");
+  }
+  <[ () ]>
+}

Modified: nemerle/trunk/ncc/testsuite/positive/macroprog.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/macroprog.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/macroprog.n	Tue Feb 28 22:40:41 2006
@@ -62,6 +62,10 @@
     assert (foo1 (1) == "TADA");
 
     LogTest.Go ();
+    
+    metaclass inline_meta { x : int; y : string };
+    assert (inline_meta (1, "").X == 1);
+    assert (inline_meta (2, "a").Y == "a");
   }
 }
 

Modified: nemerle/trunk/ncc/typing/Macros.n
==============================================================================
--- nemerle/trunk/ncc/typing/Macros.n	(original)
+++ nemerle/trunk/ncc/typing/Macros.n	Tue Feb 28 22:40:41 2006
@@ -366,6 +366,12 @@
     }
   }
   
+  private lift_members (members : list [ClassMember]) : PExpr
+  {
+    | [Field (Ellipsis (e)) as f] when f.name == null && f.modifiers == null => quoted_expr (e)
+    | _ => Lift (members, quoted_member);
+  }
+  
   internal quoted_tydecl (td : TopDeclaration) : PExpr {
     def qn = quoted_sstring (td.name);
     def qattr = quoted_attributes (td.modifiers);
@@ -374,7 +380,7 @@
       | TopDeclaration.Class ( typarms = tprms, t_extends = extend, decls = members) =>
         def qtparms = quoted_tparms (tprms.tyvars, tprms.constraints);
         def qexten = Lift (extend, quoted_expr);        
-        def qmems = Lift (members, quoted_member);
+        def qmems = lift_members (members);
                           
         <[ TopDeclaration.Class (name = $qn, modifiers = $qattr, t_extends = $qexten,
                      typarms = $qtparms, decls = $qmems) ]>
@@ -387,7 +393,7 @@
       | TopDeclaration.Interface (typarms = tprms, t_extends = extend, methods = members) =>
         def qtparms = quoted_tparms (tprms.tyvars, tprms.constraints);
         def qexten = Lift (extend, quoted_expr);        
-        def qmems = Lift (members, quoted_member);
+        def qmems = lift_members (members);
                           
         <[ TopDeclaration.Interface (name = $qn, modifiers = $qattr, t_extends = $qexten,
                      typarms = $qtparms, methods = $qmems) ]>
@@ -395,13 +401,13 @@
       | TopDeclaration.Variant (typarms = tprms, t_extends = extend, decls = members) =>
         def qtparms = quoted_tparms (tprms.tyvars, tprms.constraints);
         def qexten = Lift (extend, quoted_expr);          
-        def qmems = Lift (members, quoted_member);
+        def qmems = lift_members (members);
                           
         <[ TopDeclaration.Variant (name = $qn, modifiers = $qattr, t_extends = $qexten,
                        typarms = $qtparms, decls = $qmems) ]>
 
       | TopDeclaration.VariantOption (decls = members) =>
-        def qmems = Lift (members, quoted_member);
+        def qmems = lift_members (members);
                           
         <[ TopDeclaration.VariantOption (name = $qn, modifiers = $qattr, decls = $qmems) ]>
 



More information about the svn mailing list