/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.python.pydev.refactoring.refactorer.refactorings.rename; import java.io.File; import java.util.HashSet; import java.util.Map; import org.eclipse.core.runtime.NullProgressMonitor; import org.python.pydev.core.IModule; import org.python.pydev.core.IProjectModulesManager; import org.python.pydev.editor.refactoring.ModuleRenameRefactoringRequest; import org.python.pydev.editor.refactoring.RefactoringRequest; import org.python.pydev.parser.visitors.scope.ASTEntry; import org.python.pydev.shared_core.structure.Tuple; import com.python.pydev.refactoring.wizards.rename.PyRenameEntryPoint; import com.python.pydev.refactoring.wizards.rename.PyRenameImportProcess; public class RenameModuleRefactoringTest extends RefactoringRenameTestBase { public static void main(String[] args) { try { DEBUG_REFERENCES = false; RenameModuleRefactoringTest test = new RenameModuleRefactoringTest(); test.setUp(); // test.testRenameModuleInWorkspace3(); test.tearDown(); junit.textui.TestRunner.run(RenameModuleRefactoringTest.class); } catch (Throwable e) { e.printStackTrace(); } } @Override protected Class<PyRenameImportProcess> getProcessUnderTest() { return PyRenameImportProcess.class; } public void testRenameModuleInWorkspace() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule.mod1", "new_mod_name", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule.importer\n" + " FixedInputStringASTEntry<mod1 (Name L=3 C=2)>\n" + " Line: 2 #mod1 comment --> #new_mod_name comment\n" + " FixedInputStringASTEntry<mod1 (Name L=4 C=2)>\n" + " Line: 3 'mod1 string' --> 'new_mod_name string'\n" + " ImportFromModPartRenameAstEntry<from mod1 import submod1 (ImportFrom L=2 C=6)>\n" + " Line: 1 from mod1 import submod1 --> from new_mod_name import submod1\n" + " ImportFromRenameAstEntry<import mod1 (Import L=1 C=8)>\n" + " Line: 0 import mod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer2\n" + " FixedInputStringASTEntry<mod1 (Name L=3 C=2)>\n" + " Line: 2 #mod1 comment --> #new_mod_name comment\n" + " FixedInputStringASTEntry<mod1 (Name L=4 C=2)>\n" + " Line: 3 'mod1 string' --> 'new_mod_name string'\n" + " ImportFromModPartRenameAstEntry<from mod1 import submod1 (ImportFrom L=2 C=6)>\n" + " Line: 1 from mod1 import submod1 --> from new_mod_name import submod1\n" + " ImportFromRenameAstEntry<import mod1 (Import L=1 C=8)>\n" + " Line: 0 import mod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer5\n" + " ImportFromModPartRenameAstEntry<from reflib.renamemodule.mod1 import submod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule.mod1 import submod1 --> from new_mod_name import submod1\n" + "\n" + "reflib.renamemodule.importer6\n" + " FixedInputStringASTEntry<reflib.renamemodule.mod1 (Name L=1 C=2)>\n" + " Line: 0 'reflib.renamemodule.mod1.submod1' --> 'new_mod_name.submod1'\n" + "\n" + "reflib.renamemodule.importer7\n" + " ImportFromRenameAstEntry<from reflib.renamemodule import mod1importer (ImportFrom L=1 C=6)>\n" + " Initial:\n" + "from reflib.renamemodule import mod1, importer\n" + " Final:\n" + "from reflib.renamemodule import importer\n" + "import new_mod_name\n" + "\n" + "reflib.renamemodule.mod1\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n", asStr); } public void testRenameModuleInWorkspaceA() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule.mod1", "my.mod.new_name", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule.importer\n" + " FixedInputStringASTEntry<mod1 (Name L=3 C=2)>\n" + " Line: 2 #mod1 comment --> #new_name comment\n" + " FixedInputStringASTEntry<mod1 (Name L=4 C=2)>\n" + " Line: 3 'mod1 string' --> 'new_name string'\n" + " ImportFromModPartRenameAstEntry<from mod1 import submod1 (ImportFrom L=2 C=6)>\n" + " Line: 1 from mod1 import submod1 --> from my.mod.new_name import submod1\n" + " ImportFromRenameAstEntry<import mod1 (Import L=1 C=8)>\n" + " Line: 0 import mod1 --> from my.mod import new_name\n" + "\n" + "reflib.renamemodule.importer2\n" + " FixedInputStringASTEntry<mod1 (Name L=3 C=2)>\n" + " Line: 2 #mod1 comment --> #new_name comment\n" + " FixedInputStringASTEntry<mod1 (Name L=4 C=2)>\n" + " Line: 3 'mod1 string' --> 'new_name string'\n" + " ImportFromModPartRenameAstEntry<from mod1 import submod1 (ImportFrom L=2 C=6)>\n" + " Line: 1 from mod1 import submod1 --> from my.mod.new_name import submod1\n" + " ImportFromRenameAstEntry<import mod1 (Import L=1 C=8)>\n" + " Line: 0 import mod1 --> from my.mod import new_name\n" + "\n" + "reflib.renamemodule.importer5\n" + " ImportFromModPartRenameAstEntry<from reflib.renamemodule.mod1 import submod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule.mod1 import submod1 --> from my.mod.new_name import submod1\n" + "\n" + "reflib.renamemodule.importer6\n" + " FixedInputStringASTEntry<reflib.renamemodule.mod1 (Name L=1 C=2)>\n" + " Line: 0 'reflib.renamemodule.mod1.submod1' --> 'my.mod.new_name.submod1'\n" + "\n" + "reflib.renamemodule.importer7\n" + " ImportFromRenameAstEntry<from reflib.renamemodule import mod1importer (ImportFrom L=1 C=6)>\n" + " Initial:\n" + "from reflib.renamemodule import mod1, importer\n" + " Final:\n" + "from reflib.renamemodule import importer\n" + "from my.mod import new_name\n" + "\n" + "reflib.renamemodule.mod1\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n", asStr); } public void testRenameModuleInWorkspace2() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule.mod1.submod1", "new_mod_name", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule.importer\n" + " FixedInputStringASTEntry<submod1 (Name L=6 C=5)>\n" + " Line: 5 a = submod1 --> a = new_mod_name\n" + " ImportFromRenameAstEntry<from mod1 import submod1 (ImportFrom L=2 C=6)>\n" + " Line: 1 from mod1 import submod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer2\n" + " ImportFromRenameAstEntry<from mod1 import submod1 (ImportFrom L=2 C=6)>\n" + " Line: 1 from mod1 import submod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer3\n" + " ImportFromRenameAstEntry<from importer2 import submod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from importer2 import submod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer3a\n" + " AttributeASTEntry<submod1 (NameTok L=3 C=16)>\n" + " Line: 2 my = importer2.submod1 #must be renamed because it'll be renamed on importer2 --> my = importer2.new_mod_name #must be renamed because it'll be renamed on importer2\n" + "\n" + "reflib.renamemodule.importer4\n" + " ImportFromRenameAstEntry<from importer3 import submod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from importer3 import submod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer5\n" + " ImportFromRenameAstEntry<from reflib.renamemodule.mod1 import submod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule.mod1 import submod1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule.importer6\n" + " FixedInputStringASTEntry<reflib.renamemodule.mod1.submod1 (Name L=1 C=2)>\n" + " Line: 0 'reflib.renamemodule.mod1.submod1' --> 'new_mod_name'\n" + "\n" + "reflib.renamemodule.mod1.submod1\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace4() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule2.mod_ren1", "new_mod_name", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule2.mod_ren1\n" + " ASTEntryWithSourceModule<Module (Module L=1 C=1)>\n" //This is the module renamed! + "\n" + "reflib.renamemodule2.mod_ren2\n" + " ImportFromRenameAstEntry<from reflib.renamemodule2 import mod_ren1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule2 import mod_ren1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule2.mod_ren3\n" + " ImportFromRenameAstEntry<from import mod_ren1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from . import mod_ren1 --> import new_mod_name\n" + "\n" + "reflib.renamemodule2.mod_ren4\n" + " ImportFromModPartRenameAstEntry<from mod_ren1 import Mod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from .mod_ren1 import Mod1 --> from new_mod_name import Mod1\n" + "\n" + "reflib.renamemodule2.mod_ren5\n" + " ImportFromModPartRenameAstEntry<from reflib.renamemodule2.mod_ren1 import Mod1 (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule2.mod_ren1 import Mod1 --> from new_mod_name import Mod1\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace5() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule3.__init__", "new_mod", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule3.__init__\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "reflib.renamemodule3.ren1\n" + " AttributeASTEntry<reflib (Name L=3 C=5)>\n" + " Line: 2 a = reflib.renamemodule3.pack1 --> a = new_mod.pack1\n" + " AttributeASTEntry<reflib (Name L=4 C=5)>\n" + " Line: 3 b = reflib.renamemodule3 --> b = new_mod\n" + " ImportFromModPartRenameAstEntry<from reflib.renamemodule3.pack1 import * (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule3.pack1 import * --> from new_mod.pack1 import *\n" + " ImportFromRenameAstEntry<import reflib.renamemodule3.pack1 (Import L=2 C=8)>\n" + " Line: 1 import reflib.renamemodule3.pack1 --> import new_mod.pack1\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace6() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule3.__init__", "my.new.mod", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule3.__init__\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "reflib.renamemodule3.ren1\n" + " AttributeASTEntry<reflib (Name L=3 C=5)>\n" + " Line: 2 a = reflib.renamemodule3.pack1 --> a = my.new.mod.pack1\n" + " AttributeASTEntry<reflib (Name L=4 C=5)>\n" + " Line: 3 b = reflib.renamemodule3 --> b = my.new.mod\n" + " ImportFromModPartRenameAstEntry<from reflib.renamemodule3.pack1 import * (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule3.pack1 import * --> from my.new.mod.pack1 import *\n" + " ImportFromRenameAstEntry<import reflib.renamemodule3.pack1 (Import L=2 C=8)>\n" + " Line: 1 import reflib.renamemodule3.pack1 --> import my.new.mod.pack1\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace7() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "renamemodule_root.__init__", "p2.bar", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "renamemodule_root.__init__\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "renamemodule_root.mod_in_root\n" + " FixedInputStringASTEntry<renamemodule_root (Name L=3 C=5)>\n" + " Line: 2 b = renamemodule_root.mod_in_root2 --> b = p2.bar.mod_in_root2\n" + " ImportFromRenameAstEntry<import renamemodule_root.mod_in_root2 (Import L=1 C=8)>\n" + " Line: 0 import renamemodule_root.mod_in_root2 --> import p2.bar.mod_in_root2\n" + "\n" + "renamemodule_root.mod_in_root3\n" + " ImportFromModPartRenameAstEntry<from renamemodule_root import mod_in_root2 (ImportFrom L=1 C=6)>\n" + " Line: 0 from renamemodule_root import mod_in_root2 --> from p2.bar import mod_in_root2\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace8() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "renamemodule_root.mod_in_root2", "p2", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "renamemodule_root.mod_in_root\n" + " AttributeASTEntry<renamemodule_root (Name L=3 C=5)>\n" + " Line: 2 b = renamemodule_root.mod_in_root2 --> b = p2\n" + " ImportFromRenameAstEntry<import renamemodule_root.mod_in_root2 (Import L=1 C=8)>\n" + " Line: 0 import renamemodule_root.mod_in_root2 --> import p2\n" + "\n" + "renamemodule_root.mod_in_root2\n" + " ASTEntryWithSourceModule<Module (Module L=1 C=1)>\n" + "\n" + "renamemodule_root.mod_in_root3\n" + " FixedInputStringASTEntry<mod_in_root2 (Name L=3 C=5)>\n" + " Line: 2 a = mod_in_root2 --> a = p2\n" + " ImportFromRenameAstEntry<from renamemodule_root import mod_in_root2 (ImportFrom L=1 C=6)>\n" + " Line: 0 from renamemodule_root import mod_in_root2 --> import p2\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace9() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule4", "p2", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule4\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "reflib.renamemodule4.mymod\n" + " FixedInputStringASTEntry<renamemodule4 (Name L=2 C=5)>\n" + " Line: 1 a = renamemodule4 --> a = p2\n" + " ImportFromRenameAstEntry<from reflib import renamemodule4 (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib import renamemodule4 --> import p2\n" + " ImportFromRenameAstEntry<import reflib.renamemodule4 (Import L=5 C=12)>\n" + " Line: 4 import reflib.renamemodule4 --> import p2\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace10() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "renamemodule5.__init__", "p2", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "renamemodule5.__init__\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "renamemodule5.app_setup\n" + " ImportFromModPartRenameAstEntry<from renamemodule5._tests.foo import RenameModule5 (ImportFrom L=3 C=6)>\n" + " Line: 2 from renamemodule5._tests.foo import RenameModule5 --> from p2._tests.foo import RenameModule5\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace11() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "renamemodule5._tests.foo", "p2", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "renamemodule5._tests.foo\n" + " ASTEntryWithSourceModule<Module (Module L=1 C=1)>\n" + "\n" + "renamemodule5.app_setup\n" + " ImportFromModPartRenameAstEntry<from renamemodule5._tests.foo import RenameModule5 (ImportFrom L=3 C=6)>\n" + " Line: 2 from renamemodule5._tests.foo import RenameModule5 --> from p2 import RenameModule5\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace12() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule6.scene", "p2", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule6.another\n" + " ImportFromModPartRenameAstEntry<from reflib.renamemodule6.scene import Scene (ImportFrom L=1 C=6)>\n" + " Line: 0 from reflib.renamemodule6.scene import Scene --> from p2 import Scene\n" + "\n" + "reflib.renamemodule6.scene\n" + " ASTEntryWithSourceModule<Module (Module L=1 C=1)>\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace13() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "testpkg._imp", "testpkg._impo", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "testpkg._imp\n" + " ASTEntryWithSourceModule<Module (Module L=1 C=1)>\n" + "\n", asStr); } public void testRenameModuleInWorkspace14() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "refname2", "reflib.refname3", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "refname\n" + " FixedInputStringASTEntry<refname2 (Name L=2 C=1)>\n" + " Line: 1 refname2.check() --> refname3.check()\n" + " ImportFromRenameAstEntry<import refname2 (Import L=1 C=8)>\n" + " Line: 0 import refname2 --> from reflib import refname3\n" + "\n" + "refname2\n" + " ASTEntryWithSourceModule<Module (Module L=1 C=1)>\n" + "\n" + "", asStr); } public void testRenameModuleInWorkspace15() throws Exception { Map<Tuple<String, File>, HashSet<ASTEntry>> referencesForModuleRename = getReferencesForModuleRename( "reflib.renamemodule7.inside7a", "reflib.renamemodule7.inside7b", false); String asStr = asStr(referencesForModuleRename); assertEquals( "" + "reflib.renamemodule7.inside7\n" + " ImportFromRenameAstEntry<from reflib.renamemodule7 import inside7a (ImportFrom L=1 C=6)>\n" + " Initial:\n" + "from reflib\\\n" + " .renamemodule7 import inside7a\n" + " Final:\n" + "from reflib.renamemodule7 import inside7b\n" + "\n" + "reflib.renamemodule7.inside7a\n" + " ASTEntryWithSourceModule<Module (Module L=0 C=0)>\n" + "\n" + "", asStr); } protected Map<Tuple<String, File>, HashSet<ASTEntry>> getReferencesForModuleRename(String moduleName, String newName, boolean expectError) { Map<Tuple<String, File>, HashSet<ASTEntry>> occurrencesToReturn = null; try { IProjectModulesManager modulesManager = (IProjectModulesManager) natureRefactoring.getAstManager() .getModulesManager(); IModule module = modulesManager.getModuleInDirectManager(moduleName, natureRefactoring, true); if (module == null) { if (!moduleName.endsWith("__init__")) { module = modulesManager.getModuleInDirectManager(moduleName + ".__init__", natureRefactoring, true); } if (module == null) { throw new RuntimeException("Unable to get source module for module:" + moduleName); } } ModuleRenameRefactoringRequest request = new ModuleRenameRefactoringRequest(module.getFile(), natureRefactoring, null); request.setAdditionalInfo(RefactoringRequest.FIND_REFERENCES_ONLY_IN_LOCAL_SCOPE, false); request.moduleName = moduleName; request.fillInitialNameAndOffset(); request.inputName = newName; PyRenameEntryPoint processor = new PyRenameEntryPoint(request); NullProgressMonitor nullProgressMonitor = new NullProgressMonitor(); checkStatus(processor.checkInitialConditions(nullProgressMonitor), expectError); lastProcessorUsed = processor; checkProcessors(); checkStatus(processor.checkFinalConditions(nullProgressMonitor, null), expectError); occurrencesToReturn = processor.getOccurrencesInOtherFiles(); occurrencesToReturn.put(new Tuple<String, File>(CURRENT_MODULE_IN_REFERENCES, null), processor.getOccurrences()); } catch (Exception e) { throw new RuntimeException(e); } return occurrencesToReturn; } }