[svn] r6654: nemerle/trunk/ncc: hierarchy/ClassMembers.n parsing/MainParser.n parsing/ParseTree.n

VladD2 svnadmin at nemerle.org
Fri Sep 15 02:29:55 CEST 2006


Log:
Add save GlabalEnv for class members (for fix delayed parsing of method body in Completion Engine).

Author: VladD2
Date: Fri Sep 15 02:29:53 2006
New Revision: 6654

Modified:
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/parsing/MainParser.n
   nemerle/trunk/ncc/parsing/ParseTree.n

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Fri Sep 15 02:29:53 2006
@@ -64,9 +64,11 @@
 
   public mutable required_modifiers : list[System.Type] = [];
   public mutable optional_modifiers : list[System.Type] = [];
+  public Env : GlobalEnv;
   
   protected this (par : TypeBuilder, d : PT.ClassMember)
   {
+    Env = d.Env;
     loc = d.loc;
     modifiers = d.modifiers;
     name = d.Name; 

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Fri Sep 15 02:29:53 2006
@@ -808,8 +808,10 @@
           | x => Error (x, "expecting method body"); FunBody.Abstract ();
         };
 
-      ClassMember.Function (header = h, name = h.name, modifiers = modifiers, 
-                            loc = loc, body = body, kind = FunKind.Method (impl))
+      def member = ClassMember.Function (header = h, name = h.name,  modifiers = modifiers,
+                                         loc = loc, body = body, kind = FunKind.Method (impl));
+      member.Env = env;
+      member
     }
 
     parse_option (modifiers : Modifiers) : ClassMember
@@ -911,7 +913,9 @@
                       def (kind, bd) = parse_accessor_body ([], impl);
                       def name = Splicable.Name (mkname ("get_" + plain_name));
                       def fh = Fun_header (loc, name, ret_type, parms);
-                      getter = Some (ClassMember.Function (fh.name, method_atts, fh, kind, bd));
+                      def member = ClassMember.Function (fh.name, method_atts, fh, kind, bd);
+                      member.Env = env;
+                      getter = Some (member);
 
                     | "set" =>
                       unless (setter.IsNone)
@@ -930,7 +934,9 @@
                       def (kind, bd) = parse_accessor_body (setter_parms, impl);
                       def name = Splicable.Name (mkname ("set_" + plain_name));
                       def fh = Fun_header (loc, typarms, name, PExpr.Void (), setter_parms);
-                      setter = Some (ClassMember.Function (fh.name, method_atts, fh, kind, bd));
+                      def member = ClassMember.Function (fh.name, method_atts, fh, kind, bd);
+                      member.Env = env;
+                      setter = Some (member);
 
                     | _ =>
                       def nm = Splicable.Name (mkname (i));
@@ -1025,6 +1031,7 @@
                     def name = Splicable.Name (mloc, mkname (i + "_" + plain_name));
                     def fh = Fun_header (mloc, name, PExpr.Void (mloc), method_parms);
                     def method = ClassMember.Function (loc, name, method_atts, fh, kind, bd);
+                    method.Env = env;
                     if (i == "remove")
                       remove = method;
                     else
@@ -1071,10 +1078,12 @@
           def fh = Fun_header (loc, name, PExpr.Void (loc), method_parms);
           // funbody is filled during typing
           add = ClassMember.Function (loc, name, method_atts, fh, FunKind.Method ([]), null);
+          add.Env = env;
 
           def name = Splicable.Name (loc, mkname ("remove_" + plain_name));
           def fh = Fun_header (loc, name, PExpr.Void (loc), method_parms);
           remove = ClassMember.Function (loc, name, method_atts, fh, FunKind.Method ([]), null);
+          remove.Env = env;
 
           ClassMember.Event (loc, id, mods, ret_type, field, add, remove)
           

Modified: nemerle/trunk/ncc/parsing/ParseTree.n
==============================================================================
--- nemerle/trunk/ncc/parsing/ParseTree.n	(original)
+++ nemerle/trunk/ncc/parsing/ParseTree.n	Fri Sep 15 02:29:53 2006
@@ -72,7 +72,7 @@
     public this () { base (Splicable.Name (Name ("")), Modifiers.Empty) }
   }
 
-  [Record]
+  [Record (Exclude = [Env])]
   public variant ClassMember : DeclarationBase
   {
     | TypeDeclaration { td : TopDeclaration; }
@@ -97,6 +97,8 @@
       }
     | EnumOption { value : option [PExpr]; }
 
+    internal mutable Env : GlobalEnv;
+    
     /** accessible only for ClassMember.Function, when its FunBody is not typed or compiled */
     public Body : PExpr {
       get {



More information about the svn mailing list