[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