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); }
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 }); }
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)); }
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); }
public static bool IsSupportedBraceType(BraceType braceType) { return(BraceTypeToTokenTypeMap.ContainsKey(braceType)); }
public Brace(char brace, BraceType type, BraceState state) { this.BraceChar = brace; this.BraceType = type; this.BraceState = state; }