This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

62 lignes
1.8 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 = None
  7. self.indent_level = None
  8. assert self.tab_len > 0
  9. def handle_NL(self, token):
  10. if self.paren_level > 0:
  11. return
  12. yield token
  13. indent_str = token.rsplit('\n', 1)[1] # Tabs and spaces
  14. indent = indent_str.count(' ') + indent_str.count('\t') * self.tab_len
  15. if indent > self.indent_level[-1]:
  16. self.indent_level.append(indent)
  17. yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
  18. else:
  19. while indent < self.indent_level[-1]:
  20. self.indent_level.pop()
  21. yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
  22. assert indent == self.indent_level[-1], '%s != %s' % (indent, self.indent_level[-1])
  23. def _process(self, stream):
  24. for token in stream:
  25. if token.type == self.NL_type:
  26. for t in self.handle_NL(token):
  27. yield t
  28. else:
  29. yield token
  30. if token.type in self.OPEN_PAREN_types:
  31. self.paren_level += 1
  32. elif token.type in self.CLOSE_PAREN_types:
  33. self.paren_level -= 1
  34. assert self.paren_level >= 0
  35. while len(self.indent_level) > 1:
  36. self.indent_level.pop()
  37. yield Token(self.DEDENT_type, '')
  38. assert self.indent_level == [0], self.indent_level
  39. def process(self, stream):
  40. self.paren_level = 0
  41. self.indent_level = [0]
  42. return self._process(stream)
  43. # XXX Hack for ContextualLexer. Maybe there's a more elegant solution?
  44. @property
  45. def always_accept(self):
  46. return (self.NL_type,)
  47. ###}