예제 #1
0
def countunbalanced():
    import xmllexer
    import xmlfixup

    unbalancedcg = 0
    brokenmarkup = 0
    for cg in clones.clonegroups:
        bmp = False
        (ifn, ib, ie) = cg.instances[0]
        ifl = clones.inputfiles[ifn]
        il = ie - ib + 1
        covint, bf, bl = xmllexer.find_covered_intervals(
            ib, il, ifl.lexintervals)

        if bf and covint[0].int_type != xmllexer.IntervalType.general \
                or bl and covint[-1].int_type != xmllexer.IntervalType.general:
            brokenmarkup += 1
            bmp = True

        if not bmp:
            pb, ab, pr, ar = xmlfixup.balance_unbalanced_text(covint)
            if len(pb) != 0 or len(ab) != 0:
                unbalancedcg += 1

    return brokenmarkup, unbalancedcg
예제 #2
0
def countunbalanced():
    import xmllexer
    import xmlfixup

    unbalancedcg = 0
    brokenmarkup = 0
    for cg in clones.clonegroups:
        bmp = False
        (ifn, ib, ie) = cg.instances[0]
        ifl = clones.inputfiles[ifn]
        il = ie - ib + 1
        covint, bf, bl = xmllexer.find_covered_intervals(ib, il, ifl.lexintervals)

        if bf and covint[0].int_type != xmllexer.IntervalType.general \
                or bl and covint[-1].int_type != xmllexer.IntervalType.general:
            brokenmarkup += 1
            bmp = True

        if not bmp:
            pb, ab, pr, ar = xmlfixup.balance_unbalanced_text(covint)
            if len(pb) != 0 or len(ab) != 0:
                unbalancedcg += 1

    return brokenmarkup, unbalancedcg
예제 #3
0
def create_reuse_entry(tinput: "str", clone_desc: "str", drl_elt_type: "str") -> "tuple(str, str)":
    """
    Converts clone instances to dictionary entry references
    :param tinput: input DRL source
    :param clone_desc: clone group descriptor
    :return: tuple of output text and dictionary element source
    """
    cd = CandidateDescriptor(clone_desc)

    drl_elts = {
        "dict": ("""<d:Entry id="%s">%s</d:Entry>""", """<d:DictRef entryid="%s" dictid="doc_clone_finder" />%s"""),
        "infelt": ("""<d:InfElement id="%s">%s</d:InfElement>""", """<d:InfElemRef infelemid="%s">%s</d:InfElemRef>"""),
    }
    drl_defs, drl_refs = drl_elts[drl_elt_type]

    if drl_elt_type != "infelt" and cd.variative:
        logging.fatal("Requested to refactor variative unit, but not information element")
        assert False

    def xs(xel):
        return "".join([el.srepr for el in xel])

    eid = str(uuid.uuid4())

    whole_instances = cd.get_whole_instances(tinput)
    # outer balancing using outer instance #0
    outer_def_prepend, outer_def_append, outer_ref_prepend, outer_ref_append = xmlfixup.balance_unbalanced_text(
        xmllexer.lex(whole_instances[0])
    )

    # prepend and appends for extension points
    vps_pa = []
    vps = cd.get_variative_parts(tinput)
    for vp in vps:
        # balancing using variative part #0
        vps_pa.append(xmlfixup.balance_unbalanced_text(xmllexer.lex(vp[0])))

    # definition
    vardefs = []
    cnt = 0
    for inner_def_prepend, inner_def_append, inner_ref_prepend, inner_ref_append in vps_pa:
        cnt += 1
        vardefs.append(xs(inner_ref_prepend) + ("""<d:Nest id="%s.%d"/>""" % (eid, cnt)) + xs(inner_ref_append))

    condefs = cd.get_constant_parts(tinput)

    bodydef = "".join([cv[0] + cv[1] for cv in zip(condefs, vardefs + [""])])

    complete_def = drl_defs % (eid, xs(outer_def_prepend) + bodydef + xs(outer_def_append))

    # reference
    vrefs = []
    for vpv in vps:
        replace_nests = []
        cnt = 0
        for vp, pa in zip(vpv, vps_pa):
            cnt += 1
            inner_def_prepend, inner_def_append, inner_ref_prepend, inner_ref_append = pa
            replace_nests.append(
                ("""<d:Replace-Nest nestid="%s.%d">""" % (eid, cnt))
                + xs(inner_ref_prepend)
                + vp
                + xs(inner_ref_append)
                + """</d:Replace-Nest>"""
            )
        vrefs.append(xs(outer_ref_prepend) + drl_refs % (eid, "".join(replace_nests)) + xs(outer_ref_append))

    if not len(vrefs):
        # non-variative one
        vrefs = [xs(outer_ref_prepend) + (drl_refs % (eid, "")) + xs(outer_ref_append)]

    # instance intervals
    intervals = cd.get_whole_instance_coordinates(tinput)

    restext = replace_str_intervals_with(tinput, vrefs, intervals)

    return restext, complete_def
예제 #4
0
def create_reuse_entry(tinput: 'str', clone_desc: 'str',
                       drl_elt_type: 'str') -> 'tuple(str, str)':
    """
    Converts clone instances to dictionary entry references
    :param tinput: input DRL source
    :param clone_desc: clone group descriptor
    :return: tuple of output text and dictionary element source
    """
    cd = CandidateDescriptor(clone_desc)

    drl_elts = {
        "dict": ("""<d:Entry id="%s">%s</d:Entry>""",
                 """<d:DictRef entryid="%s" dictid="doc_clone_finder" />%s"""),
        "infelt": ("""<d:InfElement id="%s">%s</d:InfElement>""",
                   """<d:InfElemRef infelemid="%s">%s</d:InfElemRef>""")
    }
    drl_defs, drl_refs = drl_elts[drl_elt_type]

    if drl_elt_type != 'infelt' and cd.variative:
        logging.fatal(
            "Requested to refactor variative unit, but not information element"
        )
        assert False

    def xs(xel):
        return ''.join([el.srepr for el in xel])

    eid = str(uuid.uuid4())

    whole_instances = cd.get_whole_instances(tinput)
    # outer balancing using outer instance #0
    outer_def_prepend, outer_def_append, outer_ref_prepend, outer_ref_append = \
        xmlfixup.balance_unbalanced_text(xmllexer.lex(whole_instances[0]))

    # prepend and appends for extension points
    vps_pa = []
    vps = cd.get_variative_parts(tinput)
    for vp in vps:
        # balancing using variative part #0
        vps_pa.append(xmlfixup.balance_unbalanced_text(xmllexer.lex(vp[0])))

    # definition
    vardefs = []
    cnt = 0
    for inner_def_prepend, inner_def_append, inner_ref_prepend, inner_ref_append in vps_pa:
        cnt += 1
        vardefs.append(
            xs(inner_ref_prepend) + ("""<d:Nest id="%s.%d"/>""" % (eid, cnt)) +
            xs(inner_ref_append))

    condefs = cd.get_constant_parts(tinput)

    bodydef = ''.join([cv[0] + cv[1] for cv in zip(condefs, vardefs + [''])])

    complete_def = drl_defs % (eid, xs(outer_def_prepend) + bodydef +
                               xs(outer_def_append))

    # reference
    vrefs = []
    for vpv in vps:
        replace_nests = []
        cnt = 0
        for vp, pa in zip(vpv, vps_pa):
            cnt += 1
            inner_def_prepend, inner_def_append, inner_ref_prepend, inner_ref_append = pa
            replace_nests.append(("""<d:Replace-Nest nestid="%s.%d">""" %
                                  (eid, cnt)) + xs(inner_ref_prepend) + vp +
                                 xs(inner_ref_append) +
                                 """</d:Replace-Nest>""")
        vrefs.append(
            xs(outer_ref_prepend) + drl_refs % (eid, ''.join(replace_nests)) +
            xs(outer_ref_append))

    if not len(vrefs):
        # non-variative one
        vrefs = [
            xs(outer_ref_prepend) + (drl_refs % (eid, '')) +
            xs(outer_ref_append)
        ]

    # instance intervals
    intervals = cd.get_whole_instance_coordinates(tinput)

    restext = replace_str_intervals_with(tinput, vrefs, intervals)

    return restext, complete_def