This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

53 行
1.7 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. elif 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
  37. # XXX Hack for ContextualLexer. Maybe there's a more elegant solution?
  38. @property
  39. def always_accept(self):
  40. return (self.NL_type,)