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

IT svnadmin at nemerle.org
Sat Jan 6 00:18:01 CET 2007


Log:
Changed navigation dropdown population logic to use TopDeclarations.

Author: IT
Date: Sat Jan  6 00:17:56 2007
New Revision: 7219

Modified:
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.n
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Debug/AstUtils.n
   vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Init.n
   vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs
   vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleTypeAndMemberDropdownBars .cs

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	Sat Jan  6 00:17:56 2007
@@ -303,6 +303,15 @@
       l
     }
 
+    public GetTopDeclarations(code : string, fileIndex : int) : list[TopDeclaration]
+    {
+      def lex = LexerString(Engine, code, Location(fileIndex, 1, 1));
+
+      lex.Keywords = lex.Manager.CoreEnv.Keywords;
+
+      MainParser.Parse(lex);
+    }
+
     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/Debug/AstUtils.n
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Debug/AstUtils.n	(original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Debug/AstUtils.n	Sat Jan  6 00:17:56 2007
@@ -1,14 +1,15 @@
+using System;
 using System.Diagnostics;
 using System.Reflection;
+
 using Nemerle.Assertions;
 using Nemerle.Compiler;
 using Nemerle.Completion2;
 using Nemerle.Utility;
 using Nemerle.Compiler.Parsetree;
-//using Nemerle.Compiler.Typedtree;
-using TExpr = Nemerle.Compiler.Typedtree.TExpr;
+
 using SCG   = System.Collections.Generic;
-using System.Collections.ArrayList;
+using TExpr = Nemerle.Compiler.Typedtree.TExpr;
 
 namespace Nemerle.Compiler.Utils
 {
@@ -105,5 +106,73 @@
 
       scan(rootNamespase, "");
     }
+
+    public GetAllDeclarations(lst : list[TopDeclaration]) : list[string * TopDeclaration]
+    {
+      mutable result = [];
+
+      def checkDecl(parentName, decl : TopDeclaration) 
+      {
+        def name = parentName + decl.Name + ".";
+
+        def checkMember(member : ClassMember) 
+        {
+        | TypeDeclaration(td) => checkDecl(name, td);
+        | _                   => ();
+        }
+
+        match (decl)
+        {
+        | Alias                => ();
+        | Delegate
+        | Enum
+        | Interface
+        | Macro                => result ::= (parentName, decl);
+        | Class     (_, decls)
+        | Variant   (_, decls)
+        | VariantOption(decls) => result ::= (parentName, decl); decls.Iter(checkMember);
+        }
+      }
+
+      foreach (top in lst)
+        checkDecl("", top);
+
+      result;
+    }
+
+    public GetMembers(decl : TopDeclaration) : list[ClassMember]
+    {
+      mutable result = [];
+
+      def checkMember(mem : ClassMember) 
+      {
+      | Event
+      | Field
+      | Function
+      | Property => result ::= mem;
+      | _        => ();
+      }
+
+      match (decl)
+      {
+      | Class     (_, decls)
+      | Variant   (_, decls)
+      | VariantOption(decls) => decls.Iter(checkMember);
+      | _                    => ();
+      }
+
+      result;
+    }
+
+    public GetMemberLabel(mem : ClassMember) : string
+    {
+    | Field(Wildcard)           => mem.Name;
+    | Field(ty)
+    | Event(ty, _, _, _)
+    | Property(ty, _, [], _, _) => $"$(mem.Name) : $ty";
+    | Property(ty, _, ps, _, _) => $"$(mem.Name)$ps : $ty";
+    | Function(hdr, _, _)       => hdr.ToString()
+    | _                         => mem.Name;
+    }
 	}
 }

Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Init.n
==============================================================================

Modified: vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs	(original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/LanguageService/NemerleDropDownMember.cs	Sat Jan  6 00:17:56 2007
@@ -7,127 +7,135 @@
 using Nemerle.Core;
 using Nemerle.Compiler;
 using Nemerle.Compiler.Typedtree;
+using Nemerle.Compiler.Parsetree;
 
 using Nemerle.Completion2;
+using Nemerle.Compiler.Utils;
 
 namespace Nemerle.VisualStudio.LanguageService
 {
 	class NemerleDropDownMember : DropDownMember
 	{
-		public NemerleDropDownMember(
-			TypeBuilder tb, int fileIndex, string label, TextSpan span, int glyph, DROPDOWNFONTATTR fontAttribute)
-			: base(label, span, glyph, fontAttribute)
+		public NemerleDropDownMember(string parentName, TopDeclaration decl)
+			: base(GetLabel(parentName, decl), Convert(decl.Location), GetGlyph(decl), GetAttr(decl))
 		{
-			_typeBuilder = tb;
-			_fileIndex   = fileIndex;
+			_decl = decl;
 		}
 
-		TypeBuilder _typeBuilder;
-		int         _fileIndex;
+		TopDeclaration _decl;
 
-		private List<DropDownMember> _members;
-		public  List<DropDownMember>  Members
-		{
-			get
+		static string GetLabel(string parentName, TopDeclaration decl)
 			{
-				if (_members == null)
-				{
-					_members = new List<DropDownMember>();
+			string label = "";
 
-					if (_typeBuilder.LookupMemberAvailable)
-					{
-						foreach (IMember m in _typeBuilder.GetMembers())
-							if (m.Location.FileIndex == _fileIndex && !m.Location.IsGenerated && !(m is TypeInfo))
-								_members.Add(CreateMember(m));
+			foreach (string s in decl.name.GetName().context.CurrentNamespace.FullName)
+				label += s + '.';
 
-						_members.Sort(delegate(DropDownMember m1, DropDownMember m2)
-						{
-							// Sort by name (like in C#).
-							return string.Compare(m1.Label, m2.Label);
-						});
-					}
-				}
+			if (!string.IsNullOrEmpty(parentName))
+				label += parentName + '.';
 
-				return _members;
+			label += decl.Name;
+
+			return label;
 			}
+
+		static TextSpan Convert(Location loc)
+		{
+			TextSpan span = new TextSpan();
+
+			span.iStartLine  = loc.Line - 1;
+			span.iStartIndex = loc.Column - 1;
+			span.iEndLine    = loc.EndLine - 1;
+			span.iEndIndex   = loc.EndColumn - 1;
+
+			return span;
 		}
 
-		public static DROPDOWNFONTATTR GetAttr(TypeBuilder builder)
+		static bool Has(NemerleAttributes attrs, NemerleAttributes value)
 		{
-			return
-				builder.IsVariantOption? DROPDOWNFONTATTR.FONTATTR_ITALIC:
-				                         DROPDOWNFONTATTR.FONTATTR_PLAIN;
+			return (attrs & value) == value;
 		}
 
-		public static int GetGlyph(TypeBuilder builder)
+		static int GetGlyph(TopDeclaration decl)
 		{
+			NemerleAttributes attrs = decl.Attributes;
+
 			GlyphType kind = 
-				builder.IsDelegate?       GlyphType.Delegate:
-				builder.IsEnum?           GlyphType.Enum:
-				builder.IsInterface?      GlyphType.Interface:
-				builder.IsVariantOption?  GlyphType.VariantOption:
-				builder.IsStruct?         GlyphType.Struct:
+				decl is TopDeclaration.Delegate?      GlyphType.Delegate:
+				decl is TopDeclaration.Enum?          GlyphType.Enum:
+				decl is TopDeclaration.Interface?     GlyphType.Interface:
+				decl is TopDeclaration.Macro?         GlyphType.Macro:
+				decl is TopDeclaration.Variant?       GlyphType.Variant:
+				decl is TopDeclaration.VariantOption? GlyphType.VariantOption:
+				Has(attrs, NemerleAttributes.Struct)? GlyphType.Struct:
 				GlyphType.Class;
 
 			GlyphSubtype modifier = 
-				builder.IsInternal && builder.IsProtected? 
+				Has(attrs, NemerleAttributes.Internal | NemerleAttributes.Protected)? 
 				                     GlyphSubtype.ProtectedInternal:
-				builder.IsInternal?  GlyphSubtype.Internal:
-				builder.IsProtected? GlyphSubtype.Protected:
-				builder.IsPrivate?   GlyphSubtype.Private:
-				GlyphSubtype.Public;
+				Has(attrs, NemerleAttributes.Internal)?  GlyphSubtype.Internal:
+				Has(attrs, NemerleAttributes.Protected)? GlyphSubtype.Protected:
+				Has(attrs, NemerleAttributes.Public)?    GlyphSubtype.Public:
+				                                         GlyphSubtype.Private;
 
 			return (int)kind | (int)modifier;
 		}
 
-		private static DropDownMember CreateMember(IMember member)
+		public static DROPDOWNFONTATTR GetAttr(TopDeclaration decl)
 		{
-			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);
+			return decl is TopDeclaration.VariantOption?
+				DROPDOWNFONTATTR.FONTATTR_ITALIC:
+				DROPDOWNFONTATTR.FONTATTR_PLAIN;
+		}
 
-			if (label[0] == '`')
-				label = label.Substring(1, label.Length - 2);
+		private List<DropDownMember> _members;
+		public  List<DropDownMember>  Members
+		{
+			get
+			{
+				if (_members == null)
+				{
+					_members = new List<DropDownMember>();
 
-			label = label.Replace(member.DeclaringType.FullName + '.', "");
+					foreach (ClassMember m in AstUtils.GetMembers(_decl))
+						_members.Add(CreateMember(m));
 
-			if (member is IField)
+					_members.Sort(delegate(DropDownMember m1, DropDownMember m2)
 			{
-				kind = 7;
+						int glyph = m1.Glyph / 6 - m2.Glyph / 6;
 
-				FieldBuilder fb = member as FieldBuilder;
+						if (glyph != 0)
+							return glyph;
 
-				if (fb != null)
-					label += " : " + fb.GetMemType().ToString();
+						// Sort by name (like in C#).
+						return string.Compare(m1.Label, m2.Label);
+					});
 			}
-			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;
+				return _members;
+			}
+		}
 
-			if (mi != null)
+		private static DropDownMember CreateMember(ClassMember member)
 			{
+			string           label    = AstUtils.GetMemberLabel(member);
+			DROPDOWNFONTATTR attr     = DROPDOWNFONTATTR.FONTATTR_PLAIN;
+			TextSpan         span     = Convert(member.Location);
+			int              kind     = 0;
+			int              modifier = 0;
+
+			if      (member is ClassMember.Field)    kind = 7;
+			else if (member is ClassMember.Property) kind = 17;
+			else if (member is ClassMember.Function) kind = 12;
+			else if (member is ClassMember.Event)    kind = 5;
+
+			NemerleAttributes attrs = member.Attributes;
+
 				modifier = 
-					mi.IsInternal?  1:
-					mi.IsProtected? 3:
-					mi.IsPrivate?   4:
-					0;
-			}
+				Has(attrs, NemerleAttributes.Internal)?  1:
+				Has(attrs, NemerleAttributes.Protected)? 3:
+				Has(attrs, NemerleAttributes.Public)?    0:
+				                                         4;
 
 			return new DropDownMember(label, span, kind * 6 + modifier, attr);
 		}

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	Sat Jan  6 00:17:56 2007
@@ -9,6 +9,9 @@
 using Nemerle.Completion2;
 
 using VsPkg = Microsoft.VisualStudio.Package;
+using Nemerle.Compiler.Parsetree;
+using Nemerle.Compiler.Utils;
+using Nemerle.Builtins;
 
 namespace Nemerle.VisualStudio.LanguageService
 {
@@ -44,39 +47,15 @@
 			{
 				ret = true;
 
-				//VladD2:  Ýòà ñòðîêà ïðèâîäèò ê ïåðåïàðñèâàíèþ âñåãî ÀÑÒ. Ìîæåò çäåñü ëó÷øå 
-				// èñïîüçîâàòü RawProject?
-				List<TypeBuilder> builders = _source.ProjectInfo.Project.GetTypes(_source.FileIndex);
-
 				List<NemerleDropDownMember> list = new List<NemerleDropDownMember>();
 
-				foreach (TypeBuilder tb in builders)
-				{
-					string label = tb.ToString();
+#pragma warning disable 618
+				IEnumerable decls = AstUtils.GetAllDeclarations(
+					_source.ProjectInfo.Engine.RawProject.GetTopDeclarations(_source.GetText(), _source.FileIndex));
+#pragma warning restore 618
 
-					foreach (Location loc in tb.PartsLocation)
-					{
-						if (loc.FileIndex == _source.FileIndex)
-						{
-							TextSpan span = new TextSpan();
-
-							span.iStartLine  = loc.Line - 1;
-							span.iStartIndex = loc.Column - 1;
-							span.iEndLine    = loc.EndLine - 1;
-							span.iEndIndex   = loc.EndColumn - 1;
-
-							//VladD2: Ìíå êàæåòñÿ ÷òî NemerleDropDownMember ñîâåðøåííî íåíóæåí.
-							// âìåñòî íåãî õîðîøî áû ïðîñòî êëàñòü ýëåìåíò AST. Ýòî ñýêîíîìèëî áû âðåìÿ.
-							list.Add(new NemerleDropDownMember(
-								tb,
-								_source.FileIndex,
-								label,
-								span,
-								NemerleDropDownMember.GetGlyph(tb),
-								NemerleDropDownMember.GetAttr(tb)));
-						}
-					}
-				}
+				foreach (Tuple<string,TopDeclaration> decl in decls)
+					list.Add(new NemerleDropDownMember(decl.field0, decl.field1));
 
 				list.Sort(delegate(NemerleDropDownMember m1, NemerleDropDownMember m2)
 				{



More information about the svn mailing list