Skip to content

Commit

Permalink
fixed package renaming
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexHaxe committed May 1, 2022
1 parent ae1f2f1 commit ed56ef5
Show file tree
Hide file tree
Showing 23 changed files with 158 additions and 67 deletions.
2 changes: 1 addition & 1 deletion .haxerc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"version": "deb58a3",
"version": "bd1a05d",
"resolveLibs": "scoped"
}
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## dev branch / next version (2.x.x)

## 2.1.3 (2022-05-01)

- fixed package renaming

## 2.1.2 (2022-04-25)

- fixed handling of loop iterator shadowing, fixes [vshaxe/vshaxe#136](https://github.com/vshaxe/vshaxe/issues/136)
Expand Down
4 changes: 2 additions & 2 deletions haxelib.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
"refactor"
],
"description": "A code renaming tool for Haxe",
"version": "2.1.2",
"releasenote": "fixed handling of loop iterator shadowing",
"version": "2.1.3",
"releasenote": "fixed package renaming",
"contributors": [
"AlexHaxe"
],
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@haxecheckstyle/haxe-rename",
"version": "2.1.2",
"version": "2.1.3",
"description": "Renaming tool for Haxe",
"repository": {
"type": "git",
Expand Down
19 changes: 14 additions & 5 deletions src/refactor/discover/File.hx
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,9 @@ class File {
if (packName.length <= 0) {
return Global;
}
if (packName == getPackage()) {
return SamePackage;
}
var fullModule:String = '$packName.$moduleName';
var fullSubModule:Null<String> = null;
if (moduleName == typeName) {
if (moduleName != typeName) {
fullSubModule = '$fullModule.$typeName';
}
for (importEntry in importList) {
Expand All @@ -64,9 +61,21 @@ class File {
}

if (importHxFile == null) {
if (packName == getPackage()) {
return SamePackage;
}
if (packName == getPackage()) {
return SamePackage;
}
return None;
}
return importHxFile.importsModule(packName, moduleName, typeName);
var result:ImportStatus = importHxFile.importsModule(packName, moduleName, typeName);
if (result == None) {
if (packName == getPackage()) {
return SamePackage;
}
}
return result;
}

public function getMainModulName():String {
Expand Down
83 changes: 41 additions & 42 deletions src/refactor/rename/RenamePackage.hx
Original file line number Diff line number Diff line change
Expand Up @@ -22,59 +22,58 @@ class RenamePackage {
changelist.addChange(file.name, InsertText('package ${context.what.toName};\n', {fileName: file.name, start: 0, end: 0}), identifier);
}

var newMainModulName:String = context.what.toName + "." + mainTypeName;
var mainModule:String = packageNamePrefix + mainTypeName;
var allUses:Array<Identifier> = context.nameMap.getIdentifiers(mainModule);
for (use in allUses) {
changelist.addChange(use.pos.fileName, ReplaceText(newMainModulName, use.pos), use);
}
for (type in file.typeList) {
var typeName:String = if (mainTypeName == type.name.name) {
type.name.name;
} else {
mainTypeName + "." + type.name;
if (mainTypeName == type.name.name) {
continue;
}
var typeName:String = type.name.name;

var fullModulName:String = packageNamePrefix + typeName;
var newFullModulName:String = context.what.toName + "." + typeName;
var allUses:Array<Identifier> = context.nameMap.getIdentifiers(fullModulName);
if (allUses != null) {
for (use in allUses) {
changelist.addChange(use.pos.fileName, ReplaceText(newFullModulName, use.pos), use);
}
allUses = context.nameMap.getIdentifiers(fullModulName);
for (use in allUses) {
changelist.addChange(use.pos.fileName, ReplaceText(newFullModulName, use.pos), use);
}

allUses = context.nameMap.getIdentifiers(type.name.name);
allUses = allUses.concat(context.nameMap.getStartsWith(type.name.name + "."));
var uniqueFiles:Array<String> = [];
if (allUses != null) {
for (use in allUses) {
if (use.pos.fileName == identifier.pos.fileName) {
// ignore self
continue;
}
if (uniqueFiles.contains(use.pos.fileName)) {
// only add once per file
continue;
}
var useFile:Null<File> = context.fileList.getFile(use.pos.fileName);
if (useFile == null) {
continue;
}
switch (useFile.importsModule(type.file.getPackage(), type.file.getMainModulName(), type.name.name)) {
case None | SamePackage:
case Global | Imported | ImportedWithAlias(_):
// imported old location -> skip (we renamed import in previous loop)
continue;
}
switch (useFile.importsModule(context.what.toName, type.file.getMainModulName(), type.name.name)) {
case None:
case Global | SamePackage | Imported | ImportedWithAlias(_):
// already imports new location -> skip
continue;
}
var importPos:IdentifierPos = {fileName: use.pos.fileName, start: useFile.importInsertPos, end: useFile.importInsertPos}
changelist.addChange(use.pos.fileName, InsertText('import $newFullModulName;\n', importPos), use);
fullModulName = packageNamePrefix + mainTypeName + "." + typeName;
newFullModulName = context.what.toName + "." + mainTypeName + "." + typeName;
allUses = context.nameMap.getIdentifiers(fullModulName);
for (use in allUses) {
changelist.addChange(use.pos.fileName, ReplaceText(newFullModulName, use.pos), use);
}
}
var uniqueFiles:Array<String> = [];

allUses = context.nameMap.getIdentifiers(mainTypeName);
for (use in allUses) {
if (use.file.name == file.name) {
continue;
}
if (use.file.getPackage() != packageName) {
continue;
}
if (uniqueFiles.contains(use.pos.fileName)) {
// only add once per file
continue;
}
switch (use.file.importsModule(packageName, mainTypeName, mainTypeName)) {
case None:
case Global | SamePackage:
var importPos:IdentifierPos = {fileName: use.pos.fileName, start: use.file.importInsertPos, end: use.file.importInsertPos}
changelist.addChange(use.pos.fileName, InsertText('import $newMainModulName;\n', importPos), use);
uniqueFiles.push(use.pos.fileName);
}
case Imported:
case ImportedWithAlias(_):
}
}

// TODO remove redundant imports

moveFileToPackage(context, file, changelist, packageName);
return Promise.resolve(changelist.execute());
}
Expand Down
2 changes: 2 additions & 0 deletions test/TestMain.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import refactor.EnumTest;
import refactor.ImportAliasTest;
import refactor.InterfaceTest;
import refactor.ModuleLevelStaticTest;
import refactor.PackageTest;
import refactor.ScopedLocalTest;
import refactor.TypedefTest;
import utest.Runner;
Expand All @@ -16,6 +17,7 @@ class TestMain {
new ImportAliasTest(),
new InterfaceTest(),
new ModuleLevelStaticTest(),
new PackageTest(),
new ScopedLocalTest(),
new TypedefTest()
];
Expand Down
1 change: 1 addition & 0 deletions test/import.hx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import refactor.TestEditableDocument;
import utest.Assert;
import utest.Async;
import utest.ITest;
Expand Down
2 changes: 0 additions & 2 deletions test/refactor/ClassTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class ClassTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/classes"]);
Expand Down
2 changes: 0 additions & 2 deletions test/refactor/EnumTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class EnumTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/enums"]);
Expand Down
2 changes: 0 additions & 2 deletions test/refactor/ImportAliasTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class ImportAliasTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/importalias"]);
Expand Down
2 changes: 0 additions & 2 deletions test/refactor/InterfaceTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class InterfaceTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/interfaces"]);
Expand Down
2 changes: 0 additions & 2 deletions test/refactor/ModuleLevelStaticTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class ModuleLevelStaticTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/modulelevelstatics"]);
Expand Down
48 changes: 48 additions & 0 deletions test/refactor/PackageTest.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package refactor;

class PackageTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/packages"]);
}

public function testRenameTypesModul(async:Async) {
var edits:Array<TestEdit> = [
makeReplaceTestEdit("testcases/packages/Main.hx", "packages.sub.Types.Type3", 53, 73),
makeReplaceTestEdit("testcases/packages/Main.hx", "packages.sub.Types", 82, 96),
makeReplaceTestEdit("testcases/packages/Main.hx", "packages.sub.Type1", 289, 303),
makeMoveTestEdit("testcases/packages/Types.hx", "testcases/packages/sub/Types.hx"),
makeReplaceTestEdit("testcases/packages/Types.hx", "packages.sub", 8, 16),

];
refactorAndCheck({fileName: "testcases/packages/Types.hx", toName: "packages.sub", pos: 12}, edits, async);
}

public function testRenameMoreTypesModul(async:Async) {
var edits:Array<TestEdit> = [
makeReplaceTestEdit("testcases/packages/Main.hx", "packages.sub.MoreTypes", 26, 44),
makeMoveTestEdit("testcases/packages/MoreTypes.hx", "testcases/packages/sub/MoreTypes.hx"),
makeReplaceTestEdit("testcases/packages/MoreTypes.hx", "packages.sub", 8, 16),
];
refactorAndCheck({fileName: "testcases/packages/MoreTypes.hx", toName: "packages.sub", pos: 12}, edits, async);
}

public function testRenameOtherTypesModul(async:Async) {
var edits:Array<TestEdit> = [
makeInsertTestEdit("testcases/packages/Main.hx", "import packages.sub.OtherTypes;\n", 19),
makeReplaceTestEdit("testcases/packages/Main.hx", "packages.sub.OtherTypes", 202, 221),
makeReplaceTestEdit("testcases/packages/Main.hx", "packages.sub.OtherTypes.OtherTypeA", 240, 270),
makeMoveTestEdit("testcases/packages/OtherTypes.hx", "testcases/packages/sub/OtherTypes.hx"),
makeReplaceTestEdit("testcases/packages/OtherTypes.hx", "packages.sub", 8, 16),
];
refactorAndCheck({fileName: "testcases/packages/OtherTypes.hx", toName: "packages.sub", pos: 12}, edits, async);
}

public function testRenameHelperTypesModul(async:Async) {
var edits:Array<TestEdit> = [
makeMoveTestEdit("testcases/packages/HelperTypes.hx", "testcases/packages/sub/HelperTypes.hx"),
makeReplaceTestEdit("testcases/packages/HelperTypes.hx", "packages.sub", 8, 16),
makeReplaceTestEdit("testcases/packages/import.hx", "packages.sub.HelperTypes", 26, 46),
];
refactorAndCheck({fileName: "testcases/packages/HelperTypes.hx", toName: "packages.sub", pos: 12}, edits, async);
}
}
2 changes: 0 additions & 2 deletions test/refactor/ScopedLocalTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class ScopedLocalTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/scopedlocal"]);
Expand Down
2 changes: 0 additions & 2 deletions test/refactor/TypedefTest.hx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package refactor;

import refactor.TestEditableDocument.TestEdit;

class TypedefTest extends TestBase {
function setupClass() {
setupTestSources(["testcases/typedefs"]);
Expand Down
6 changes: 6 additions & 0 deletions testcases/packages/HelperTypes.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package packages;

typedef HelperTypeA = {}
typedef HelperTypeB = {}
typedef HelperTypeC = {}
typedef HelperTypes = {}
16 changes: 16 additions & 0 deletions testcases/packages/Main.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package packages;

import packages.MoreTypes;
import packages.Types.Type3;
import packages.Types;

class Main {
static function main() {
var test:Type1 = {};
var test2:OtherTypes = {};
var test3:packages.OtherTypes = {};
var test4:packages.OtherTypes.OtherTypeA = {};
var test5:packages.Type1 = {};
var test6:HelperTypes;
}
}
6 changes: 6 additions & 0 deletions testcases/packages/MoreTypes.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package packages;

typedef TypeA = {}
typedef TypeB = {}
typedef TypeC = {}
typedef MoreTypes = {}
6 changes: 6 additions & 0 deletions testcases/packages/OtherTypes.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package packages;

typedef OtherTypeA = {}
typedef OtherTypeB = {}
typedef OtherTypeC = {}
typedef OtherTypes = {}
5 changes: 5 additions & 0 deletions testcases/packages/Types.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package packages;

typedef Type1 = {}
typedef Type2 = {}
typedef Type3 = {}
3 changes: 3 additions & 0 deletions testcases/packages/import.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package packages;

import packages.HelperTypes;

0 comments on commit ed56ef5

Please sign in to comment.