Ver código fonte

vslol: add the skeleton for a real LolFx syntax highlighter.

legacy
Sam Hocevar sam 12 anos atrás
pai
commit
b1ae294649
4 arquivos alterados com 228 adições e 50 exclusões
  1. +137
    -0
      tools/vslol/LolFxLanguageService.cs
  2. +11
    -38
      tools/vslol/MenuGenerateCompilers.cs
  3. +76
    -11
      tools/vslol/VsLol.cs
  4. +4
    -1
      tools/vslol/VsLol.csproj

+ 137
- 0
tools/vslol/LolFxLanguageService.cs Ver arquivo

@@ -0,0 +1,137 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
using Microsoft.VisualStudio.OLE.Interop;

namespace Lol.VisualStudio.Plugin
{
class LolFxLanguageService : LanguageService
{
public override string GetFormatFilterList()
{
throw new NotImplementedException();
}

public override LanguagePreferences GetLanguagePreferences()
{
if (m_preferences == null)
{
m_preferences = new LanguagePreferences(this.Site,
typeof(LolFxLanguageService).GUID, this.Name);
m_preferences.Init();
}
return m_preferences;
}

public override IScanner GetScanner(IVsTextLines buffer)
{
if (m_scanner == null)
{
m_scanner = new LolFxScanner(buffer);
}
return m_scanner;
}

public override string Name
{
get { return "LolFx"; }
}

public override AuthoringScope ParseSource(ParseRequest req)
{
return new LolFxAuthoringScope();
}

private LanguagePreferences m_preferences;
private LolFxScanner m_scanner;

internal class LolFxScanner : IScanner
{
public LolFxScanner(IVsTextBuffer buffer)
{
m_buffer = buffer;
}

bool IScanner.ScanTokenAndProvideInfoAboutIt(TokenInfo tokeninfo, ref int state)
{
while (m_offset < m_source.Length)
{
if (m_source[m_offset] == ' ' || m_source[m_offset] == '\t')
{
++m_offset;
continue;
}

tokeninfo.StartIndex = m_offset;
tokeninfo.EndIndex = m_offset;
tokeninfo.Type = TokenType.Unknown;
switch (state % 4)
{
case 0: tokeninfo.Color = TokenColor.Number; break;
case 1: tokeninfo.Color = TokenColor.Text; break;
case 2: tokeninfo.Color = TokenColor.Keyword; break;
case 3: tokeninfo.Color = TokenColor.Comment; break;
}
++m_offset;
++state;
return true;
}

return false;
}

enum State
{
Default,
CComment,
CppComment,
String,
}

void IScanner.SetSource(string source, int offset)
{
m_source = source;
m_offset = offset;
}

private IVsTextBuffer m_buffer;
string m_source;
int m_offset;
}

internal class LolFxAuthoringScope : AuthoringScope
{
public override string GetDataTipText(int line, int col, out TextSpan span)
{
span = new TextSpan();
return null;
}

public override Declarations GetDeclarations(IVsTextView view,
int line,
int col,
TokenInfo info,
ParseReason reason)
{
return null;
}

public override string Goto(VSConstants.VSStd97CmdID cmd, IVsTextView textView, int line, int col, out TextSpan span)
{
span = new TextSpan();
return null;
}

public override Methods GetMethods(int line, int col, string name)
{
return null;
}
}
}
}


+ 11
- 38
tools/vslol/MenuGenerateCompilers.cs Ver arquivo

@@ -91,14 +91,14 @@ namespace Lol.VisualStudio.Plugin
if (cmd == null)
return;

cmd.ClearOutputPane();
cmd.WriteToOutputPane("------ Build started: Generating Compilers ------\n");
Logger.Clear();
Logger.Info("------ Build started: Generating Compilers ------\n");

int scanner_count = 0, parser_count = 0, error_count = 0;

foreach (Project project in cmd.projects)
{
cmd.WriteToOutputPane("Project " + project.Name + "\n");
Logger.Info("Project " + project.Name + "\n");

string project_path = Path.GetDirectoryName(project.FullName);

@@ -137,7 +137,7 @@ namespace Lol.VisualStudio.Plugin

if (item.Name.EndsWith("-scanner.l"))
{
cmd.WriteToOutputPane("flex.exe " + filename + "\n");
Logger.Info("flex.exe " + filename + "\n");

string basename = Path.GetFileName(filename.Substring(0, filename.LastIndexOf("-scanner.l")));
if (!cmd.Run(project_path,
@@ -153,7 +153,7 @@ namespace Lol.VisualStudio.Plugin

if (item.Name.EndsWith("-parser.y"))
{
cmd.WriteToOutputPane("bison.exe " + filename + "\n");
Logger.Info("bison.exe " + filename + "\n");

string basename = Path.GetFileName(filename.Substring(0, filename.LastIndexOf("-parser.y")));
if (!cmd.Run(project_path,
@@ -173,7 +173,7 @@ namespace Lol.VisualStudio.Plugin
}
}

cmd.WriteToOutputPane(string.Format("========== Done: {0} scanner(s), {1} parser(s), {2} error(s) ==========\n",
Logger.Info(string.Format("========== Done: {0} scanner(s), {1} parser(s), {2} error(s) ==========\n",
scanner_count, parser_count, error_count));
}

@@ -202,52 +202,26 @@ namespace Lol.VisualStudio.Plugin
string output = p.StandardError.ReadToEnd()
+ p.StandardOutput.ReadToEnd();
p.WaitForExit();
WriteToOutputPane(output);
Logger.Info(output);
if (p.ExitCode != 0)
{
WriteToOutputPane("Error: " + executable + " exited with code " + p.ExitCode + "\n");
Logger.Info("Error: " + executable + " exited with code " + p.ExitCode + "\n");
if (arguments != "")
WriteToOutputPane("Error: args: " + arguments + "\n");
Logger.Info("Error: args: " + arguments + "\n");
if (env != "")
WriteToOutputPane("Error: env: " + env + "\n");
Logger.Info("Error: env: " + env + "\n");
return false;
}
}
catch (Exception e)
{
WriteToOutputPane("Error: failed to launch " + executable + "\n");
Logger.Info("Error: failed to launch " + executable + "\n");
return false;
}

return true;
}

private void ClearOutputPane()
{
IVsOutputWindow win = sp.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
if (null == win)
{
Trace.WriteLine("Failed to get a reference to IVsOutputWindow");
pane = null;
}

Guid guid = Microsoft.VisualStudio.VSConstants.OutputWindowPaneGuid.BuildOutputPane_guid;
if (Microsoft.VisualStudio.ErrorHandler.Failed(win.GetPane(ref guid, out pane)))
{
Trace.WriteLine("Failed to get a reference to the Output window Build pane");
pane = null;
}

pane.Activate();
pane.Clear();
}

private void WriteToOutputPane(string s)
{
if (pane != null)
pane.OutputString(s);
}

private static IEnumerable<ProjectItem> ParseProjectItems(object o)
{
ProjectItems subitems;
@@ -267,7 +241,6 @@ namespace Lol.VisualStudio.Plugin
}

private ServiceProvider sp;
private IVsOutputWindowPane pane;

private List<Project> projects;
}


+ 76
- 11
tools/vslol/VsLol.cs Ver arquivo

@@ -13,11 +13,26 @@ namespace Lol.VisualStudio.Plugin
{
[PackageRegistration(UseManagedResourcesOnly = true)]

/* LolFx syntax highlighting */
[ProvideServiceAttribute(typeof(LolFxLanguageService),
ServiceName = "LolFx Service")]
[ProvideLanguageServiceAttribute(typeof(LolFxLanguageService),
"LolFx", 106 /* resource ID */,
CodeSense = true,
RequestStockColors = true,
EnableCommenting = true,
EnableAsyncCompletion = true)]
[ProvideLanguageExtensionAttribute(typeof(LolFxLanguageService),
".lolfx")]

[ProvideMenuResource(1000, 1)]
[Guid("f96f7ac5-16ac-4061-8b92-0a02bb455ae9")]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[ComVisible(true)]
[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")] // This is needed for the package to be autoloaded

/* Autoload package */
[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")]

public sealed class PluginPackage : Package
{
public PluginPackage()
@@ -32,23 +47,74 @@ namespace Lol.VisualStudio.Plugin
Trace.WriteLine(String.Format(CultureInfo.CurrentUICulture, "Entering Initialize() of: {0}", this.ToString()));
base.Initialize();

// Ensure the "Build" output pane exists
IVsOutputWindow outputWindow = GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
if (null != outputWindow)
{
Guid guidBuild = Microsoft.VisualStudio.VSConstants.OutputWindowPaneGuid.BuildOutputPane_guid;
outputWindow.CreatePane(guidBuild, "Build", 1, 0);
}
Logger.Initialize(GetService(typeof(SVsOutputWindow)) as IVsOutputWindow);

// Register the "Generate Compilers" context menu
/* Register the "Generate Compilers" context menu */
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (null != mcs)
{
CommandID id = new CommandID(GuidsList.guidVsLolCmdSet, VsLolIDList.cmdidGenerateCompilers);
CommandID id = new CommandID(GuidsList.guidVsLolCmdSet,
VsLolIDList.cmdidGenerateCompilers);
OleMenuCommand command = new MenuGenerateCompilers(new ServiceProvider((IOleServiceProvider)this.GetService(typeof(IOleServiceProvider))), id);
mcs.AddCommand(command);
}

/* Register the LolFx language service */
IServiceContainer serviceContainer = this as IServiceContainer;
LolFxLanguageService lolfxserv = new LolFxLanguageService();
lolfxserv.SetSite(this);
serviceContainer.AddService(typeof(LolFxLanguageService),
lolfxserv, true);
}

}

internal static class Logger
{
public static void Initialize(IVsOutputWindow window)
{
m_window = window;

OpenBuildPane();

if (m_pane == null)
Trace.WriteLine("Failed to get a reference to the Output window Build pane");
}

private static void OpenBuildPane()
{
/* Ensure the "Build" output pane exists */
if (m_window != null)
{
Guid guidBuild = Microsoft.VisualStudio.VSConstants.OutputWindowPaneGuid.BuildOutputPane_guid;
m_window.CreatePane(guidBuild, "Build", 1, 0);

if (Microsoft.VisualStudio.ErrorHandler.Failed(m_window.GetPane(ref guidBuild, out m_pane)))
m_pane = null;
}
}

public static void Clear()
{
OpenBuildPane();

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

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

if (m_pane != null)
m_pane.OutputString(s);
}

private static IVsOutputWindow m_window = null;
private static IVsOutputWindowPane m_pane = null;
}

internal static class GuidsList
@@ -70,4 +136,3 @@ namespace Lol.VisualStudio.Plugin
public const int cmdidUnused2 = 0x2003;
}
}


+ 4
- 1
tools/vslol/VsLol.csproj Ver arquivo

@@ -55,6 +55,7 @@
</Reference>
<Reference Include="Microsoft.CSharp" />
<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" />
@@ -64,6 +65,7 @@
<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="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
@@ -73,6 +75,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="LolFxLanguageService.cs" />
<Compile Include="MenuGenerateCompilers.cs" />
<Compile Include="GlobalSuppressions.cs" />
<Compile Include="VsLol.Designer.cs">
@@ -154,4 +157,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

Carregando…
Cancelar
Salvar