[svn] r6430: nemerle/trunk/ncc: completion/CodeCompletionEngine.n generation/ImplementsWrapperMaker.n gene...

trupill svnadmin at nemerle.org
Wed Jul 5 18:20:51 CEST 2006


Log:
Create MarkAsUsed and MarkAsAssigned method in ManagerClass to allow 
tracking of references to classes and members. This will allow 
refeactoring support for Nemerle.


Author: trupill
Date: Wed Jul  5 18:20:45 2006
New Revision: 6430

Modified:
   nemerle/trunk/ncc/completion/CodeCompletionEngine.n
   nemerle/trunk/ncc/generation/ImplementsWrapperMaker.n
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/hierarchy/NamespaceTree.n
   nemerle/trunk/ncc/hierarchy/TypeBuilder.n
   nemerle/trunk/ncc/passes.n
   nemerle/trunk/ncc/typing/ConstantFolder.n
   nemerle/trunk/ncc/typing/StaticTyVar.n
   nemerle/trunk/ncc/typing/TyVarEnv.n
   nemerle/trunk/ncc/typing/Typer-PatternTyper.n
   nemerle/trunk/ncc/typing/Typer2.n

Modified: nemerle/trunk/ncc/completion/CodeCompletionEngine.n
==============================================================================
--- nemerle/trunk/ncc/completion/CodeCompletionEngine.n	(original)
+++ nemerle/trunk/ncc/completion/CodeCompletionEngine.n	Wed Jul  5 18:20:45 2006
@@ -297,6 +297,7 @@
           state = EngineState.LoadedLibs; // next time Init is called, we won't rebuild external types
           // Sources.set_unparsed_state ();
           listMessages = [];
+          referencesLocation = Hashtable ();
         }
         
         public LesserInit () : void
@@ -313,6 +314,39 @@
             this.CoreEnv = GlobalEnv.CreateCore(this.NameTree);
         }
         
+        mutable referencesLocation : Hashtable[IMember, list[Location]];
+        
+        public ReferencesToMembers : Hashtable[IMember, list[Location]]
+        {
+            get { referencesLocation }
+        }
+        
+        public override MarkAsUsed (member : IMember, location : Location) : void
+        {
+            member.HasBeenUsed = true;
+            add_to_ref (member, get_real_location (location, member.Name));
+        }
+    
+        public override MarkAsAssigned (member : IField, location : Location) : void
+        {
+            member.HasBeenAssigned = true;
+            add_to_ref (member, get_real_location (location, member.Name));
+        }
+        
+        static get_real_location (location : Location, name : string) : Location
+        {
+            Location (location.FileIndex, location.Line, location.Column - name.Length,
+                location.EndLine, location.EndColumn)
+        }
+        
+        add_to_ref (member : IMember, location : Location) : void
+        {
+            unless (referencesLocation.ContainsKey (member))
+                referencesLocation.Add (member, []);
+            
+            referencesLocation [member] ::= location;
+        }
+        
         // If you want to recover the messages done by the parser/typer
         public Output : System.IO.TextWriter
         {
@@ -331,33 +365,14 @@
             }
         }
         
-        public RunCompletionEngine (member : IMember, contents : string) : CompletionResult
-        {
-            // Tell the methods we are in completion mode
-            is_completion = true;
-            def observed_method = member :> MethodBuilder;
-            
-            mutable completionList  = null;
-            when (observed_method != null) {
-                def env = observed_method.DeclaringType.GlobalEnv;
-                def my_body = contents.Trim();
-
-                def lexer = LexerCompletion (this, my_body + " ", my_body.Length);
-                observed_method.GetHeader ().body =
-                    FunBody.Parsed (MainParser.ParseExpr (env, lexer, true));
-            
-                try
-                {
-                    observed_method.RunBodyTyper ();
-                }
-                catch
+        [Obsolete ("Please use the overload which takes a position.")]
+        public RunCompletionEngine (
+          [NotNull] member : MethodBuilder,
+          [NotNull] contents : string)
+          : CompletionResult
                 {
-                | e is CompletionResult => completionList = e;
-                | e => System.Console.WriteLine (e.Message);
-                }
-            }
-            
-            completionList
+            def my_body = contents.Trim ();
+            RunCompletionEngine (member, my_body, my_body.Length)
         }
 
         public RunCompletionEngine (

Modified: nemerle/trunk/ncc/generation/ImplementsWrapperMaker.n
==============================================================================
--- nemerle/trunk/ncc/generation/ImplementsWrapperMaker.n	(original)
+++ nemerle/trunk/ncc/generation/ImplementsWrapperMaker.n	Wed Jul  5 18:20:45 2006
@@ -118,7 +118,7 @@
       }
 
       meth.disable_type_attr = true;
-      meth.HasBeenUsed = true;
+      ManagerClass.Instance.MarkAsUsed (meth);
 
       def current_fun = meth.GetHeader ();
       def refs =

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Wed Jul  5 18:20:45 2006
@@ -785,8 +785,8 @@
           def fld = clo_type.DefineAndReturn (<[ decl: 
             mutable $(Macros.NewSymbol ("finally_needed") : name) : bool;
           ]>) :> IField;
-          fld.HasBeenAssigned = true;
-          fld.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsAssigned (fld);
+          ManagerClass.Instance.MarkAsUsed (fld);
           def fldref = TExpr.FieldMember (InternalType.Boolean, thisref, fld);
           def for_dispose =
             TExpr.If (InternalType.Void, fldref, handler, Typer.VoidLiteral ());
@@ -955,7 +955,7 @@
           ]>;
           def fld = clo_type.DefineAndReturn (ptdecl);
           decl.ClosureField = fld :> IField;
-          decl.ClosureField.HasBeenAssigned = true;
+          ManagerClass.Instance.MarkAsAssigned (decl.ClosureField);
           when (is_enumerable && decl.ValKind is FunParm (_))
             parm_field_names ::= name.Id;
         }
@@ -964,7 +964,7 @@
         def ctor_call = TExpr.Call (clo_mtype, ctor_ref, [], false);
                       
         clo_type.MarkWithSpecialName ();
-        clo_type.HasBeenUsed = true;
+        ManagerClass.Instance.MarkAsUsed (clo_type);
 
         when (uses_yield)
           SetEnumeratorBody (clo_type, subst, parm_field_names);

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Wed Jul  5 18:20:45 2006
@@ -916,7 +916,7 @@
 
     // don't warn about the unused `Main' methods...
     when (IsStatic && name == "Main")
-      HasBeenUsed = true
+      ManagerClass.Instance.MarkAsUsed (this)
   }
 
   public GetHeader () : Fun_header
@@ -1119,7 +1119,7 @@
 
     adder = make_method (f.add);
     remover = make_method (f.remove);
-    remover.HasBeenUsed = true;
+    ManagerClass.Instance.MarkAsUsed (remover);
 
     ty.CheckAccessibility (this, accessibility);
   }

Modified: nemerle/trunk/ncc/hierarchy/NamespaceTree.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/NamespaceTree.n	(original)
+++ nemerle/trunk/ncc/hierarchy/NamespaceTree.n	Wed Jul  5 18:20:45 2006
@@ -629,7 +629,7 @@
         
         // a little hack to override unassigned field warning
         foreach (f in macro_context_class.GetFields ())
-          f.HasBeenAssigned = true;
+          ManagerClass.Instance.MarkAsAssigned (f);
         
         macro_context_class.CannotFinalize = true;
       }

Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n	Wed Jul  5 18:20:45 2006
@@ -357,7 +357,7 @@
     set {
       m_has_been_used = m_has_been_used || value;
       when (enclosing_type != null)
-        enclosing_type.HasBeenUsed = value
+        ManagerClass.Instance.MarkAsUsed (enclosing_type)
     }
   }
 
@@ -1762,7 +1762,7 @@
     def f = bind_and_add_member (<[ decl:
       ..$atrs value__ : $(underlying_enum_type : typed);
     ]>) :> IField;
-    f.HasBeenAssigned = true;
+    ManagerClass.Instance.MarkAsAssigned (f);
     _ = List.FoldLeft (decls, Literal.Integer (1, true, underlying_enum_type), add_field);
   }
   
@@ -2095,7 +2095,7 @@
                                          "' with proper signature")
                   | [m] =>                
                     iface_methods.Set (member, notcorrect);
-                    meth.HasBeenUsed = true;
+                    ManagerClass.Instance.MarkAsUsed (meth);
                     m
                   | _ =>
                     Message.FatalError ("interface `" + ty.FullName + 
@@ -2122,7 +2122,7 @@
            unless (meth.Attributes %&& NemerleAttributes.Virtual)
              meth.Attributes |= NemerleAttributes.Sealed %| NemerleAttributes.Virtual;
               
-          foreach (mem in impl') mem.HasBeenUsed = true;
+          foreach (mem in impl') ManagerClass.Instance.MarkAsUsed (mem);
 
           meth.SetFunKind (FunKind.BoundMethod (impl'))
          
@@ -2155,7 +2155,7 @@
                   } else [];
                 already_bound [meth.Name] = lst + already;
                 unless (lst.IsEmpty)
-                  meth.HasBeenUsed = true;
+                  ManagerClass.Instance.MarkAsUsed (meth);
                 lst
             }
           | None => []
@@ -2169,7 +2169,7 @@
               def new_impls = impl' + impl;
 
               foreach (impl in new_impls)
-                impl.HasBeenUsed = true;
+                ManagerClass.Instance.MarkAsUsed (impl);
 
               meth.SetFunKind (FunKind.BoundMethod (new_impls));
 
@@ -2498,7 +2498,7 @@
             }
             
           override_methods.Set (m.Name, (m :> IMethod) :: previous_methods);
-          m.HasBeenUsed = true
+          ManagerClass.Instance.MarkAsUsed (m)
     
         | _ => ()
       }
@@ -2533,8 +2533,8 @@
             def abstract_meth = abstract_meth :> IMethod;
 
             when (fun_parms_agree (abstract_meth.GetParameters (), meth_parms)) {
-              abstract_meth.HasBeenUsed = true;
-              meth.HasBeenUsed = true
+              ManagerClass.Instance.MarkAsUsed (abstract_meth);
+              ManagerClass.Instance.MarkAsUsed (meth)
             }
           }
         }

Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n	(original)
+++ nemerle/trunk/ncc/passes.n	Wed Jul  5 18:20:45 2006
@@ -178,6 +178,26 @@
       Location_file_names_amount = 1;
     }
     
+    public virtual MarkAsUsed (member : IMember) : void
+    {
+      member.HasBeenUsed = true;
+    }
+    
+    public virtual MarkAsUsed (member : IMember, _location : Location) : void
+    {
+      member.HasBeenUsed = true;
+    }
+    
+    public virtual MarkAsAssigned (member : IField) : void
+    {
+      member.HasBeenAssigned = true;
+    }
+    
+    public virtual MarkAsAssigned (member : IField, _location : Location) : void
+    {
+      member.HasBeenAssigned = true;
+    }
+    
     
     // ---- PIPELINES USED IN COMPILATION PROCESS ----
 

Modified: nemerle/trunk/ncc/typing/ConstantFolder.n
==============================================================================
--- nemerle/trunk/ncc/typing/ConstantFolder.n	(original)
+++ nemerle/trunk/ncc/typing/ConstantFolder.n	Wed Jul  5 18:20:45 2006
@@ -272,14 +272,14 @@
     internal FieldValueAsLiteral (field : IField) : option [Literal]
     {
       def decl_type = field.DeclaringType;
-      decl_type.HasBeenUsed = true;
+      ManagerClass.Instance.MarkAsUsed (decl_type);
       def enum_ty =
         match (decl_type.GetTydecl ()) {
           | TT.TypeDeclaration.Enum => Some (decl_type)
           | _ => None ()
         };
       def lit = field.GetValue ();
-      field.HasBeenUsed = true;
+      ManagerClass.Instance.MarkAsUsed (field);
       match (enum_ty) {
         | Some (tc) when ! (lit is Literal.Enum) => 
           Some (Literal.Enum (lit :> Literal.Integer, tc))
@@ -290,8 +290,8 @@
     internal FieldValueAsPureLiteral (field : IField) : Literal
     {
       def decl_type = field.DeclaringType;
-      decl_type.HasBeenUsed = true;
-      field.HasBeenUsed = true;
+      ManagerClass.Instance.MarkAsUsed (decl_type);
+      ManagerClass.Instance.MarkAsUsed (field);
       field.GetValue ()
     }
     

Modified: nemerle/trunk/ncc/typing/StaticTyVar.n
==============================================================================
--- nemerle/trunk/ncc/typing/StaticTyVar.n	(original)
+++ nemerle/trunk/ncc/typing/StaticTyVar.n	Wed Jul  5 18:20:45 2006
@@ -125,7 +125,7 @@
       }
     }
 
-    internal SpecialConstraints : GenericParameterAttributes
+    public SpecialConstraints : GenericParameterAttributes
     {
       get { special }
     }

Modified: nemerle/trunk/ncc/typing/TyVarEnv.n
==============================================================================
--- nemerle/trunk/ncc/typing/TyVarEnv.n	(original)
+++ nemerle/trunk/ncc/typing/TyVarEnv.n	Wed Jul  5 18:20:45 2006
@@ -342,7 +342,7 @@
 
         match (res.Fix ()) {
           | MType.Class (ti, args) =>
-            ti.HasBeenUsed = true;
+            ManagerClass.Instance.MarkAsUsed (ti, t.Location);
             match (ti.GetTydecl ()) {
               | Typedtree.TypeDeclaration.Alias (t) =>
                 def subst = ti.MakeSubst (args);

Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n	Wed Jul  5 18:20:45 2006
@@ -290,7 +290,7 @@
                         (null, Pattern.Error ())
 
                       | [field] =>
-                        field.HasBeenUsed = true;
+                        ManagerClass.Instance.MarkAsUsed (field, expr.Location);
                         def ty = matched_value_type.FixedValue.TypeOfMember (field);
                         (field, TypePattern (ty, pat))
 

Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n	(original)
+++ nemerle/trunk/ncc/typing/Typer2.n	Wed Jul  5 18:20:45 2006
@@ -315,7 +315,7 @@
                         else
                           ev2.GetRemover ();
                       assert (ev_meth != null);
-                      ev_meth.HasBeenUsed = true;
+                      ManagerClass.Instance.MarkAsUsed (ev_meth, source.Location);
                       def ev_meth_ref =
                         if (obj1 == null) {
                           def (ty, vars) = ty1.Fix ().TypeOfMethodWithTyparms (ev_meth);
@@ -623,7 +623,7 @@
       } else
         match (kind) {
           | ConversionKind.MethodCall (sr) =>
-            sr.mem.HasBeenUsed = true;
+            ManagerClass.Instance.MarkAsUsed (sr.mem, expr.Location);
             TExpr.Call (target, sr, [Parm (expr)], false)
           | ConversionKind.DownCast =>
             if (expr.Type.TryRequire (target)) {
@@ -799,9 +799,9 @@
         | TExpr.StaticRef (_, mem, _) =>
           match (mem) {
             | f is IField when ctx & Context.NeedLValue != 0 =>
-              f.HasBeenAssigned = true;
+              ManagerClass.Instance.MarkAsAssigned (f, expr.Location);
 
-            | _ => mem.HasBeenUsed = true;
+            | _ => ManagerClass.Instance.MarkAsUsed (mem, expr.Location);
           }
           null
           
@@ -827,25 +827,25 @@
 
           
         | TExpr.ImplicitValueTypeCtor =>
-          (expr.MType :> MType.Class).tycon.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed ((expr.MType :> MType.Class).tycon, expr.Location);
           null
           
 
         | TExpr.FieldMember (obj, fld) =>
           if (ctx %&& Context.NeedLValue)
-            fld.HasBeenAssigned = true;
+            ManagerClass.Instance.MarkAsAssigned (fld, expr.Location);
           else
-            fld.HasBeenUsed = true;
+            ManagerClass.Instance.MarkAsUsed (fld, expr.Location);
           TExpr.FieldMember (Walk (obj), fld)
           
           
         | TExpr.ConstantObjectRef (_, mem) =>
-          mem.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (mem, expr.Location);
           null
           
           
         | TExpr.PropertyMember (obj, prop) =>
-          prop.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (prop, expr.Location);
           def obj = Walk (obj);
           def meth =
             if (ctx %&& Context.NeedLValue) prop.GetSetter ()
@@ -872,7 +872,7 @@
 
         
         | TExpr.StaticPropertyRef (from, prop) =>
-          prop.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (prop, expr.Location);
           def meth =
             if (ctx %&& Context.NeedLValue) prop.GetSetter ()
             else prop.GetGetter ();
@@ -888,7 +888,7 @@
           
         
         | TExpr.EventMember (obj, ev) =>
-          ev.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (ev, expr.Location);
           def obj = Walk (obj);
           
           mutable field = null;
@@ -903,7 +903,7 @@
           }
           
         | TExpr.StaticEventRef (from, ev) =>
-          ev.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (ev, expr.Location);
 
           mutable field = null;
           when (ev.DeclaringType.Equals (current_type)) {
@@ -917,7 +917,7 @@
           }
 
         | TExpr.MethodRef (obj, meth, type_parms, notvirt) =>
-          meth.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (meth, expr.Location);
           def notvirt = notvirt || IsBaseRef (obj);
 
           if (ctx %&& (Context.IsCalledValue | Context.IsDelegeteCtorParm))
@@ -1208,7 +1208,7 @@
           
           
         | TExpr.Base (meth) =>
-          meth.HasBeenUsed = true;
+          ManagerClass.Instance.MarkAsUsed (meth, expr.Location);
           null
           
 



More information about the svn mailing list