舊版語言服務中的比對括號
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
大括號比對,可協助開發人員追蹤需要一起發生,例如括號和大括號的語言項目。 當開發人員輸入右括號時,左括號會反白顯示。
您可以比對兩個或三個共同發生的項目,稱為組和三合一。 三合一是共同發生的三個元素的集合。 比方說,在 C# 中,foreach
陳述式構成 triple: 「foreach()
","{
」,和 「}
」。 輸入右括號時,會反白顯示三個項目。
舊版的語言服務會實作成,VSPackage 的一部分,但實作語言服務功能的較新的方法是使用 MEF 延伸模組。 若要了解有關實作括號對稱的新方法的詳細資訊,請參閱逐步解說︰ 顯示對稱的括號。
注意
我們建議您開始使用新的編輯器 API 儘速。 這會改善語言服務的效能,並可讓您充分利用新編輯器功能。
AuthoringSink類別支援配對,而且與 triples MatchPair和MatchTriple方法。
實作
語言服務需要識別在語言中的所有相符項目,然後找出所有配對成功。 這通常透過實作IScanner偵測相符的語言,然後將ParseSource方法來比對項目。
OnCommand方法呼叫來 token 化列,並傳回之前插入號的語彙基元的掃描程式。 掃描器表示語言項目組已找到的語彙基元的觸發程序將值設定為MatchBraces上目前的語彙基元。 OnCommand方法呼叫MatchBraces接著呼叫的方法BeginParse方法剖析原因值是MatchBraces來尋找相符的語言項目。 找到相符的語言項目時,會反白顯示兩個項目。
輸入一個大括號如何觸發,大括號反白顯示的完整說明,請參閱本主題的 「 範例剖析作業 」 一節舊版語言服務剖析器和掃描器。
啟用支援括號對稱
ProvideLanguageServiceAttribute屬性可以設定MatchBraces
, MatchBracesAtCaret
,和ShowMatchingBrace
具名參數所設定的對應屬性LanguagePreferences類別。 使用者也可以設定語言喜好設定的屬性。
登錄項目 | 屬性 | 描述 |
---|---|---|
MatchBraces |
EnableMatchBraces | 啟用括號對稱 |
MatchBracesAtCaret |
EnableMatchBracesAtCaret | 啟用插入號移比對括號。 |
ShowMatchingBrace |
EnableShowMatchingBrace | 反白顯示對稱的括號。 |
比對的條件陳述式
可以比對條件陳述式,例如if
, else if
,和else
,或#if
, #elif
, #else
, #endif
,做為分隔符號比對相同的方式。 您可以子類別AuthoringSink類別,並提供可以加入文字的方法,跨越以及內部陣列的相符項目分隔符號。
設定觸發程序
下列範例示範如何偵測到相符的括號、 大括號和方括號,以及掃描程式設定它的觸發程序。 OnCommand方法來源類別偵測到觸發程序,並呼叫剖析器來尋找相符的配對 (請參閱本主題的 「 尋找相符項目 」 一節)。 這個範例是僅供示範用途。 它會假設您的掃描器都包含一種方法GetNextToken
,識別,並傳回權杖,從一行文字。
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestScanner : IScanner
{
private const string braces = "()[]{}";
private Lexer lex;
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
ref int state)
{
bool foundToken = false;
string token = lex.GetNextToken();
if (token != null)
{
foundToken = true;
char firstChar = token[0];
if (Char.IsPunctuation(firstChar) && token.Length > 0)
{
if (braces.IndexOf(firstChar) != -1)
{
tokenInfo.Trigger = TokenTriggers.MatchBraces;
}
}
}
return foundToken;
}
比對大括號
以下是一個簡單的例子,相符的語言項目 {}、 () 和 [],並加入其範圍AuthoringSink物件。 此方法不是建議的方法來剖析程式碼。它是僅供示範用途。
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class Parser
{
private IList<TextSpan[]> m_braces;
public IList<TextSpan[]> Braces
{
get { return m_braces; }
}
private void AddMatchingBraces(TextSpan braceSpan1, TextSpan braceSpan2)
{
if IsMatch(braceSpan1, braceSpan2)
m_braces.Add(new TextSpan[] { braceSpan1, braceSpan2 });
}
private bool IsMatch(TextSpan braceSpan1, TextSpan braceSpan2)
{
//definition for matching here
}
}
public class TestLanguageService : LanguageService
{
Parser parser = new Parser();
Source source = (Source) this.GetSource(req.FileName);
private AuthoringScope ParseSource(ParseRequest req)
{
if (req.Sink.BraceMatching)
{
if (req.Reason==ParseReason.MatchBraces)
{
foreach (TextSpan[] brace in parser.Braces)
{
req.Sink.MatchPair(brace[0], brace[1], 1);
}
}
}
return new TestAuthoringScope();
}
}
}