метод TypeBuilder.RemoveParsedMember
От: _Claus_  
Дата: 11.02.12 12:07
Оценка: 2 (2)
нужен в данный момент, чтобы изменить поле на свойство. после сгодится для любых трансформаций внутри N-данных на ранних фазах.
возможно в его код надо вписать ограничение на фазу. использование на этапе BeforeInheritance проблем не вызывает, все тесты ок.



From 68d2c7f61b8bcc06b334148768ccecc466bad8c7 Mon Sep 17 00:00:00 2001
From: George Dernovoy <g.dernovoy@gmail.com>
Date: Sat, 11 Feb 2012 03:33:13 +0200
Subject: [PATCH] add TypeBuilder.RemoveParsedMember

---
 ncc/hierarchy/TypeBuilder.n |   11 ++++++++++-
 ncc/parsing/ParseTree.n     |   22 ++++++++++++++++++----
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/ncc/hierarchy/TypeBuilder.n b/ncc/hierarchy/TypeBuilder.n
index c6a1e5a..55ae80e 100644
--- a/ncc/hierarchy/TypeBuilder.n
+++ b/ncc/hierarchy/TypeBuilder.n
@@ -783,7 +783,16 @@ public partial class TypeBuilder : TypeInfo
 
     result.NToList()
   }
-
+  
+  public RemoveParsedMember(member : PT.ClassMember) : void
+  {
+    match(AstParts.Find(x => x.GetMembers().Contains(member)))
+    {
+      | Some(val) => val.Remove(member);
+      | _ => {}
+    }
+  }
+      
   public override GetFields (bindingAttr : BindingFlags) : list[IField]
   {
     def mems = get_members (bindingAttr, fun (x : IMember) {
diff --git a/ncc/parsing/ParseTree.n b/ncc/parsing/ParseTree.n
index e1ab8f9..79e0c87 100644
--- a/ncc/parsing/ParseTree.n
+++ b/ncc/parsing/ParseTree.n
@@ -38,7 +38,7 @@ namespace Nemerle.Compiler.Parsetree
     | Class
       {
         mutable t_extends : list[PExpr];
-                decls     : list[ClassMember];
+        mutable decls     : list[ClassMember];
       }
 
     | Alias { ty : PExpr; }
@@ -46,7 +46,7 @@ namespace Nemerle.Compiler.Parsetree
     | Interface
       {
         mutable t_extends : list [PExpr];
-        methods : list [ClassMember]; // only iface_member
+        mutable methods : list [ClassMember]; // only iface_member
       }
 
     | Variant
@@ -55,7 +55,7 @@ namespace Nemerle.Compiler.Parsetree
         mutable decls : list [ClassMember];
       }
 
-    | VariantOption { decls : list [ClassMember]; }
+    | VariantOption { mutable decls : list [ClassMember]; }
 
     | Macro
       {
@@ -73,7 +73,7 @@ namespace Nemerle.Compiler.Parsetree
     | Enum
       {
         t_extends : list [PExpr];
-        decls : list[ClassMember];
+        mutable decls : list[ClassMember];
       }
 
     [RecordIgnore]
@@ -186,6 +186,20 @@ namespace Nemerle.Compiler.Parsetree
       }
     }
 
+    public Remove(m : ClassMember) : void
+    {
+      match (this)
+      {
+        | x is Class      =>     x.decls = x.decls.Remove(m)
+        | x is Interface  =>     x.methods = x.methods.Remove(m)
+        | x is Variant    =>     x.decls = x.decls.Remove(m)
+        | x is VariantOption =>  x.decls = x.decls.Remove(m)
+        | x is Enum       =>     x.decls = x.decls.Remove(m)
+        | _  => {}
+      }
+    }
+      
+    
     public GetMembers() : list[ClassMember]
     {
       match (this)
-- 
1.7.8.msysgit.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.