Exemplo n.º 1
0
def main(udb_path, source_package, source_class, method_name,
         target_classes: list, *args, **kwargs):
    """

    The main API for the push-down method refactoring operation

    """
    target_package = source_package
    source_method = method_name

    main_file = None
    source_method_entity = None
    is_static = False
    propagation_files = []
    propagation_classes = []
    propagation_lines = []
    children_classes = []
    children_files = []

    # Initialize with understand
    db = und.open(udb_path)
    methods = db.ents("Java Method")
    for mth in methods:
        if mth.longname(
        ) == source_package + "." + source_class + "." + source_method:
            source_method_entity = mth
            for child_ref in mth.parent().refs("Extendby"):
                child_ref = child_ref.ent()
                if child_ref.simplename() in target_classes:
                    children_classes.append(child_ref.simplename())
                    children_files.append(child_ref.parent().longname())
            # print("mainfile : ", mth.parent().parent().longname())
            is_static = mth.kind().check("static")
            main_file = mth.parent().parent().longname()
            for ref in mth.refs("Callby"):
                propagation_files.append(
                    ref.ent().parent().parent().longname())
                propagation_classes.append(ref.ent().parent().simplename())
                propagation_lines.append(ref.line())

    # Check pre-condition
    if not len(target_classes) == 1:
        logger.error(f"len(target_classes) is not 1.")
        db.close()
        return False

    if not len(children_classes) == 1:
        logger.error(f"len(children_classes) is not 1.")
        db.close()
        return False

    if not len(children_files) == 1:
        logger.error(f"len(children_files) is not 1.")
        db.close()
        return False

    for mth in methods:
        if mth.simplename() == source_method:
            if mth.parent().simplename() in target_classes:
                if mth.type() == source_method_entity.type():
                    if mth.kind() == source_method_entity.kind():
                        if mth.parameters() == source_method_entity.parameters(
                        ):
                            logger.error("Duplicated method")
                            db.close()
                            return False

    for ref in source_method_entity.refs("use, call"):
        ref_ent = ref.ent()
        is_public = ref_ent.kind().check("public")
        if not is_public:
            logger.error("Has internal dependencies.")
            db.close()
            return False

    #  get text
    method_text = source_method_entity.contents()

    db.close()

    # Delete source method
    stream = FileStream(main_file, encoding='utf8', errors='ignore')
    lexer = JavaLexer(stream)
    token_stream = CommonTokenStream(lexer)
    parser = JavaParserLabeled(token_stream)
    parser.getTokenStream()
    parse_tree = parser.compilationUnit()
    my_listener = DeleteSourceListener(common_token_stream=token_stream,
                                       source_method=source_method)
    walker = ParseTreeWalker()
    walker.walk(t=parse_tree, listener=my_listener)
    # print(my_listener.token_stream_rewriter.getDefaultText())
    with open(main_file, mode='w', encoding='utf-8', newline='') as f:
        f.write(my_listener.token_stream_rewriter.getDefaultText())

    # Do the push down
    for child_file, child_class in zip(children_files, children_classes):
        stream = FileStream(child_file, encoding='utf8', errors='ignore')
        lexer = JavaLexer(stream)
        token_stream = CommonTokenStream(lexer)
        parser = JavaParserLabeled(token_stream)
        parser.getTokenStream()
        parse_tree = parser.compilationUnit()
        my_listener = PushDownMethodRefactoringListener(
            common_token_stream=token_stream,
            source_class=child_class,
            source_method_text=method_text)
        walker = ParseTreeWalker()
        walker.walk(t=parse_tree, listener=my_listener)
        # print(my_listener.token_stream_rewriter.getDefaultText())
        with open(child_file, mode='w', encoding='utf8', newline='') as f:
            f.write(my_listener.token_stream_rewriter.getDefaultText())

    # Propagation
    for file, _class, line in zip(propagation_files, propagation_classes,
                                  propagation_lines):
        stream = FileStream(file, encoding='utf8', errors='ignore')
        lexer = JavaLexer(stream)
        token_stream = CommonTokenStream(lexer)
        parser = JavaParserLabeled(token_stream)
        parser.getTokenStream()
        parse_tree = parser.compilationUnit()
        if is_static:
            my_listener = PropagationStaticListener(
                common_token_stream=token_stream,
                source_class=source_class,
                child_class=children_classes[0],
                class_name=_class,
                method_name=source_method,
                ref_line=line,
                target_package=target_package)
        else:
            my_listener = PropagationNonStaticListener(
                common_token_stream=token_stream,
                source_class=source_class,
                child_class=children_classes[0],
                class_name=_class,
                method_name=source_method,
                ref_line=line,
                target_package=target_package)
        walker = ParseTreeWalker()
        walker.walk(t=parse_tree, listener=my_listener)
        # print(my_listener.token_stream_rewriter.getDefaultText())
        with open(file, mode='w', encoding='utf8', errors='ignore',
                  newline='') as f:
            f.write(my_listener.token_stream_rewriter.getDefaultText())

    return True
Exemplo n.º 2
0
def main(args):
    files = get_file_dirs(args.dir)

    create_new_project_dir('JavaProjectRefactored', files)
    ref = input(" choose your refactoring :")

    for file in files:

        # Step 1: Load input source into stream

        m = re.search(r'^.*\.java$', file)
        if m is None:
            continue

        print(file)

        stream = FileStream(file, encoding='utf8', errors='ignore')
        # input_stream = StdinStream()

        # Step 2: Create an instance of AssignmentStLexer
        lexer = JavaLexer(stream)
        # Step 3: Convert the input source into a list of tokens
        token_stream = CommonTokenStream(lexer)
        # Step 4: Create an instance of the AssignmentStParser
        parser = JavaParserLabeled(token_stream)

        parser.getTokenStream()
        # Step 5: Create parse tree
        parse_tree = parser.compilationUnit()
        # Step 6: Create an instance of AssignmentStListener

        # my_listener = RenameClassRefactoringListener(common_token_stream=token_stream, class_new_name='Z',
        #                                                 class_identifier='A', package_identifier="Dummy")
        if ref == "Rename":
            print("Rename class  =>")
            my_listener = RenameClassRefactoringListener(
                common_token_stream=token_stream,
                class_new_name='Z',
                class_identifier='ReflectiveXmlRpcMetaDataHandler',
                package_identifier="org.apache.xmlrpc.metadata")
        elif ref == "Static":
            print("Make field static  =>")
            my_listener = MakeFieldStaticRefactoringListener(
                common_token_stream=token_stream,
                field_identifier='methodHelp',
                class_identifier='ReflectiveXmlRpcMetaDataHandler',
                package_identifier="org.apache.xmlrpc.metadata")
        elif ref == "Non-Static":
            print("Make field Non static  =>")
            my_listener = MakeFieldNonStaticRefactoringListener(
                common_token_stream=token_stream,
                field_identifier='log',
                class_identifier='XmlRpcErrorLogger',
                package_identifier="org.apache.xmlrpc.server")
        else:
            print("Not Valid")
            break

        walker = ParseTreeWalker()
        walker.walk(t=parse_tree, listener=my_listener)

        if ref == "Non Static" and my_listener.canceled:
            rewrite_project(files, 'JavaProjectRefactored')
            break

        if ref == "Rename" and my_listener.in_selected_class:
            splited_dir = file.split('/')
            splited_dir[0] = 'JavaProjectRefactored'
            if os.path.exists("/".join(splited_dir)):
                os.remove("/".join(splited_dir))
            splited_dir[-1] = my_listener.class_new_name + ".java"
            with open("/".join(splited_dir), mode='w', newline='') as f:
                f.write(my_listener.token_stream_rewriter.getDefaultText())
        else:
            splited_dir = file.split('/')
            splited_dir[0] = 'JavaProjectRefactored'
            with open("/".join(splited_dir), mode='w', newline='') as f:
                f.write(my_listener.token_stream_rewriter.getDefaultText())
Exemplo n.º 3
0
def main():
    # Path = "../tests/remove_dead_code"
    Path = "../tests/remove_dead_code/json"
    FolderPath = os.listdir(Path)

    Identifier = [
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": ["CDL/Field"]
        },
        {
            "Classes": ["Cookie"],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        # This useless variable is just written to test this code on real project
        {
            "Classes": [],
            "Methods": ["CookieList/toJSONObject"],
            "Variables": ["CookieList/toString/c"],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": ["HTTP/toJSONObject/Par/2"],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        },
        {
            "Classes": [],
            "Methods": [],
            "Variables": [],
            "Parameters": [],
            "Fields": []
        }
        # {"Classes": ["Airplane"],
        #            "Methods": ["Car/Fly", "Engine/main2"],
        #            "Fields": ["Car/noway", "Engine/model"],
        #            "Variables": [],
        #            "Parameters": []},
        #
        # {"Classes": [],
        #            "Methods": [],
        #            "Fields": [],
        #            "Variables": ["Car/main/dead", "Car/Run/number", "Engine/SetName/what",
        #                          "Engine/main2/variable", "Engine/main2/dead"],
        #            "Parameters": ["Car/Drive/wheels/2", "Engine/main/k/2", "Engine/SetName/last/2"]},
        #
        # {"Classes": ["Airplane"],
        #            "Methods": ["Car/Fly", "Engine/main2"],
        #            "Fields": ["Car/noway", "Engine/model"],
        #            "Variables": ["Car/main/dead", "Car/Run/number", "Engine/SetName/what",
        #                          "Engine/main2/variable", "Engine/main2/dead"],
        #            "Parameters": ["Car/Drive/wheels/2", "Engine/main/k/2", "Engine/SetName/last/2"]}
    ]

    i = 0
    for File in FolderPath:
        # We have all of the java files in this folder now
        if File.endswith('.java'):
            EachFilePath = Path + "\\" + File
            # Step 1: Load input source into stream
            EachFile = FileStream(str(EachFilePath))

            # Step 2: Create an instance of AssignmentStLexer
            Lexer = JavaLexer(EachFile)

            # Step 3: Convert the input source into a list of tokens
            TokenStream = CommonTokenStream(Lexer)

            # Step 4: Create an instance of the AssignmentStParser
            Parser = JavaParserLabeled(TokenStream)

            # Step 5: Create parse tree
            Tree = Parser.compilationUnit()

            # ListenerForDetection = DetectCodeClass()
            # ListenerForDeadCodeDetection = DetectDeadCodeClass()

            if i < len(Identifier):
                # This is a new Java file which is the result
                Refactored = open(os.path.join(Path,
                                               File + "_Refactored.java"),
                                  mode='w',
                                  newline='')

                # Step 6: Create an instance of AssignmentStListener
                ListenerForRemovingDeadCode = RemoveDeadCodeClass(
                    TokenStream, Identifier[i])

                Walker = ParseTreeWalker()

                # Walk
                # Walker.walk(Listener, Tree)
                # Walker.walk(ListenerOnMainCode, Tree)

                Walker.walk(ListenerForRemovingDeadCode, Tree)

                NewCode = str(
                    ListenerForRemovingDeadCode.CodeRewrite.getDefaultText())
                Refactored.write(NewCode)
            i += 1