[svn] r7078: vs-plugin/trunk: Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n Nemerle.Compi...

IT svnadmin at nemerle.org
Mon Dec 11 06:36:53 CET 2006


Log:
Navigation drop downs.

Author: IT
Date: Mon Dec 11 06:36:47 2006
New Revision: 7078

Added:
   vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs
Modified:
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n
   vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleLanguageService.cs
   vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleSource.cs
   vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleTypeAndMemberDropdownBars .cs
   vs-plugin/trunk/Nemerle.VsIntegration/Nemerle.VsIntegration.csproj

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	Mon Dec 11 06:36:47 2006
@@ -292,6 +292,32 @@
       }
     }
 
+    public GetTypes(fileIndex : int) : List[TypeBuilder]
+    {
+      def l = List();
+
+      def find(decl)
+      {
+        match (decl)
+        {
+        | Decl.Type(b)    =>
+
+          l.Add(b);
+          l.AddRange(b.DeclaredNestedTypes);
+
+          //foreach (t when !t.IsVariantOption in b.DeclaredNestedTypes)
+          //  l.Add(t);
+
+        | Namespace as nm => nm.Decls.Iter(find);
+        | _               => ()
+        }
+      }
+
+      find(_compileUnits[fileIndex]);
+
+      l
+    }
+
     internal GetAllCompilerMessageForFile(fileIndex : int) : SCG.IEnumerable[CompilerMessage]
     {
       foreach (cm when cm.Location.FileIndex == fileIndex in Errors)

Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n	(original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n	Mon Dec 11 06:36:47 2006
@@ -60,7 +60,7 @@
     {
       mutable nRegions = 0;
 
-      _project.Check(
+      _ = _project.Check(
         FilePath3,
         TestSourceTextManager(FilePath3),
         fun(_, _, _) { nRegions++ },
@@ -72,7 +72,7 @@
     [Test]
     public Check_region_location() : void
     {
-      _project.Check(
+      _ = _project.Check(
         FilePath1,
         TestSourceTextManager(FilePath1),
         fun(loc, _, _)

Added: vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs
==============================================================================
--- (empty file)
+++ vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs	Mon Dec 11 06:36:47 2006
@@ -0,0 +1,148 @@
+using System;
+using System.Collections.Generic;
+
+using Microsoft.VisualStudio.Package;
+using Microsoft.VisualStudio.TextManager.Interop;
+
+using Nemerle.Core;
+using Nemerle.Compiler;
+using Nemerle.Compiler.Typedtree;
+
+using Nemerle.Completion2;
+
+namespace Nemerle.VisualStudio.LanguageService
+{
+	class NemerleDropDownMember : DropDownMember
+	{
+		NemerleDropDownMember(
+			TypeBuilder tb, int fileIndex, string label, TextSpan span, int glyph, DROPDOWNFONTATTR fontAttribute)
+			: base(label, span, glyph, fontAttribute)
+		{
+			_typeBuilder = tb;
+			_fileIndex   = fileIndex;
+		}
+
+		TypeBuilder _typeBuilder;
+		int         _fileIndex;
+
+		public static NemerleDropDownMember Create(TypeBuilder tb, int fileIndex)
+		{
+			string label = tb.ToString();
+
+			TextSpan span = new TextSpan();
+
+			span.iStartLine  = tb.Location.Line - 1;
+			span.iStartIndex = tb.Location.Column - 1;
+			span.iEndLine    = tb.Location.EndLine - 1;
+			span.iEndIndex   = tb.Location.EndColumn - 1;
+
+			return new NemerleDropDownMember(tb, fileIndex, label, span, GetGlyph(tb), GetAttr(tb));
+		}
+
+		private List<DropDownMember> _members;
+		public  List<DropDownMember>  Members
+		{
+			get
+			{
+				if (_members == null)
+				{
+					_members = new List<DropDownMember>();
+
+					foreach (IMember m in _typeBuilder.GetMembers())
+						if (m.Location.FileIndex == _fileIndex && !m.Location.IsGenerated && !(m is TypeInfo))
+							_members.Add(CreateMember(m));
+
+					_members.Sort(delegate(DropDownMember m1, DropDownMember m2)
+					{
+						int glyph = m1.Glyph / 6 - m2.Glyph / 6;
+
+						if (glyph != 0)
+							return glyph;
+
+						return string.Compare(m1.Label, m2.Label);
+					});
+				}
+
+				return _members;
+			}
+		}
+
+		private static DROPDOWNFONTATTR GetAttr(TypeBuilder builder)
+		{
+			return
+				builder.IsVariantOption? DROPDOWNFONTATTR.FONTATTR_ITALIC:
+				                         DROPDOWNFONTATTR.FONTATTR_PLAIN;
+		}
+
+		private static int GetGlyph(TypeBuilder builder)
+		{
+			int kind = 
+				builder.IsDelegate?       2:
+				builder.IsEnum?           3:
+				builder.IsInterface?      8:
+				builder.IsVariantOption? 22:
+				builder.IsStruct?        18:
+				0;
+
+			int modifier = 
+				builder.IsInternal?  1:
+				builder.IsProtected? 3:
+				builder.IsPrivate?   4:
+				0;
+
+			return kind * 6 + modifier;
+		}
+
+		private static DropDownMember CreateMember(IMember member)
+		{
+			string           label    = member.ToString();
+			DROPDOWNFONTATTR attr     = DROPDOWNFONTATTR.FONTATTR_PLAIN;
+			TextSpan         span     = new TextSpan();
+			int              kind     = 0;
+			int              modifier = 0;
+
+			span.iStartLine  = member.Location.Line - 1;
+			span.iStartIndex = member.Location.Column - 1;
+			span.iEndLine    = member.Location.EndLine - 1;
+			span.iEndIndex   = member.Location.EndColumn - 1;
+
+			int idx = label.IndexOf(' ');
+
+			label = label.Substring(idx + 1);
+
+			if (label[0] == '`')
+				label = label.Substring(1, label.Length - 2);
+
+			label = label.Replace(member.DeclaringType.FullName + '.', "");
+
+			if (member is IField)
+			{
+				kind = 7;
+
+				FieldBuilder fb = member as FieldBuilder;
+
+				if (fb != null)
+					label += " : " + fb.GetMemType().ToString();
+			}
+			else if (member is IProperty)
+				kind = 17;
+			else if (member is IMethod)
+				kind = 12;
+			else if (member is IEvent)
+				kind = 5;
+
+			MemberBuilder mi = member as MemberBuilder;
+
+			if (mi != null)
+			{
+				modifier = 
+					mi.IsInternal?  1:
+					mi.IsProtected? 3:
+					mi.IsPrivate?   4:
+					0;
+			}
+
+			return new DropDownMember(label, span, kind * 6 + modifier, attr);
+		}
+	}
+}

Modified: vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleLanguageService.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleLanguageService.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleLanguageService.cs	Mon Dec 11 06:36:47 2006
@@ -30,18 +30,10 @@
 			CompiledUnitAstBrowser.ShowLocation += CompiledUnitAstBrowser_ShowLocation;
 		}
 
-		LanguagePreferences                    _preferences;
-		Dictionary<IVsTextView, NemerleSource> _specialSources = new Dictionary<IVsTextView, NemerleSource>();
-
 		public override void Dispose()
 		{
 			try
 			{
-				foreach (NemerleSource source in _specialSources.Values)
-					source.Dispose();
-
-				_specialSources.Clear();
-
 				foreach (NemerleColorizer colorizer in _colorizers.Values)
 					colorizer.Dispose();
 
@@ -93,9 +85,9 @@
 					break;
 			}
 
-			NemerleSource source;
+			NemerleSource source = (NemerleSource)GetSource(request.View);
 
-			if (_specialSources.TryGetValue(request.View, out source) && source.ScopeCreator != null)
+			if (source != null && source.ScopeCreator != null)
 				return source.ScopeCreator(request);
 
 			return GetDefaultScope(request);
@@ -123,7 +115,7 @@
 
 				projectInfo.Project.Check(
 					request.FileName,
-					new SourceTextManager(projectInfo.GetSource(request.FileName)),
+					new SourceTextManager(source),
 					delegate(Location location, string text, bool isExpanded)
 					{
 						if (location.Line < location.EndLine)
@@ -426,11 +418,6 @@
 
 		#region Source
 
-		public void AddSpecialSource(NemerleSource source, IVsTextView view)
-		{
-			_specialSources.Add(view, source);
-		}
-
 		public override string Name
 		{
 			get { return Resources.Nemerle; }
@@ -540,13 +527,15 @@
 
 		public override TypeAndMemberDropdownBars CreateDropDownHelper(IVsTextView forView)
 		{
-			return null;//new NemerleTypeAndMemberDropdownBars(this, forView);
+			return new NemerleTypeAndMemberDropdownBars(this, forView);
 		}
 
 		#endregion
 
 		#region LanguagePreferences
 
+		LanguagePreferences _preferences;
+
 		public override LanguagePreferences GetLanguagePreferences()
 		{
 			if (_preferences == null)

Modified: vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleSource.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleSource.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleSource.cs	Mon Dec 11 06:36:47 2006
@@ -1,19 +1,13 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-using System.Diagnostics;
-using System.Globalization;
-using System.Runtime.InteropServices;
 
-using Microsoft.VisualStudio;
 using Microsoft.VisualStudio.Package;
 using Microsoft.VisualStudio.TextManager.Interop;
 
-using Nemerle.VisualStudio.Project;
 using Nemerle.Completion2;
-using System.Windows.Forms;
-using System.Text;
-using Nemerle.Collections;
+
+using Nemerle.VisualStudio.Project;
 
 namespace Nemerle.VisualStudio.LanguageService
 {
@@ -91,22 +85,7 @@
 
 		#endregion
 
-		public override CommentInfo GetCommentFormat()
-		{
-			CommentInfo commentInfo = new CommentInfo();
-
-			commentInfo.UseLineComments = true;
-			commentInfo.LineStart       = "//";
-			commentInfo.BlockStart      = "/*";
-			commentInfo.BlockEnd        = "*/";
-
-			return commentInfo;
-		}
-
-		public override void Completion(IVsTextView textView, TokenInfo info, ParseReason reason)
-		{
-			base.Completion(textView, info, reason);
-		}
+		#region OnChangeLineText
 
 		public override void OnChangeLineText(TextLineChange[] lineChange, int last)
 		{
@@ -146,6 +125,22 @@
 			base.OnChangeLineText(lineChange, last);
 		}
 
+		#endregion
+
+		#region Overrides
+
+		public override CommentInfo GetCommentFormat()
+		{
+			CommentInfo commentInfo = new CommentInfo();
+
+			commentInfo.UseLineComments = true;
+			commentInfo.LineStart       = "//";
+			commentInfo.BlockStart      = "/*";
+			commentInfo.BlockEnd        = "*/";
+
+			return commentInfo;
+		}
+
 		public override AuthoringSink CreateAuthoringSink(ParseReason reason, int line, int col)
 		{
 			int maxErrors = LanguageService.Preferences.MaxErrorMessages;
@@ -183,5 +178,7 @@
 			mgr.ApplyEdits();
 			//base.ReformatSpan(mgr, span);
 		}
+
+		#endregion
 	}
 }

Modified: vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleTypeAndMemberDropdownBars .cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleTypeAndMemberDropdownBars .cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleTypeAndMemberDropdownBars .cs	Mon Dec 11 06:36:47 2006
@@ -1,9 +1,13 @@
 using System;
 using System.Collections;
+using System.Collections.Generic;
 
 using Microsoft.VisualStudio.Package;
 using Microsoft.VisualStudio.TextManager.Interop;
 
+using Nemerle.Compiler;
+using Nemerle.Completion2;
+
 using VsPkg = Microsoft.VisualStudio.Package;
 
 namespace Nemerle.VisualStudio.LanguageService
@@ -13,8 +17,14 @@
 		public NemerleTypeAndMemberDropdownBars(NemerleLanguageService langService, IVsTextView forView)
 			: base(langService)
 		{
+			_source = (NemerleSource)langService.GetSource(forView);
 		}
 
+		NemerleSource _source;
+		int           _lastTimeStamp      = -1;
+		int           _lastSelectedType   = -2;
+		int           _lastSelectedMember = -2;
+
 		public override bool OnSynchronizeDropdowns(
 			VsPkg.LanguageService languageService,
 			IVsTextView           textView,
@@ -25,11 +35,147 @@
 			ref int               selectedType,
 			ref int               selectedMember)
 		{
-			NemerleLanguageService lang = (NemerleLanguageService)languageService;
+			if (_source.ProjectInfo == null)
+				return false;
+
+			bool ret = false;
+
+			if (_lastTimeStamp != _source.TimeStamp)
+			{
+				ret = true;
+
+				List<NemerleDropDownMember> list = _source.ProjectInfo.Project
+					.GetTypes(_source.FileIndex)
+					.ConvertAll<NemerleDropDownMember>(delegate(TypeBuilder tb)
+					{
+						return NemerleDropDownMember.Create(tb, _source.FileIndex);
+					});
+
+				list.Sort(delegate(NemerleDropDownMember m1, NemerleDropDownMember m2)
+				{
+					return string.Compare(m1.Label, m2.Label);
+				});
 
-			//lang.get
+				dropDownTypes.Clear();
+				dropDownTypes.AddRange(list);
+
+				dropDownMembers.Clear();
+
+				_lastTimeStamp    = _source.TimeStamp;
+				_lastSelectedType = -2;
+			}
+
+			int selType = GetSelectedType(dropDownTypes, line, col);
+
+			if (_lastSelectedType != selType)
+			{
+				ret = true;
+
+				if (_lastSelectedType == -1)
+				{
+					foreach (DropDownMember m in dropDownTypes)
+						m.FontAttr &= ~DROPDOWNFONTATTR.FONTATTR_GRAY;
+				}
+				else if (selType == -1)
+				{
+					foreach (DropDownMember m in dropDownTypes)
+						m.FontAttr |= DROPDOWNFONTATTR.FONTATTR_GRAY;
+				}
+
+				_lastSelectedType   = selType;
+				_lastSelectedMember = -2;
+
+				if (selType >= 0)
+				{
+					selectedType = selType;
+
+					if (dropDownMembers.Count > 0)
+						dropDownMembers.Clear();
+
+					dropDownMembers.AddRange(((NemerleDropDownMember)dropDownTypes[selectedType]).Members);
+				}
+				else if (selectedType < 0)
+				{
+					selectedType = 0;
+
+					if (dropDownTypes.Count > 0)
+					{
+						if (dropDownMembers.Count > 0)
+							dropDownMembers.Clear();
+
+						dropDownMembers.AddRange(((NemerleDropDownMember)dropDownTypes[selectedType]).Members);
+					}
+				}
+			}
 
-			return true;
+			if (dropDownTypes.Count == 0)
+				return ret;
+
+			List<DropDownMember> members = ((NemerleDropDownMember)dropDownTypes[selectedType]).Members;
+
+			int selMember = selType < 0? -1: GetSelectedMember(members, line, col);
+
+			if (_lastSelectedMember != selMember)
+			{
+				ret = true;
+
+				if (_lastSelectedMember == -1)
+				{
+					foreach (DropDownMember m in members)
+						m.FontAttr &= ~DROPDOWNFONTATTR.FONTATTR_GRAY;
+				}
+				else if (selMember == -1)
+				{
+					foreach (DropDownMember m in members)
+						m.FontAttr |= DROPDOWNFONTATTR.FONTATTR_GRAY;
+				}
+
+				_lastSelectedMember = selMember;
+
+				if (selMember >= 0)
+					selectedMember = selMember;
+				else if (selectedMember < 0)
+					selectedMember = 0;
+			}
+
+			return ret;
+		}
+
+		private int GetSelectedMember(List<DropDownMember> members, int line, int col)
+		{
+			int idx = -1;
+
+			for (int i = 0; i < members.Count; i++)
+			{
+				DropDownMember m = members[i];
+
+				if (IsIn(m.Span, line, col))
+					idx = i;
+			}
+
+			return idx;
+		}
+
+		static int GetSelectedType(ArrayList types, int line, int col)
+		{
+			int idx = -1;
+
+			for (int i = 0; i < types.Count; i++)
+			{
+				DropDownMember m = (DropDownMember)types[i];
+
+				if (IsIn(m.Span, line, col))
+					idx = i;
+			}
+
+			return idx;
+		}
+
+		static bool IsIn(TextSpan span, int line, int col)
+		{
+			return
+				(line > span.iStartLine || line == span.iStartLine && col >= span.iStartIndex) &&
+				(line < span.iEndLine   || line == span.iEndLine   && col <= span.iEndIndex);
 		}
 	}
 }

Modified: vs-plugin/trunk/Nemerle.VsIntegration/Nemerle.VsIntegration.csproj
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/Nemerle.VsIntegration.csproj	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/Nemerle.VsIntegration.csproj	Mon Dec 11 06:36:47 2006
@@ -136,6 +136,7 @@
     <Compile Include="LanguageService\NemerleAuthoringSink.cs" />
     <Compile Include="LanguageService\NemerleColorableItem.cs" />
     <Compile Include="LanguageService\NemerleColorizer.cs" />
+    <Compile Include="LanguageService\NemerleDropDownMember.cs" />
     <Compile Include="LanguageService\NemerleLanguageService.cs" />
     <Compile Include="LanguageService\NemerleScanner.cs" />
     <Compile Include="LanguageService\NemerleSource.cs" />



More information about the svn mailing list