This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

50 linhas
1.5 KiB

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