This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

56 rader
1.7 KiB

  1. "Provides Indentation services for languages with indentation similar to Python"
  2. from .lexer import Token
  3. ###{standalone
  4. class Indenter:
  5. def __init__(self):
  6. self.paren_level = 0
  7. self.indent_level = [0]
  8. def handle_NL(self, token):
  9. if self.paren_level > 0:
  10. return
  11. yield token
  12. indent_str = token.rsplit('\n', 1)[1] # Tabs and spaces
  13. indent = indent_str.count(' ') + indent_str.count('\t') * self.tab_len
  14. if indent > self.indent_level[-1]:
  15. self.indent_level.append(indent)
  16. yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
  17. else:
  18. while indent < self.indent_level[-1]:
  19. self.indent_level.pop()
  20. yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
  21. assert indent == self.indent_level[-1], '%s != %s' % (indent, self.indent_level[-1])
  22. def process(self, stream):
  23. for token in stream:
  24. if token.type == self.NL_type:
  25. for t in self.handle_NL(token):
  26. yield t
  27. else:
  28. yield token
  29. if token.type in self.OPEN_PAREN_types:
  30. self.paren_level += 1
  31. elif token.type in self.CLOSE_PAREN_types:
  32. self.paren_level -= 1
  33. assert self.paren_level >= 0
  34. while len(self.indent_level) > 1:
  35. self.indent_level.pop()
  36. yield Token(self.DEDENT_type, '')
  37. assert self.indent_level == [0], self.indent_level
  38. # XXX Hack for ContextualLexer. Maybe there's a more elegant solution?
  39. @property
  40. def always_accept(self):
  41. return (self.NL_type,)
  42. ###}