12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2008 The Closure Linter Authors. All Rights Reserved.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Licensed under the Apache License, Version 2.0 (the "License");
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# you may not use this file except in compliance with the License.
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# You may obtain a copy of the License at
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#      http://www.apache.org/licenses/LICENSE-2.0
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Unless required by applicable law or agreed to in writing, software
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distributed under the License is distributed on an "AS-IS" BASIS,
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# See the License for the specific language governing permissions and
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# limitations under the License.
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis"""Classes to represent positions within strings."""
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis__author__ = ('robbyw@google.com (Robert Walker)',
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis              'ajp@google.com (Andy Perelson)')
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennisclass Position(object):
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  """Object representing a segment of a string.
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  Attributes:
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    start: The index in to the string where the segment starts.
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    length: The length of the string segment.
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  """
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def __init__(self, start, length):
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Initialize the position object.
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      start: The start index.
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      length: The number of characters to include.
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.start = start
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.length = length
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def Get(self, string):
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns this range of the given string.
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      string: The string to slice.
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      The string within the range specified by this object.
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return string[self.start:self.start + self.length]
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def Set(self, target, source):
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Sets this range within the target string to the source string.
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      target: The target string.
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      source: The source string.
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      The resulting string
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return target[:self.start] + source + target[self.start + self.length:]
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def AtEnd(string):
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Create a Position representing the end of the given string.
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      string: The string to represent the end of.
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      The created Position object.
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return Position(len(string), 0)
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  AtEnd = staticmethod(AtEnd)
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def IsAtEnd(self, string):
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns whether this position is at the end of the given string.
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      string: The string to test for the end of.
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      Whether this position is at the end of the given string.
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return self.start == len(string) and self.length == 0
862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def AtBeginning():
882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Create a Position representing the beginning of any string.
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      The created Position object.
922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return Position(0, 0)
942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  AtBeginning = staticmethod(AtBeginning)
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def IsAtBeginning(self):
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns whether this position is at the beginning of any string.
982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      Whether this position is at the beginning of any string.
1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return self.start == 0 and self.length == 0
1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def All(string):
1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Create a Position representing the entire string.
1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      string: The string to represent the entirety of.
1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
1112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      The created Position object.
1122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
1132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return Position(0, len(string))
1142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  All = staticmethod(All)
1152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def Index(index):
1172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Returns a Position object for the specified index.
1182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
1202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      index: The index to select, inclusively.
1212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Returns:
1232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      The created Position object.
1242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
1252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return Position(index, 1)
1262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  Index = staticmethod(Index)
127