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
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())
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