This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

56 Zeilen
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. ###}