Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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()
Example #8
0
    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
Example #9
0
    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
Example #10
0
    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
Example #11
0
    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