[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