[svn] r7080: nemerle/trunk/ncc: parsing/MainParser.n passes.n
typing/TyVarEnv.n typing/Typer-PatternTyper....
VladD2
svnadmin at nemerle.org
Tue Dec 12 12:15:58 CET 2006
Log:
Move completion code outside the compiler (into http://nemerle.org/svn/vs-plugin/trunk/Nemerle.Compiler.Utils).
Author: VladD2
Date: Tue Dec 12 12:15:55 2006
New Revision: 7080
Modified:
nemerle/trunk/ncc/parsing/MainParser.n
nemerle/trunk/ncc/passes.n
nemerle/trunk/ncc/typing/TyVarEnv.n
nemerle/trunk/ncc/typing/Typer-PatternTyper.n
nemerle/trunk/ncc/typing/Typer.n
Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n (original)
+++ nemerle/trunk/ncc/parsing/MainParser.n Tue Dec 12 12:15:55 2006
@@ -2215,17 +2215,7 @@
ty = ({ shift (); def e = parse_expr (stop | TokenStoppers.Equal);
expect_operator ("="); e })
| Token.Operator ("=") with ty = null =>
- match (ty) // Type completion in type enforcement
- {
- | PExpr.ToComplete (name) with obj = null
- | PExpr.Member (obj, Splicable.HalfId (name)) =>
- def elems = SCG.List ();
- def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
- throw CompletionResult (elems, name.Id);
-
- | _ => ()
- }
+ Manager.CompleteTypeRef (ty, null, env); // Type completion in type enforcement
def expr =
if (ty == null) {
Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n (original)
+++ nemerle/trunk/ncc/passes.n Tue Dec 12 12:15:55 2006
@@ -474,5 +474,53 @@
_ = method;
throw System.NotImplementedException ();
}
+
+ /// Process completion.
+ protected internal virtual Complete (expression : PExpr, expected : TyVar, typer : Typer, env : GlobalEnv) : void
+ {
+ ignore (expression); ignore (expected); ignore (typer); ignore (env);
+ throw System.NotImplementedException ();
+ }
+
+ /// Process completion in patterns.
+ protected internal virtual CompletePattern (
+ expression : PExpr,
+ matched_value_type : TyVar,
+ patternTyper : Typer.PatternTyper,
+ env : GlobalEnv
+ )
+ : void
+ {
+ ignore (expression); ignore (matched_value_type); ignore (patternTyper); ignore (env);
+ throw System.NotImplementedException ();
+ }
+
+ /// Process completion in type reference.
+ protected internal virtual CompleteTypeRef (
+ expression : PExpr,
+ curTypeBuilder : TypeBuilder,
+ env : GlobalEnv
+ )
+ : void
+ {
+ ignore (curTypeBuilder); ignore (env);
+
+ match (expression)
+ {
+ | PExpr.ToComplete (name) with obj = null
+ | PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
+ def obj = obj;
+ def name = name;
+ def elems = SCG.List ();
+
+ def nss = this.CoreEnv.NameTree.NamespaceTree
+ :: name.GetEnv(this.CoreEnv).OpenNamespaces;
+ Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
+
+ throw CompletionResult (elems, name.Id);
+
+ | _ => ()
+ }
+ }
}
}
Modified: nemerle/trunk/ncc/typing/TyVarEnv.n
==============================================================================
--- nemerle/trunk/ncc/typing/TyVarEnv.n (original)
+++ nemerle/trunk/ncc/typing/TyVarEnv.n Tue Dec 12 12:15:55 2006
@@ -253,17 +253,10 @@
f2 (t, false)
} and f2 (t, allow_ref) {
match (t) {
- | PExpr.ToComplete (name) with obj = null
- | PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
- def obj = obj;
- def name = name;
- def elems = SCG.List ();
-
- def nss = Manager.CoreEnv.NameTree.NamespaceTree
- :: name.GetEnv(Manager.CoreEnv).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
-
- throw CompletionResult (elems, name.Id);
+ | PExpr.ToComplete (_)
+ | PExpr.Member (_, Parsetree.Splicable.HalfId (_)) =>
+ Manager.CompleteTypeRef (t, curtc, env);
+ throw System.NotImplementedException ();
| <[ ref $t ]> when allow_ref =>
MType.Ref (f (t))
Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n (original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n Tue Dec 12 12:15:55 2006
@@ -152,7 +152,7 @@
public partial class Typer
{
[ManagerAccess (typer.Manager)]
- class PatternTyper
+ public class PatternTyper
{
typer : Typer;
matched_value_type : TyVar;
@@ -558,56 +558,17 @@
DoTypePattern (matched_value_type : TyVar, pattern : PT.PExpr) : Pattern
{
match (pattern) {
- | PT.PExpr.ToComplete (name) with obj = null
- | PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
- def elems = SCG.List ();
- match (matched_value_type.Hint)
- {
- | Some(ty) =>
- def prefix = name.Id;
- def option = System.StringComparison.InvariantCultureIgnoreCase;
- match (ty)
- {
- | MType.Class (ti, _args) =>
- match (ti.GetTydecl ())
- {
- | TypeDeclaration.Variant (members) =>
- foreach (m when m.Name.StartsWith (prefix, option) in members)
- elems.Add (Elem.Node (m.Name, m.NamespaceNode));
-
- throw CompletionResult (elems, name.Id);
-
- //| TypeDeclaration.VariantOption =>
- | _ => System.Console.WriteLine(ty);
- }
- | _ => System.Console.WriteLine(ty);
- }
-
- | None => System.Console.WriteLine(matched_value_type);
- }
-
- def nss = Manager.CoreEnv.NameTree.NamespaceTree
- :: name.GetEnv(Manager.CoreEnv).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
-
- throw CompletionResult (elems, name.Id);
-
- | PT.PExpr.TypeEnforcement (nested, PT.PExpr.ToComplete (name)) with obj = null
- | PT.PExpr.TypeEnforcement (nested, PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name)))
- | PT.PExpr.Is (nested, PT.PExpr.ToComplete (name)) with obj = null
- | PT.PExpr.Is (nested, PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name))) =>
- def obj = obj;
- def name = name;
- def nested = nested;
- ignore(obj); ignore(nested);
-
- def elems = SCG.List ();
-
- def nss = Manager.CoreEnv.NameTree.NamespaceTree
- :: name.GetEnv(Manager.CoreEnv).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
-
- throw CompletionResult (elems, name.Id);
+ | PT.PExpr.ToComplete (_)
+ | PT.PExpr.Member (_, Parsetree.Splicable.HalfId (_)) =>
+ Manager.CompletePattern (pattern, matched_value_type, this, typer.env);
+ throw System.NotImplementedException ();
+
+ | PT.PExpr.TypeEnforcement (_, PT.PExpr.ToComplete (_))
+ | PT.PExpr.TypeEnforcement (_, PT.PExpr.Member (_, Parsetree.Splicable.HalfId (_)))
+ | PT.PExpr.Is (_, PT.PExpr.ToComplete (_))
+ | PT.PExpr.Is (_, PT.PExpr.Member (_, Parsetree.Splicable.HalfId (_))) =>
+ Manager.CompletePattern (pattern, matched_value_type, this, typer.env);
+ throw System.NotImplementedException ();
| PT.PExpr.ListLiteral (l) =>
TypePattern (matched_value_type, Macros.Lift (l))
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Tue Dec 12 12:15:55 2006
@@ -77,7 +77,6 @@
/** A class responsible for typing a single (global or local) function. */
public partial class Typer : TyperBase
{
- static CmpOptins = System.StringComparison.InvariantCultureIgnoreCase;
is_instance_ctor : bool;
is_method : bool;
env : GlobalEnv;
@@ -1148,7 +1147,13 @@
DoType (expression : PT.PExpr, expected : TyVar, is_toplevel_in_seq : bool) : TExpr
{
- match (expression) {
+ assert(true);
+ match (expression)
+ {
+ | PT.PExpr.Member (_, PT.Splicable.HalfId (_)) | PT.PExpr.ToComplete (_) =>
+ Manager.Complete (expression, expected, this, env);
+ throw System.NotImplementedException ();
+
| PT.PExpr.ParmByRef
| PT.PExpr.ParmOut =>
ReportFatal (messenger,
@@ -1457,85 +1462,6 @@
else
TypeMemberExpr (TypeExpr (obj), name, expected)
-
- | PT.PExpr.Member (obj, PT.Splicable.HalfId (name)) =>
- def obj = obj; // for debug
- def name = name; // for debug
- def elems = SCG.List ();
- def tobj = TypeExpr (obj);
-
- def AddOverloads(overloads)
- {
- unless (overloads.IsEmpty)
- elems.Add(Elem.Overloads (overloads));
- }
-
- def tryInterpretAsGlobals()
- {
- def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name, false);
- }
-
- def tryInterpretAsQualifiedName() : void
- {
- // Try interpret as qualified name...
- AddOverloads(TypeNameFull(expression, FreshTyVar(), true));
- }
-
- def tryInterpretAsExtentionMethods() : void
- {
- // Try get extention methods...
- def extMethods = Manager.LibrariesManager.GetExtensionMethods (name.Id, name.GetEnv (env), true);
- def ty = tobj.MType;
-
- when (ty != null)
- foreach (method when Manager.IsExtensionMethod(method, ty) in extMethods)
- foreach (over in ConstructMethodOverload (method, null, true))
- {
- over.ExtensionMethodObject = tobj;
- elems.Add(Elem.Overload (over));
- }
- }
-
- def tryInterpretAsMemberAccessAtGeneralExpression() : void
- {
- // Try interpret as member access at general expression...
- match (TypeMember (tobj, name, expected, for_completion = true))
- {
- | Some (lst) => AddOverloads(lst);
- | None => ()
- }
- }
-
- tryInterpretAsGlobals();
- tryInterpretAsQualifiedName();
- tryInterpretAsExtentionMethods();
- tryInterpretAsMemberAccessAtGeneralExpression();
-
- def compl_exc = CompletionResult (elems, name.Id);
- compl_exc.ObjectType = tobj.Type.Fix();
- throw compl_exc
-
- | PT.PExpr.ToComplete (name) =>
- def prefix = name.Id;
- //def builder = CurrentMethodBuilder;
- def overloads = TypeNameFull (expression, expected, for_completion = true);
-
- def elems = SCG.List ();
- elems.Add(Elem.Overloads (overloads));
-
- // find locals
- foreach ((name, local) when name.Id.StartsWith (prefix, CmpOptins) in local_context.GetLocals ())
- elems.Add(Elem.Local (local));
-
- // add namespaces and types
-
- def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, null, name, false);
-
- throw CompletionResult (elems, prefix)
-
-
| PT.PExpr.Member (_, _) =>
ReportFatal (messenger,
"$ operator outside quotation <[ ... ]> context")
@@ -2310,7 +2236,7 @@
}
- ConstructMethodOverload (m : IMethod, pt_from : PT.PExpr = null,
+ public ConstructMethodOverload (m : IMethod, pt_from : PT.PExpr = null,
maybe_varargs = false) : list [OverloadPossibility]
{
def bounds = m.GetHeader ().typarms.Map (fun (tv) { tv.LowerBound });
@@ -2462,7 +2388,7 @@
}
- TypeMember (obj : TExpr, name : PT.Name, expected : TyVar, for_completion = false)
+ public TypeMember (obj : TExpr, name : PT.Name, expected : TyVar, for_completion = false)
: option [list [OverloadPossibility]]
{
def mem_name = name.Id;
@@ -2661,7 +2587,7 @@
}
- TypeNameFull (expr : PT.PExpr, expected : TyVar, for_completion = false) : list [OverloadPossibility]
+ public TypeNameFull (expr : PT.PExpr, expected : TyVar, for_completion = false) : list [OverloadPossibility]
{
mutable mem_name = null;
@@ -3346,7 +3272,7 @@
PopLocals ();
}
} else if (ns.Equals (Manager.Typer_yield_macro)) {
- when (! inside_yielding_function) {
+ when (!inside_yielding_function && !Manager.IsInCompletionMode) {
_ = GetYieldType ();
log (TYPING, "throwing STY");
throw SwitchToYielding ();
More information about the svn
mailing list