[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