ソースを参照

vslol: add a classifier for C, C++, C# and LolFx files. Only classifies

using a naive regex for now.
legacy
Sam Hocevar sam 12年前
コミット
dc6c98c579
5個のファイルの変更149行の追加9行の削除
  1. +115
    -0
      tools/vslol/CppKeywordClassifier.cs
  2. +2
    -2
      tools/vslol/Properties/AssemblyInfo.cs
  3. +18
    -5
      tools/vslol/VsLol.cs
  4. +12
    -1
      tools/vslol/VsLol.csproj
  5. +2
    -1
      tools/vslol/source.extension.vsixmanifest

+ 115
- 0
tools/vslol/CppKeywordClassifier.cs ファイルの表示

@@ -0,0 +1,115 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Windows.Media;
using System.Text.RegularExpressions;

using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Language.StandardClassification;
using Microsoft.VisualStudio.Utilities;

namespace Lol.VisualStudio.Plugin
{
[Export(typeof(IClassifierProvider))]
[ContentType("c/c++")]
[ContentType("csharp")]
[ContentType("lolfx")]
internal class LolClassifierProvider : IClassifierProvider
{
[Import]
internal IClassificationTypeRegistryService m_class_registry = null; /* Set via MEF */

//[Import]
//internal IClassificationFormatMapService m_lol = null;

public IClassifier GetClassifier(ITextBuffer buffer)
{
//var test = m_lol.GetClassificationFormatMap("Text Editor");
//string[] foo = { "Comment", "Keyword", "C/C++ User Keywords", "Call Return", "HTML Comment" };
//foreach (var s in foo)
//{
// var type = m_class_registry.GetClassificationType(s);
// if (type == null)
// continue;
// var prop = test.GetExplicitTextProperties(type);
// if (prop == null)
// continue;
// var c1 = prop.ForegroundBrush as SolidColorBrush;
// var c2 = prop.BackgroundBrush as SolidColorBrush;
// Logger.Info("[" + s + "]: " + c1.ToString() + " " + c2.ToString() + "\n");
//}

return buffer.Properties.GetOrCreateSingletonProperty<CppKeywordClassifier>(delegate { return new CppKeywordClassifier(m_class_registry, buffer.ContentType); });
}
}

class CppKeywordClassifier : IClassifier
{
private IClassificationType m_customclass_type;
private Regex m_regex;

internal CppKeywordClassifier(IClassificationTypeRegistryService registry,
IContentType type)
{
m_customclass_type = registry.GetClassificationType("LolCustomClass");

string tmp = @"\b(";
tmp += "void|int|unsigned|char|short|long|float|double|";
tmp += "class|struct|template|const|static|volatile|inline|namespace|";
if (type.IsOfType("lolfx"))
tmp += "attribute|varying|uniform|in|out|";
if (type.IsOfType("csharp"))
tmp += "var|string|internal|sealed|public|private|";
if (!type.IsOfType("csharp"))
tmp += "vec2|vec3|vec4|quat|mat2|mat3|mat4|";
if (type.IsOfType("c/c++"))
tmp += "real|half|";
tmp += @")\b";
m_regex = new Regex(tmp);
}

public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
{
List<ClassificationSpan> ret = new List<ClassificationSpan>();

string tmp = span.GetText();
var matches = m_regex.Matches(tmp);
foreach (Match m in matches)
{
Span newspan = new Span(span.Start.Position + m.Index, m.Length);
SnapshotSpan newsnapshot = new SnapshotSpan(span.Snapshot, newspan);
ret.Add(new ClassificationSpan(newsnapshot, m_customclass_type));
}

return ret;
}

public event EventHandler<ClassificationChangedEventArgs> ClassificationChanged;
}

internal static class LolClassifierClassificationDefinition
{
[Export(typeof(ClassificationTypeDefinition))]
[Name(LolCppTypeFormat.m_name)]
internal static ClassificationTypeDefinition LolCustomClassType = null;
}

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = LolCppTypeFormat.m_name)]
[Name(LolCppTypeFormat.m_name)]
[UserVisible(true)]
[Order(After = Priority.Default)] /* Override the Visual Studio classifiers */
internal sealed class LolCppTypeFormat : ClassificationFormatDefinition
{
public const string m_name = "LolCustomClass";
public LolCppTypeFormat()
{
this.DisplayName = "C/C++ Types and Qualifiers";
//this.BackgroundColor = Colors.BlueViolet;
this.ForegroundColor = Colors.Lime;
this.IsBold = true;
//this.TextDecorations = System.Windows.TextDecorations.Underline;
}
}
}

tools/vslol/AssemblyInfo.cs → tools/vslol/Properties/AssemblyInfo.cs ファイルの表示

@@ -20,5 +20,5 @@ using System.Runtime.InteropServices;
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("58968f91-edb8-4a4c-9f4f-ba39fdb4a21a")]

[assembly: AssemblyVersion("1.0.0.3")]
[assembly: AssemblyFileVersion("1.0.0.3")]
[assembly: AssemblyVersion("1.0.0.4")]
[assembly: AssemblyFileVersion("1.0.0.4")]

+ 18
- 5
tools/vslol/VsLol.cs ファイルの表示

@@ -92,29 +92,42 @@ namespace Lol.VisualStudio.Plugin
if (Microsoft.VisualStudio.ErrorHandler.Failed(m_window.GetPane(ref guidBuild, out m_pane)))
m_pane = null;
}

if (m_pane != null)
m_pane.Activate();
}

public static void Clear()
{
OpenBuildPane();

if (m_pane != null)
if (m_pane == null)
{
m_pane.Activate();
m_pane.Clear();
m_backlog = "";
return;
}

m_pane.Clear();
}

public static void Info(string s)
{
OpenBuildPane();

if (m_pane != null)
m_pane.OutputString(s);
if (m_pane == null)
{
m_backlog += s;
return;
}

m_pane.OutputString(m_backlog);
m_backlog = "";
m_pane.OutputString(s);
}

private static IVsOutputWindow m_window = null;
private static IVsOutputWindowPane m_pane = null;
private static string m_backlog = "";
}

internal static class GuidsList


+ 12
- 1
tools/vslol/VsLol.csproj ファイルの表示

@@ -54,27 +54,38 @@
<HintPath>..\..\..\..\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\PublicAssemblies\envdte.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.VisualStudio.ComponentModelHost, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.CoreUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.Language.StandardClassification, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.OLE.Interop" />
<Reference Include="Microsoft.VisualStudio.Package.LanguageService.10.0, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.Shell.Interop" />
<Reference Include="Microsoft.VisualStudio.Shell.Interop.8.0" />
<Reference Include="Microsoft.VisualStudio.Shell.Interop.9.0" />
<Reference Include="Microsoft.VisualStudio.Shell.Interop.10.0" />
<Reference Include="Microsoft.VisualStudio.Text.Data, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.Text.Logic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.Text.UI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.Text.UI.Wpf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.VisualStudio.TextManager.Interop" />
<Reference Include="Microsoft.VisualStudio.Shell.10.0">
<Private>false</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.Shell.Immutable.10.0" />
<Reference Include="Microsoft.VisualStudio.TextManager.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<Reference Include="PresentationCore" />
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="CppKeywordClassifier.cs" />
<Compile Include="LolFxLanguageService.cs" />
<Compile Include="MenuGenerateCompilers.cs" />
<Compile Include="GlobalSuppressions.cs" />
@@ -84,7 +95,7 @@
<DependentUpon>VsLol.resx</DependentUpon>
</Compile>
<Compile Include="VsLol.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<VSCTCompile Include="VsLol.vsct">


+ 2
- 1
tools/vslol/source.extension.vsixmanifest ファイルの表示

@@ -3,7 +3,7 @@
<Identifier Id="VsLol.Sample">
<Name>VsLol</Name>
<Author>Lol</Author>
<Version>1.0.0.3</Version>
<Version>1.0.0.4</Version>
<Description xml:space="preserve">Lol Engine Productivity Tools.</Description>
<Locale>1033</Locale>
<MoreInfoUrl>http://lol.zoy.org/</MoreInfoUrl>
@@ -21,5 +21,6 @@
<References />
<Content>
<VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage>
<MefComponent>|%CurrentProject%|</MefComponent>
</Content>
</Vsix>

読み込み中…
キャンセル
保存