[svn] r6645: vs-plugin/trunk: Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj Nemerle.Compiler.Utils/...

IT svnadmin at nemerle.org
Tue Sep 12 06:16:18 CEST 2006


Log:
Working on the method parameter tips.

Author: IT
Date: Tue Sep 12 06:16:10 2006
New Revision: 6645

Added:
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/MethodTipInfo.n
Modified:
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.Type.n
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n
   vs-plugin/trunk/Nemerle.VsIntegration/Engine/ProjectInfo.cs
   vs-plugin/trunk/Nemerle.VsIntegration/NemerleAuthoringSink.cs
   vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs
   vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs
   vs-plugin/trunk/Nemerle.VsIntegration/Parsing/NemerleAuthoringScope.cs

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 Sep 12 06:16:10 2006
@@ -109,6 +109,9 @@
   <ItemGroup>
     <Compile Include="Nemerle.Completion2\CodeModel\GotoInfo.n" />
   </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Nemerle.Completion2\CodeModel\MethodTipInfo.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/CodeModel/MethodTipInfo.n
==============================================================================
--- (empty file)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/MethodTipInfo.n	Tue Sep 12 06:16:10 2006
@@ -0,0 +1,8 @@
+using System;
+
+namespace Nemerle.Completion2
+{
+	public class MethodTipInfo
+	{
+	}
+}

Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.Type.n
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.Type.n	(original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.Type.n	Tue Sep 12 06:16:10 2006
@@ -16,8 +16,14 @@
 	public partial class Project
 	{
     /// Complete word inside the method.
-    CompleteInType(@type : Decl.Type, fileIndex : int, line : int, col : int, 
-      getText : GetText) : array[CompletionElem]
+    CompleteInType(
+      @type     : Decl.Type,
+      fileIndex : int,
+      line      : int,
+      col       : int, 
+      getText   : GetText
+    )
+      : array[CompletionElem]
     {
       def typeBuilder = @type.Builder;
       // Find member under cursor
@@ -70,7 +76,8 @@
       fileIndex : int,
       line      : int,
       col       : int,
-      getText   : GetText)
+      getText   : GetText
+    )
     : QuickTipInfo
     {
       def typeBuilder = typeDecl.Builder;
@@ -174,7 +181,8 @@
       fileIndex : int,
       line      : int,
       col       : int,
-      getText   : GetText)
+      getText   : GetText
+    )
     : GotoInfo
     {
       def typeBuilder = typeDecl.Builder;
@@ -272,5 +280,47 @@
         throw System.Exception($"Unknown member type '$member'.");
       }
     }
+
+    GetMethodTip(
+      typeDecl  : Decl.Type,
+      fileIndex : int,
+      line      : int,
+      col       : int, 
+      getText   : GetText
+    )
+      : list[MethodTipInfo]
+    {
+      def typeBuilder = typeDecl.Builder;
+      def member      = typeBuilder.GetActiveMember(fileIndex, line, col);
+
+      match (member)
+      {
+        | method is MethodBuilder => 
+          def loc = method.BodyLocation;
+          
+          if (loc.Contains(line, col)) // completion in method body
+          {
+            def bodyCode       = getText(loc.Line, loc.Column, loc.EndLine, loc.EndColumn);
+            def completionCode = getText(loc.Line, loc.Column, line, col);
+            def result         = _engine.RunCompletionEngine(method, bodyCode, completionCode.Length);
+
+            if (result == null)
+            {
+              Trace.WriteLine("### RunCompletionEngine() return null!");
+              [];
+            }
+            else
+            {
+              Trace.WriteLine($"# RunCompletionEngine() return $(result.ObjectType)");
+              _ = MakeCompletionList(result);
+              null
+            }
+          }
+          else
+            null
+        | null => []
+        | _    => throw System.Exception($"Unknown member type '$member'.");
+      }
+    }
   } // end class Project
 } // end namespace

Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n	(original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n	Tue Sep 12 06:16:10 2006
@@ -116,10 +116,8 @@
 
     public GetQuickTipInfo(/*[NotNull]*/ filePath : string, line : int, col : int, getText : GetText) : QuickTipInfo
     {
-      def a = 0;
       def fileIndex = _compileUnits.GetFileIndex(filePath);
       def decl      = GetActiveDecl(fileIndex, line, col);
-      ignore(a);
 
       match (decl)
       {
@@ -171,5 +169,18 @@
       | _ => ()
       }
     }
+
+    public GetMethodTip([NotNull] filePath : string, line : int, col : int, getText : GetText) : list[MethodTipInfo]
+    {
+      def fileIndex = _compileUnits.GetFileIndex(filePath);
+      def decl      = GetActiveDecl(fileIndex, line, col);
+
+      match (decl)
+      {
+      | Type as tp => GetMethodTip(tp, fileIndex, line, col, getText);
+      | None       => throw System.Exception()
+      | _ => null
+      }
+    }
   } // end class Project
 } // end namespace

Modified: vs-plugin/trunk/Nemerle.VsIntegration/Engine/ProjectInfo.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/Engine/ProjectInfo.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/Engine/ProjectInfo.cs	Tue Sep 12 06:16:10 2006
@@ -260,7 +260,7 @@
 			}
 		}
 
-		internal CompletionElem[] CompleteWord(
+		public CompletionElem[] CompleteWord(
 			string filePath, int line, int col, GetText getText)
 		{
 			return Project.CompleteWord(filePath, line + 1, col + 1, getText);
@@ -280,5 +280,11 @@
 		{
 			return Project.GetGotoInfo(filePath, line + 1, col + 1, getText);
 		}
+
+		public Methods GetMethodTip(string filePath, int line, int col, GetText getText)
+		{
+			object obj = Project.GetMethodTip(filePath, line + 1, col + 1, getText);
+			return null;
+		}
 	}
 }
\ No newline at end of file

Modified: vs-plugin/trunk/Nemerle.VsIntegration/NemerleAuthoringSink.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/NemerleAuthoringSink.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/NemerleAuthoringSink.cs	Tue Sep 12 06:16:10 2006
@@ -24,7 +24,5 @@
 		{
 			get { return _source; }
 		}
-
-		//override 
 	}
 }

Modified: vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs	Tue Sep 12 06:16:10 2006
@@ -127,9 +127,13 @@
 
 		#region ParseSource
 
+		ParseRequest _request;
+
 		public override AuthoringScope ParseSource(ParseRequest request)
 		{
-			if (null == request)
+			_request = request;
+
+			if (request == null)
 				throw new ArgumentNullException("request");
 
 			Debug.Print(
@@ -139,18 +143,18 @@
 
 			switch (request.Reason)
 			{
-				case ParseReason.Check:             return Check(request);
+				case ParseReason.Check:             return Check();
 				case ParseReason.MemberSelect:
-				case ParseReason.CompleteWord:      return GetCompleteWord(request);
+				case ParseReason.CompleteWord:      return GetCompleteWord();
 				case ParseReason.Goto:
-				case ParseReason.QuickInfo:         return GetScope(request);
+				case ParseReason.QuickInfo:         return GetMethodScope();
+				case ParseReason.MethodTip:         return GetMethodTip  ();
 				case ParseReason.Autos:
 				case ParseReason.CodeSpan:
 				case ParseReason.DisplayMemberList:
 				case ParseReason.HighlightBraces:
 				case ParseReason.MatchBraces:
 				case ParseReason.None:
-				case ParseReason.MethodTip:
 				case ParseReason.MemberSelectAndHighlightBraces: break;
 			}
 
@@ -159,12 +163,12 @@
 			if (_specialSources.TryGetValue(request.View, out source) && source.ScopeCreator != null)
 				return source.ScopeCreator(request);
 
-			return GetDefaultScope(request);
+			return GetDefaultScope();
 		}
 
-		private AuthoringScope Check(ParseRequest request)
+		private AuthoringScope Check()
 		{
-			ProjectInfo projectInfo = ProjectInfo.FindProject(request.FileName);
+			ProjectInfo projectInfo = ProjectInfo.FindProject(_request.FileName);
 
 			if (projectInfo == null)
 				return null;
@@ -172,12 +176,12 @@
 			try
 			{
 				projectInfo.Engine.ProcessMessages = true;
-				projectInfo.UpdateFile(request);
+				projectInfo.UpdateFile(_request);
 
 				Project project = projectInfo.Project;
 
 				project.CheckErrors(
-					request.FileName,
+					_request.FileName,
 					delegate(CompilerMessage cm)
 					{
 						TextSpan ts = new TextSpan();
@@ -187,87 +191,56 @@
 						ts.iStartIndex = cm.Location.Column    - 1;
 						ts.iEndIndex   = cm.Location.EndColumn - 1;
 
-						request.Sink.AddError(
-							request.FileName,
+						_request.Sink.AddError(
+							_request.FileName,
 							cm.Message,
 							ts,
 							cm.MessageKind == MessageKind.Error   ? Severity.Error :
 							cm.MessageKind == MessageKind.Warning ? Severity.Warning :
 							                                        Severity.Hint);
 					},
-					delegate(int lineStart, int colStart, int lineEnd, int colEnd)
-					{
-						return GetCodeRegion(request, lineStart - 1, colStart - 1, lineEnd - 1, colEnd - 1);
-					});
+					GetCodeRegion);
 			}
 			finally
 			{
 				projectInfo.Engine.ProcessMessages = false;
 			}
 
-			return GetDefaultScope(request);
+			return GetDefaultScope();
 		}
 
-		AuthoringScope GetScope(ParseRequest request)
+		private AuthoringScope GetMethodScope()
 		{
 			string text;
 
-			int res = request.View.GetTextStream(
-				request.Line, request.Col, request.Line, request.Col + 1, out text);
+			int res = _request.View.GetTextStream(
+				_request.Line, _request.Col, _request.Line, _request.Col + 1, out text);
 
 			if (res != VSConstants.S_OK || text.Length == 0 || text[0] == ' ' || text[0] == '\t')
 				return null;
 
-			ProjectInfo projectInfo = ProjectInfo.FindProject(request.FileName);
+			ProjectInfo projectInfo = GetProject();
 
 			if (projectInfo == null)
 				return null;
 
-			projectInfo.UpdateFile(request);
-
-			return new NemerleAuthoringScope(
-				projectInfo,
-				(NemerleAuthoringSink)request.Sink,
-				request.FileName,
-				delegate(int lineStart, int colStart, int lineEnd, int colEnd)
-				{
-					return GetCodeRegion(request, lineStart - 1, colStart - 1, lineEnd - 1, colEnd - 1);
-				});
+			return new NemerleAuthoringScope(projectInfo, _request.Sink, _request.FileName, GetCodeRegion);
 		}
 
-		AuthoringScope GetCompleteWord(ParseRequest request)
+		private AuthoringScope GetCompleteWord()
 		{
 			try
 			{
-				ProjectInfo proj = ProjectInfo.FindProject(request.FileName);
+				ProjectInfo projectInfo = GetProject();
 
-				if (proj == null)
+				if (projectInfo == null)
 					return null;
 
-				proj.UpdateFile(request);
-
-				string filePath = request.FileName;
-
-				// getText() uses location pos from (1, 1)
-				GetText getText = delegate(int lineStart, int colStart, int lineEnd, int colEnd)
-				{
-					// GetCodeRegion() uses location pos from (0, 0),
-					// so, we need to adjust it.
-					return GetCodeRegion(request, lineStart - 1, colStart - 1, lineEnd - 1, colEnd - 1);
-				};
-
-				CompletionElem[] overloads = proj.CompleteWord(
-					filePath, request.Line, request.Col, getText);
+				CompletionElem[] overloads = projectInfo.CompleteWord(
+					_request.FileName, _request.Line, _request.Col, GetCodeRegion);
 
 				if (overloads.Length > 0)
-				{
-					return new NemerleAuthoringScope(
-						ProjectInfo.FindProject(request.FileName),
-						(NemerleAuthoringSink)request.Sink, overloads);
-				}
-
-				Trace.WriteLine("### RunCompletionEngine() return empty list!");
-				return GetDefaultScope(request);
+					return new NemerleAuthoringScope(projectInfo, _request.Sink, overloads);
 			}
 			catch (Exception ex)
 			{
@@ -275,15 +248,40 @@
 				Trace.WriteLine(ex);
 			}
 
-			return GetDefaultScope(request);
+			return GetDefaultScope();
 		}
 
-		string GetCodeRegion(ParseRequest request, int startLine, int startCol, int endLine, int endCol)
+		private AuthoringScope GetMethodTip()
+		{
+			ProjectInfo projectInfo = GetProject();
+
+			if (projectInfo == null)
+				return null;
+
+			Methods methods = projectInfo.GetMethodTip(
+				_request.FileName, _request.Line, _request.Col, GetCodeRegion);
+
+			if (methods != null)
+			{
+				return new NemerleAuthoringScope(
+					ProjectInfo.FindProject(_request.FileName),
+					(NemerleAuthoringSink)_request.Sink, methods);
+			}
+
+			return GetDefaultScope();
+		}
+
+		private string GetCodeRegion(int startLine, int startCol, int endLine, int endCol)
 		{
 			string region;
 
-			if (request.View.GetTextStream(startLine, startCol,
-				endLine, endCol, out region) == VSConstants.S_OK)
+			if (_request.View.GetTextStream(
+					startLine - 1,
+					startCol  - 1,
+					endLine   - 1,
+					endCol    - 1,
+					out region
+				) == VSConstants.S_OK)
 			{
 				return region;
 			}
@@ -291,18 +289,27 @@
 			return "";
 		}
 
-		private static AuthoringScope GetDefaultScope(ParseRequest request)
+		private AuthoringScope GetDefaultScope()
 		{
 			return new NemerleAuthoringScope(
-				ProjectInfo.FindProject(request.FileName), (NemerleAuthoringSink)request.Sink);
+				ProjectInfo.FindProject(_request.FileName), _request.Sink);
+		}
+
+		private ProjectInfo GetProject()
+		{
+			ProjectInfo projectInfo = ProjectInfo.FindProject(_request.FileName);
+
+			if (projectInfo != null)
+				projectInfo.UpdateFile(_request);
+
+			return projectInfo;
 		}
 
 		#endregion
 
 		public override ImageList GetImageList()
 		{
-			ImageList il = base.GetImageList();
-			return il;
+			return base.GetImageList();
 		}
 
 		public override int ValidateBreakpointLocation(

Modified: vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs	Tue Sep 12 06:16:10 2006
@@ -39,7 +39,7 @@
 
 			//TODO: it has to handle # (pragma, region, etc)
 
-			switch(token.Token)
+			switch (token.Token)
 			{
 				case SyntaxType.WhiteSpace:
 					tokenInfo.Color = TokenColor.Text;

Modified: vs-plugin/trunk/Nemerle.VsIntegration/Parsing/NemerleAuthoringScope.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/Parsing/NemerleAuthoringScope.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/Parsing/NemerleAuthoringScope.cs	Tue Sep 12 06:16:10 2006
@@ -15,17 +15,16 @@
 
 		public NemerleAuthoringScope(
 			ProjectInfo          project, 
-			NemerleAuthoringSink sink, 
+			AuthoringSink    sink, 
 			CompletionElem[]     overloadPossibility)
+			: this(project, sink)
 		{
-			_project             = project;
-			_sink                = sink;
 			_overloadPossibility = overloadPossibility;
 		}
 
 		public NemerleAuthoringScope(
 			ProjectInfo          project,
-			NemerleAuthoringSink sink,
+			AuthoringSink sink,
 			string               filePath,
 			GetText              getText)
 			: this(project, sink)
@@ -34,19 +33,28 @@
 			_getText  = getText;
 		}
 
-		public NemerleAuthoringScope(ProjectInfo project, NemerleAuthoringSink sink)
+		public NemerleAuthoringScope(
+			ProjectInfo   project, 
+			AuthoringSink sink, 
+			Methods       methods)
+			: this(project, sink)
+		{
+			_methods = methods;
+		}
+
+		public NemerleAuthoringScope(ProjectInfo project, AuthoringSink sink)
 		{
 			_project = project;
 			_sink    = sink;
-			_overloadPossibility = new CompletionElem[0];
 		}
  
 		#endregion
 
 		#region fields
 		
-		private NemerleAuthoringSink _sink;
+		private AuthoringSink    _sink;
 		private CompletionElem[]     _overloadPossibility;
+		private Methods          _methods;
 		private ProjectInfo          _project;
 		private string               _filePath;
 		private GetText              _getText;
@@ -100,7 +108,7 @@
 
 		public override Methods GetMethods(int line, int col, string name)
 		{
-			throw new Exception("The method or operation is not implemented.");
+			return _methods;
 		}
 	}
 }



More information about the svn mailing list