private Token FindNestedToken(int offset, IList<Token> tokens, FindTokenMode mode) { Token token = null; bool foundNestedToken = false; int i; for (i = tokens.Count - 1; i >= 0; i--) { if (OffsetWithinToken(offset, tokens[i])) { token = tokens[i]; var strToken = token as StringExpandableToken; if (strToken != null && strToken.NestedTokens != null) { var nestedToken = FindNestedToken(offset, strToken.NestedTokens, mode); if (nestedToken != null) { token = nestedToken; foundNestedToken = true; } } break; } if (offset >= tokens[i].Extent.EndOffset) { break; } } switch (mode) { case FindTokenMode.CurrentOrNext: if (token == null && (i + 1) < tokens.Count) { token = tokens[i + 1]; } break; case FindTokenMode.Next: if (!foundNestedToken) { // If there is no next token, return null (happens with nested // tokens where there is no EOF/EOS token). token = ((i + 1) < tokens.Count) ? tokens[i + 1] : null; } break; case FindTokenMode.Previous: if (token == null) { if (i >= 0) { token = tokens[i]; } } else if (offset == token.Extent.StartOffset) { token = i > 0 ? tokens[i - 1] : null; } break; } return token; }
private Token FindToken(int current, FindTokenMode mode) { MaybeParseInput(); return(FindNestedToken(current, _tokens, mode)); }
private Token FindToken(int current, FindTokenMode mode) { MaybeParseInput(); return FindNestedToken(current, _tokens, mode); }
private Token FindNestedToken(int offset, IList <Token> tokens, FindTokenMode mode) { Token token = null; bool foundNestedToken = false; int i; for (i = tokens.Count - 1; i >= 0; i--) { if (OffsetWithinToken(offset, tokens[i])) { token = tokens[i]; if (token is StringExpandableToken strToken && strToken.NestedTokens != null) { var nestedToken = FindNestedToken(offset, strToken.NestedTokens, mode); if (nestedToken != null) { token = nestedToken; foundNestedToken = true; } } break; } if (offset >= tokens[i].Extent.EndOffset) { break; } } switch (mode) { case FindTokenMode.CurrentOrNext: if (token == null && (i + 1) < tokens.Count) { token = tokens[i + 1]; } break; case FindTokenMode.Next: if (!foundNestedToken) { // If there is no next token, return null (happens with nested // tokens where there is no EOF/EOS token). token = ((i + 1) < tokens.Count) ? tokens[i + 1] : null; } break; case FindTokenMode.Previous: if (token == null) { if (i >= 0) { token = tokens[i]; } } else if (offset == token.Extent.StartOffset) { token = i > 0 ? tokens[i - 1] : null; } break; } return(token); }