示例#1
0
        public bool GetMatchingBraceType(char ch, out BraceType braceType, out bool reversed)
        {
            braceType = BraceType.Unknown;
            reversed  = false;

            switch (ch)
            {
            case '{':
            case '}':
                braceType = BraceType.Curly;
                reversed  = ch == '}';
                break;

            case '(':
            case ')':
                braceType = BraceType.Parenthesis;
                reversed  = ch == ')';
                break;

            case '[':
            case ']':
                braceType = BraceType.Square;
                reversed  = ch == ']';
                break;
            }

            if (braceType != BraceType.Unknown && !IsSupportedBraceType(braceType))
            {
                braceType = BraceType.Unknown;
                reversed  = false;
            }

            return(braceType != BraceType.Unknown);
        }
示例#2
0
        private BraceInfo GetBraceInfo(int position)
        {
            BraceType braceType = BraceType.Parenthesis;
            bool      openBrace = false;

            switch ((char)_scintillaControl.GetCharAt(position))
            {
            case '(':
                braceType = BraceType.Parenthesis;
                openBrace = true;
                break;

            case ')':
                braceType = BraceType.Parenthesis;
                openBrace = false;
                break;

            case '[':
                braceType = BraceType.Bracket;
                openBrace = true;
                break;

            case ']':
                braceType = BraceType.Bracket;
                openBrace = false;
                break;

            case '{':
                braceType = BraceType.CurlyBrace;
                openBrace = true;
                break;

            case '}':
                braceType = BraceType.CurlyBrace;
                openBrace = false;
                break;

            case '<':
                braceType = BraceType.LessGreater;
                openBrace = true;
                break;

            case '>':
                braceType = BraceType.LessGreater;
                openBrace = false;
                break;

            default:
                return(null);
            }
            return(new BraceInfo {
                BraceType = braceType, OpenBrace = openBrace, Position = position
            });
        }
示例#3
0
        public bool GetBracesFromPosition(ITextSnapshot snapshot, int currentPosition, bool extendSelection, out int startPosition, out int endPosition)
        {
            startPosition = 0;
            endPosition   = 0;

            if (snapshot != TextBuffer.CurrentSnapshot || snapshot.Length == 0)
            {
                return(false);
            }

            BraceType braceType = BraceType.Unknown;

            char ch             = '\0';
            bool validCharacter = false;
            int  searchPosition = currentPosition;
            bool reversed       = false;

            if (currentPosition < snapshot.Length)
            {
                ch             = snapshot[currentPosition];
                validCharacter = GetMatchingBraceType(ch, out braceType, out reversed);
            }

            if (!validCharacter && currentPosition > 0)
            {
                ch             = snapshot[currentPosition - 1];
                validCharacter = GetMatchingBraceType(ch, out braceType, out reversed);
                searchPosition--;
            }

            if (!validCharacter)
            {
                return(false);
            }

            return(GetLanguageBracesFromPosition(braceType, searchPosition, reversed, out startPosition, out endPosition));
        }
示例#4
0
        public virtual bool GetLanguageBracesFromPosition(
            BraceType braceType,
            int position, bool reversed, out int start, out int end)
        {
            var startTokenType = BraceTypeToTokenTypeMap[braceType].OpenBrace;
            var endTokenType   = BraceTypeToTokenTypeMap[braceType].CloseBrace;
            var tokens         = GetTokens(0, TextBuffer.CurrentSnapshot.Length);

            start = -1;
            end   = -1;

            var stack = new Stack <TokenTypeT>();

            var startIndex = -1;

            for (var i = 0; i < tokens.Count; i++)
            {
                if (tokens[i].Start == position)
                {
                    startIndex = i;
                    break;
                }
            }

            if (startIndex < 0)
            {
                return(false);
            }

            if (_tokenComparer.Compare(tokens[startIndex].TokenType, startTokenType) != 0 && _tokenComparer.Compare(tokens[startIndex].TokenType, endTokenType) != 0)
            {
                return(false);
            }

            if (!reversed)
            {
                for (var i = startIndex; i < tokens.Count; i++)
                {
                    var token = tokens[i];

                    if (token.TokenType.Equals(startTokenType))
                    {
                        stack.Push(token.TokenType);
                    }
                    else if (_tokenComparer.Compare(token.TokenType, endTokenType) == 0)
                    {
                        if (stack.Count > 0)
                        {
                            stack.Pop();
                        }

                        if (stack.Count == 0)
                        {
                            start = tokens[startIndex].Start;
                            end   = token.Start;
                            return(true);
                        }
                    }
                }
            }
            else
            {
                for (var i = startIndex; i >= 0; i--)
                {
                    var token = tokens[i];

                    if (_tokenComparer.Compare(token.TokenType, endTokenType) == 0)
                    {
                        stack.Push(token.TokenType);
                    }
                    else if (_tokenComparer.Compare(token.TokenType, startTokenType) == 0)
                    {
                        if (stack.Count > 0)
                        {
                            stack.Pop();
                        }

                        if (stack.Count == 0)
                        {
                            start = token.Start;
                            end   = token.Start;

                            end = tokens[startIndex].Start;
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
示例#5
0
 public static bool IsSupportedBraceType(BraceType braceType)
 {
     return(BraceTypeToTokenTypeMap.ContainsKey(braceType));
 }
示例#6
0
 public Brace(char brace, BraceType type, BraceState state)
 {
     this.BraceChar  = brace;
     this.BraceType  = type;
     this.BraceState = state;
 }