def _double_indented_segment_apply(self, begin_token) -> Element: new_form_element = begin_token.parent.wrap(begin_token, begin_token.end, self.wrap_class) new_form = new_form_element.code indent0, indent1 = begin_token.indents first_args_begin = indent0.next colon = begin_token.find_punctuation(':', indent0) if colon is not None: raise ArrangementError( colon.range.first_position, "Dual indented segment cannot have ':' in its first line.") # replace first INDENT with ARGBREAK new_break = Tokens.ARGBREAK() new_form.insert(indent0, new_break) new_form.remove(indent0) # explode the args # (the explode function stops when it hits the second INDENT) Util.explode_list_of_args(first_args_begin) # wrap everything after head and before second INDENT in preseq inside a punctuator begin_token.parent.wrap(begin_token.next.next, indent1.prev, PreSeq) # remove BEGIN and END new_form.remove(new_form.first) new_form.remove(new_form.last) return new_form_element.next
def apply(self, element) -> Element: has_head = Util.has_head_element(element) if has_head: new_form_element = element.parent.wrap(element.prev, element.end, Form) new_form = new_form_element.code new_form.prepend( Identifier("@" + element.text + element.end.text, element.range)) # @[] head BEGIN_MACRO('[') begin ... end END_MACRO(']') else: new_form_element = element.parent.wrap(element, element.end, Form) new_form = new_form_element.code new_form.prepend( Identifier(element.text + element.end.text, element.range)) # @[] BEGIN_MACRO('[') begin head ... end END_MACRO(']') begin_element = element.next last_element = new_form.last new_form.remove(element) # remove BEGIN_MACRO('[') new_form.remove(new_form.last) # remove END_MACRO(']') if begin_element is last_element: # if we have something like a[] or a{} or so... return new_form_element.next else: # return Util.join_all_args(new_form_element, begin_element, "head-prefixed parenthesized form", 2 if has_head else 1) Util.explode_list_of_args(begin_element) return new_form_element.next
def apply(self, beginmacro_token) -> Element: new_form_element = beginmacro_token.parent.wrap(beginmacro_token.prev, beginmacro_token.end, Form) new_form = new_form_element.code begin_element = beginmacro_token.next last_element = new_form.last new_form.remove(beginmacro_token) # remove BEGIN_MACRO('(') new_form.remove(last_element) # remove END_MACRO(')') if begin_element is last_element: # if we have something like a[] or a{} or so... return new_form_element.next else: # return Util.join_all_args(new_form_element, begin_element, "head-prefixed parenthesized form", 1) Util.explode_list_of_args(begin_element) return new_form_element.next
def apply(self, beginmacro_token) -> Element: new_form_element = beginmacro_token.parent.wrap( beginmacro_token.prev, beginmacro_token.end, Form) new_form = new_form_element.code begin_element = beginmacro_token.next last_element = new_form.last new_form.remove(beginmacro_token) # remove BEGIN_MACRO('(') new_form.remove(last_element) # remove END_MACRO(')') if begin_element is last_element: # if we have something like a[] or a{} or so... return new_form_element.next else: # return Util.join_all_args(new_form_element, begin_element, "head-prefixed parenthesized form", 1) Util.explode_list_of_args(begin_element) return new_form_element.next
def apply(self, element) -> Element: first_begin = element.next assert is_token(first_begin, Tokens.BEGIN) new_seq_element = element.parent.wrap(element, element.end, PreSeq) new_seq = new_seq_element.code begin_element = element.next last_element = new_seq.last new_seq.remove(element) # remove BEGIN_MACRO('(') new_seq.remove(last_element) # remove END_MACRO(')') #if begin_element is last_element: # if we have something like a[] or a{} or so... # return new_tuple_element.next #else: # return \ Util.explode_list_of_args(begin_element) return new_seq_element.next
def apply(self, element) -> Element: first_begin = element.next assert is_token(first_begin, Tokens.BEGIN) new_seq_element = element.parent.wrap(element, element.end, PreSeq) new_seq = new_seq_element.code begin_element = element.next last_element = new_seq.last new_seq.remove(element) # remove BEGIN_MACRO('(') new_seq.remove(last_element) # remove END_MACRO(')') #if begin_element is last_element: # if we have something like a[] or a{} or so... # return new_tuple_element.next #else: # return \ Util.explode_list_of_args(begin_element) return new_seq_element.next
def _double_indented_segment_apply(self, begin_token) -> Element: new_form_element = begin_token.parent.wrap(begin_token, begin_token.end, self.wrap_class) new_form = new_form_element.code indent0, indent1 = begin_token.indents first_args_begin = indent0.next colon = begin_token.find_punctuation(':', indent0) if colon is not None: raise ArrangementError(colon.range.first_position, "Dual indented segment cannot have ':' in its first line.") # replace first INDENT with ARGBREAK new_break = Tokens.ARGBREAK() new_form.insert(indent0, new_break) new_form.remove(indent0) # explode the args # (the explode function stops when it hits the second INDENT) Util.explode_list_of_args(first_args_begin) # wrap everything after head and before second INDENT in preseq inside a punctuator begin_token.parent.wrap(begin_token.next.next, indent1.prev, PreSeq) # remove BEGIN and END new_form.remove(new_form.first) new_form.remove(new_form.last) return new_form_element.next #raise NotImplementedError()
def _single_indented_segment_apply(self, begin_token) -> Element: # First we wrap everything from BEGIN to END in a new Node (of the given wrap_class, which is usually PreForm) new_form_element = begin_token.parent.wrap(begin_token, begin_token.end, self.wrap_class) new_form = new_form_element.code indent = begin_token.indents[0] # punctuation = begin_token.punctuation has_colon = begin_token.find_punctuation(':', indent) is not None new_form.remove(new_form.first) # remove BEGIN new_form.remove(new_form.last) # remove END if not has_colon: # If the segment does not have a colon, then we are in list-of-args mode # In list-of-args mode, we replace every newline with an ARGBREAK, and "open-up" # every segment in the indented block that doesn't have indented sub-blocks or a colon first_begin_after_indentation = indent.next # replace indent with ARGBREAK when there are some elements # between the head and the indent token if indent.prev is not new_form.first: new_form.insert(indent, Tokens.ARGBREAK()) new_form.remove(indent) # at this point, new_form was transformed like this: # BEGIN head xxx INDENT BEGIN ... END END => head xxx ARGBREAK BEGIN ... END # BEGIN head INDENT BEGIN ... END END => head BEGIN ... END # remove BEGIN/END pairs of non-indented, non-colon-having segments Util.explode_list_of_args(first_begin_after_indentation) return new_form_element.next
def _single_indented_segment_apply(self, begin_token) -> Element: # BEGIN = INDENT END new_form_element = begin_token.parent.wrap(begin_token, begin_token.end, Form) # (BEGIN = INDENT END) new_form = new_form_element.code indent = begin_token.indents[0] assignment_symbol_elm = indent.prev has_colon = begin_token.find_punctuation(':', indent) is not None if has_colon: raise ArrangementError(has_colon.range, "Unexpected `:` in assignment segment.") new_form.wrap(begin_token.next, assignment_symbol_elm.prev, PreSeq) # (BEGIN ⟅,⟆ = INDENT END) new_form.remove(new_form.first) # (⟅,⟆ = INDENT END) new_form.remove(new_form.last) # (⟅,⟆ = INDENT ) new_form.remove(assignment_symbol_elm) # (⟅,⟆ INDENT ) new_form.prepend(Identifier("=")) # (= ⟅,⟆ INDENT ) if is_identifier(assignment_symbol_elm, '='): first_begin_after_indentation = indent.next # remove BEGIN/END pairs of non-indented, non-colon-having segments Util.explode_list_of_args(first_begin_after_indentation) rvalue_elm = new_form.wrap(indent.next, new_form.last, PreSeq) # (= ⟅,⟆ INDENT ⟅,⟆ ) new_form.remove(indent) # (= ⟅,⟆ ⟅,⟆ ) return new_form_element.next
def apply(self, element) -> Element: has_head = Util.has_head_element(element) if has_head: new_form_element = element.parent.wrap(element.prev, element.end, Form) new_form = new_form_element.code new_form.prepend(Identifier("@" + element.text + element.end.text, element.range)) # @[] head BEGIN_MACRO('[') begin ... end END_MACRO(']') else: new_form_element = element.parent.wrap(element, element.end, Form) new_form = new_form_element.code new_form.prepend(Identifier(element.text + element.end.text, element.range)) # @[] BEGIN_MACRO('[') begin head ... end END_MACRO(']') begin_element = element.next last_element = new_form.last new_form.remove(element) # remove BEGIN_MACRO('[') new_form.remove(new_form.last) # remove END_MACRO(']') if begin_element is last_element: # if we have something like a[] or a{} or so... return new_form_element.next else: # return Util.join_all_args(new_form_element, begin_element, "head-prefixed parenthesized form", 2 if has_head else 1) Util.explode_list_of_args(begin_element) return new_form_element.next
def _single_indented_segment_apply(self, begin_token) -> Element: # First we wrap everything from BEGIN to END in a new Node (of the given wrap_class, which is usually PreForm) new_form_element = begin_token.parent.wrap(begin_token, begin_token.end, self.wrap_class) new_form = new_form_element.code indent = begin_token.indents[0] # punctuation = begin_token.punctuation has_colon = begin_token.find_punctuation(':', indent) is not None new_form.remove(new_form.first) # remove BEGIN new_form.remove(new_form.last) # remove END if not has_colon: # If the segment does not have a colon, then we are in list-of-args mode # In list-of-args mode, we replace every newline with an ARGBREAK, and "open-up" # every segment in the indented block that doesn't have indented sub-blocks or a colon first_begin_after_indentation = indent.next # replace indent with ARGBREAK when there are some elements # between the head and the indent token if indent.prev is not new_form.first: new_form.insert(indent, Tokens.ARGBREAK()) new_form.remove(indent) # at this point, new_form was transformed like this: # BEGIN head xxx INDENT BEGIN ... END END => head xxx ARGBREAK BEGIN ... END # BEGIN head INDENT BEGIN ... END END => head BEGIN ... END # remove BEGIN/END pairs of non-indented, non-colon-having segments Util.explode_list_of_args(first_begin_after_indentation) return new_form_element.next