Skip to content

Commit

Permalink
fixed rename local symbol, fixes #4
Browse files Browse the repository at this point in the history
fixed rename public symbol, fixes #5
fixed crash on array comprehension, fixes #9
  • Loading branch information
AlexHaxe committed Sep 22, 2024
1 parent ea4c80f commit f914a1e
Show file tree
Hide file tree
Showing 10 changed files with 116 additions and 33 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
},
"haxe.enableCompilationServer": true,
"haxecheckstyle.sourceFolders": [
"src",
"test"
Expand Down
12 changes: 0 additions & 12 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,6 @@
"group": "build",
"label": "haxe: build.hxml"
},
{
"type": "hxml",
"file": "buildEval.hxml",
"problemMatcher": [
"$haxe-absolute",
"$haxe",
"$haxe-error",
"$haxe-trace"
],
"group": "build",
"label": "haxe: buildEval.hxml"
},
{
"type": "hxml",
"file": "test.hxml",
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

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

## 2.2.3 (2024-09-22)

- fixed package rename when identifier has multiple matches in folder structure, fixes [#3](https://github.com/HaxeCheckstyle/haxe-rename/issues/3)
- fixed failing to rename local symbol, fixes [#4](https://github.com/HaxeCheckstyle/haxe-rename/issues/4)
- fixed failing to rename simple public symbols, fixes [#5](https://github.com/HaxeCheckstyle/haxe-rename/issues/5)
- fixed crash on string interpolation, fixes [#6](https://github.com/HaxeCheckstyle/haxe-rename/issues/6)
- fixed crash when parsing a return macro @:pos, fixes [#8](https://github.com/HaxeCheckstyle/haxe-rename/issues/8)
- fixed crash with array comprehension, fixes [#9](https://github.com/HaxeCheckstyle/haxe-rename/issues/9)

## 2.2.2 (2022-05-23)

- fixed bug in readBlock passing incorrect child token
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.2.2",
"releasenote": "fixed bug in readBlock passing incorrect child token - see CHANGELOG",
"version": "2.2.3",
"releasenote": "fixed parser crashes and identifier discovery - see CHANGELOG",
"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.2.2",
"version": "2.2.3",
"description": "Renaming tool for Haxe",
"repository": {
"type": "git",
Expand Down
45 changes: 29 additions & 16 deletions src/refactor/discover/UsageCollector.hx
Original file line number Diff line number Diff line change
Expand Up @@ -577,28 +577,41 @@ class UsageCollector {
}
}

function readIdentifier(context:UsageContext, identifier:Identifier, token:Null<TokenTree>) {
var parent:TokenTree = token.parent;
if (parent.tok.match(Dot)) {
var prev:Null<TokenTree> = parent.previousSibling;
if (prev != null) {
switch (prev.tok) {
case BkClose | PClose:
makeIdentifier(context, token, ArrayAccess(prev.pos.min), identifier);
default:
}
}
} else {
makeIdentifier(context, token, Access, identifier);
}
if (token.hasChildren()) {
for (child in token.children) {
switch (child.tok) {
case Dot | Comma:
case POpen | Binop(OpAssign):
default:
readExpression(context, identifier, child);
}
}
}
}

function readExpression(context:UsageContext, identifier:Identifier, token:Null<TokenTree>) {
if (token == null) {
return;
}

switch (token.tok) {
case Const(CIdent(_)):
var parent:TokenTree = token.parent;
if (parent.tok.match(Dot)) {
var prev:Null<TokenTree> = parent.previousSibling;
if (prev != null) {
switch (prev.tok) {
case BkClose | PClose:
makeIdentifier(context, token, ArrayAccess(prev.pos.min), identifier);
return;
default:
}
}
} else {
makeIdentifier(context, token, Access, identifier);
return;
}
readIdentifier(context, identifier, token);
return;
case Kwd(KwdVar):
var fullPos:Position = token.parent.getPos();
var scopeEnd:Int = fullPos.max;
Expand Down Expand Up @@ -723,7 +736,7 @@ class UsageCollector {
loopIdentifiers.push(ident);
default:
readExpression(context, ident, child);
if (ident.uses != null) {
if (ident?.uses != null) {
for (use in ident.uses) {
switch (use.type) {
case Access:
Expand Down
35 changes: 35 additions & 0 deletions test/refactor/ClassTest.hx
Original file line number Diff line number Diff line change
Expand Up @@ -253,4 +253,39 @@ class ClassTest extends TestBase {
failRefactor({fileName: "testcases/classes/MyIdentifier.hx", toName: "refactor.Foo", pos: 44},
"renaming not supported for refactor.discover.File testcases/classes/MyIdentifier.hx@25-47 (ImportModul)", async);
}

public function testRenameDemoClassAMemberVar(async:Async) {
var edits:Array<TestEdit> = [
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 235, 245),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 529, 539),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 546, 556),
];
refactorAndCheck({fileName: "testcases/classes/DemoClassA.hx", toName: "wasRenamed", pos: 237}, edits, async);
}

public function testRenameDemoClassAMemberVar2(async:Async) {
var edits:Array<TestEdit> = [
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 235, 245),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 529, 539),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 546, 556),
];
refactorAndCheck({fileName: "testcases/classes/DemoClassA.hx", toName: "wasRenamed", pos: 531}, edits, async);
}

public function testRenameDemoClassAMemberVar3(async:Async) {
var edits:Array<TestEdit> = [
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 235, 245),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 529, 539),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 546, 556),
];
refactorAndCheck({fileName: "testcases/classes/DemoClassA.hx", toName: "wasRenamed", pos: 548}, edits, async);
}

public function testRenameDemoClassASomeValue(async:Async) {
var edits:Array<TestEdit> = [
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 59, 68),
makeReplaceTestEdit("testcases/classes/DemoClassA.hx", "wasRenamed", 515, 524),
];
refactorAndCheck({fileName: "testcases/classes/DemoClassA.hx", toName: "wasRenamed", pos: 61}, edits, async);
}
}
29 changes: 29 additions & 0 deletions testcases/classes/DemoClassA.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package testcases.classes;

class DemoClassA {
public var someValue:String;
}

class SomeOtherClass {
public function isEventFeatureFlag(aString:String):Bool {
return false;
}

public function new() {}
}

class WontRename {
var TESTRENAME:Bool = false;

var _view:{
isAssetsLoaded:Bool
};
var _someOtherClass:SomeOtherClass = new SomeOtherClass();

function _onFeatureEnds(event:DemoClassA) {
// misses a rename in the next line
if (_view.isAssetsLoaded && _someOtherClass.isEventFeatureFlag(event.someValue) && TESTRENAME) {
TESTRENAME = false;
}
}
}
8 changes: 8 additions & 0 deletions testcases/classes/ForceRenameCrash.hx
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@ class TestCrashMacro {
return Expr();
}
}

class CrashInForLoop {
final _vo = {posts: []};

inline final function updatePosts() {
var posts = [for (vo in _vo.posts) (new A(vo))];
}
}

0 comments on commit f914a1e

Please sign in to comment.