[svn] r7081: vs-plugin/trunk/Nemerle.Compiler.Utils: Nemerle.Compiler.Utils.csproj Nemerle.Completion2/Eng...

VladD2 svnadmin at nemerle.org
Tue Dec 12 12:17:51 CET 2006


Log:
Move completion code from the compiler.

Author: VladD2
Date: Tue Dec 12 12:17:48 2006
New Revision: 7081

Added:
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Completion.n
Modified:
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj

Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj	(original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj	Tue Dec 12 12:17:48 2006
@@ -164,6 +164,9 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
   </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Nemerle.Completion2\Engine\Engine.Completion.n" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

Added: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Completion.n
==============================================================================
--- (empty file)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Completion.n	Tue Dec 12 12:17:48 2006
@@ -0,0 +1,173 @@
+using System;
+using System.IO;
+using System.Diagnostics;
+
+using SCG = System.Collections.Generic;
+using SR  = System.Reflection;
+
+using Nemerle.Assertions;
+using Nemerle.Collections;
+using Nemerle.Compiler;
+using Nemerle.Compiler.Parsetree;
+using Nemerle.Imperative;
+using Nemerle.Utility;
+using Nemerle.Compiler.Utils;
+
+using TT = Nemerle.Compiler.Typedtree;
+using TExpr = Nemerle.Compiler.Typedtree.TExpr;
+
+namespace Nemerle.Completion2
+{
+	public partial class Engine
+	{
+    protected override Complete (
+      expression : PExpr,
+      expected : TyVar,
+      typer : Typer,
+      env : GlobalEnv) : void
+    {
+      match (expression)
+      {
+        | PExpr.Member (obj, Splicable.HalfId (name)) =>
+          def obj = obj; // for debug
+          def name = name; // for debug
+          def elems = SCG.List ();
+          def tobj = typer.TypeExpr (obj);
+
+          def AddOverloads(overloads)
+          {
+            unless (overloads.IsEmpty)
+              elems.Add(Elem.Overloads (overloads));
+          }
+
+          def tryInterpretAsGlobals()
+          {
+            def nss = this.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
+            Completion.AddTypesAndNamespaces (elems, nss, obj, name, false);
+          }
+
+          def tryInterpretAsQualifiedName() : void
+          {
+            // Try interpret as qualified name...
+            AddOverloads(typer.TypeNameFull(expression, Solver.FreshTyVar (), true));
+          }
+
+          def tryInterpretAsExtentionMethods() : void
+          {
+            // Try get extention methods...
+            def extMethods = this.LibrariesManager.GetExtensionMethods (name.Id, name.GetEnv (env), true);
+            def ty = tobj.MType;
+
+            when (ty != null)
+              foreach (method when this.IsExtensionMethod(method, ty) in extMethods)
+                foreach (over in typer.ConstructMethodOverload (method, null, true))
+                {
+                  over.ExtensionMethodObject = tobj;
+                  elems.Add(Elem.Overload (over));
+                }
+          }
+
+          def tryInterpretAsMemberAccessAtGeneralExpression() : void
+          {
+            // Try interpret as member access at general expression...
+            match (typer.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
+
+        | PExpr.ToComplete (name) =>
+          def prefix = name.Id;
+          //def builder = CurrentMethodBuilder;
+          def overloads = typer.TypeNameFull (expression, expected, for_completion = true);
+
+          def elems = SCG.List ();
+          elems.Add(Elem.Overloads (overloads));
+          
+          // find locals
+          def CmpOptions = System.StringComparison.InvariantCultureIgnoreCase;
+          foreach ((name, local) when name.Id.StartsWith (prefix, CmpOptions) in typer.GetLocals().GetLocals())
+            elems.Add(Elem.Local (local));
+
+          // add namespaces and types
+
+          def nss = this.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
+          Completion.AddTypesAndNamespaces (elems, nss, null, name, false);
+            
+          throw CompletionResult (elems, prefix)
+
+        | _ => throw System.NotImplementedException ();
+      }
+    }
+
+    /// Process completion in patterns.
+    protected override CompletePattern (
+      expression         : PExpr,
+      matched_value_type : TyVar,
+      _patternTyper       : Typer.PatternTyper,
+      _env                : GlobalEnv
+    )
+      : void //
+    {
+      match (expression)
+      {
+        | PExpr.Is (_nested, PExpr.ToComplete (name)) with obj = null
+        | PExpr.Is (_nested, 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);
+
+        | PExpr.ToComplete (name) with obj = null
+        | 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 ())
+                  {
+                    | TT.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 = this.CoreEnv.NameTree.NamespaceTree 
+            :: name.GetEnv(this.CoreEnv).OpenNamespaces;
+          Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
+
+          throw CompletionResult (elems, name.Id);
+        | _ => ()
+      }
+    }
+  } // end class Engine
+} // end namespace



More information about the svn mailing list