括号匹配 (托管包结构)

大括号匹配的帮助需要一起发生的开发人员跟踪语言元素,如圆括号和大括号。 当开发人员输入一个右大括号时,左大括号显示。

可以匹配两个或三个公共生成的元素,调用对和成三倍。 三个是一组三个公共结果元素。 例如,在 c# 中, foreach 语句来形成三个:“foreach()”, “{”和 “}”。 ,用于在右大括号中键入时,所有三个元素都显示。

AuthoringSink 类支持两个对并为三个为一组与 MatchPairMatchTriple 方法。

实现

语言服务需要标识语言的所有匹配的元素然后找到所有相对。 这是通过实现 IScanner 检测一个匹配的语言使用 ParseSource 方法然后与组件通常完成。

OnCommand 方法调用扫描仪 tokenize 行并返回脱字号前面的标记。 扫描仪指示对设置 MatchBraces 中的一个标记触发器值找到语言元素在当前标记的。 OnCommand 方法调用又调用与 MatchBraces 的分析原因值的 BeginParse 方法设置匹配的语言元素的 MatchBraces 方法。 如果找到匹配时的语言元素,两个元素显示。

有关完整说明键入大括号如何触发显示该的大括号,请参见主题中 语言服务分析器和扫描仪 (托管包结构)的 “示例分析操作”一节。

启用对括号匹配支持

ProvideLanguageServiceAttribute 属性可以设置 MatchBraces、名为设置 LanguagePreferences 类的相应属性的参数该 MatchBracesAtCaret和 ShowMatchingBrace 。 语言首选项属性可以由用户可以设置。

注册表项

属性

说明

MatchBraces

EnableMatchBraces

启用括号匹配

MatchBracesAtCaret

EnableMatchBracesAtCaret

,在插入符号移动,启用匹配的大括号。

ShowMatchingBrace

EnableShowMatchingBrace

显示匹配的大括号。

匹配的条件语句

您可以按照与匹配分隔符的方式与条件语句,如 if、 else if和 else或 #if, #elif, #else, #endif,。 可以子类 AuthoringSink 类并提供可添加文本范围以及分隔符到内部一些匹配的元素的方法。

设置触发器

下面的示例演示如何检测匹配的括号、大括号和方形大括号和设置它的触发器在扫描仪。 在 Source 类的 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(c) != -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();
         }
    }
}

请参见

概念

语言服务分析器和扫描仪 (托管包结构)

其他资源

语言服务功能 (托管包结构)