読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

Visual Studio の拡張機能を作成する - シンタックスハイライト編

ということで、続きです。
今回は、 *.hsp;*.asシンタックスハイライトする機能を作成していきます。


シンタックスハイライトを行う方法には2種類あり、 Classifier を追加して、
独自の色を定義する方法と、Visual Studio 側の色設定を使用する方法があります。

今回は、特に独自の色設定を追加する必要もないので、後者の方法使用する方法で実装します。

ということで、早速実装。
前回作成した IScanner を実装したクラス(ここでは HSPScanner)を変更していきます。

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

namespace HSPToolsVS.Language
{
    internal class HSPScanner : IScanner
    {
        private readonly HSPLexer _lexer;
        private IVsTextBuffer _textBuffer;

        public HSPScanner(IVsTextBuffer textBuffer)
        {
            _textBuffer = textBuffer;
            _lexer = new HSPLexer();
        }

        public void SetSource(string source, int offset)
        {
            _lexer.SetCurLine(source, offset);
        }

        public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
        {
            var token = _lexer.GetNextToken(ref state);
            if (token == null)
                return false;
            tokenInfo.StartIndex = token.StartIndex;
            tokenInfo.EndIndex = token.EndIndex;
            tokenInfo.Type = token.Type.ToTokenType();
            tokenInfo.Color = token.Type.ToColor();
            tokenInfo.Token = (int) token.Type;
            return true;
        }
    }
}

ソース内にある HSPLexer は、行ベースの字句解析器です。
処理の流れとしては、まず初期オープン時には全文が、ファイル変更時には変更された行が
解析対象の文字列となり、 SetSource にて行ごとに文字列と offset が渡されます。
そして、解析結果を使用して ScanTokenAndProvideInfoAboutIt にて、範囲と色を設定します。

// また、 ScanTokenAndProvideInfoAboutIt にて false を返すと、対象が次の行へと移動します。

例えば以下の様なスクリプトの場合、

; Sample script
mes "Hello, HSP!"

; Sample Script がはじめに SetSource にて渡され、この行を解析し、
ScanTokenAndProvideInfoAboutIt にて結果を設定(この場合は全てコメントと設定)します。

ハイライト対象の色は、 Microsoft.VisualStudio.Package.TokenColor から設定します。
Text は通常テキスト、 Keywordusing などのキーワード...といった感じで、
必要な物はそろっています。

これで、シンタックスハイライトの実装は完了です。
Visual Studio 2015 Experimental Instance を起動し、 *.hsp なファイルを D&D させると、
エディタ上に、シンタックスハイライトされたテキストが表示されているはずです。

ということで、シンタックスハイライトの実装方法でした。
Classifier での実装方法だと、YamahaConfigClassifier や、 MS 公式サンプルが参考になります。