Skip to content

Commit 2f03d9d

Browse files
authored
added ExtractType and ExtractInterface refactoring via rename lib (#133)
* added Extract Type refactoring option * added Extract Interface refactoring option, fixes vshaxe/vshaxe#649 * added auto-discovery of classpath for rename cache - deprecating haxe.renameSourceFolders setting for Haxe 4 * added formatting option to text edits * added Extract Method refactoring option, fixes vshaxe/vshaxe#632 * added Extract Constructor Params refactor module * added Rewrite Vars to Finals and vice versa * added disableRefactorCache to allow disabling refactor cache * added Wrap With Try…Catch refactor module * added a delay for recently renamed files to ensure refactor cache doesn't see partial changes / duplicate types * added null check for hover.range, fixes vshaxe/vshaxe#641 * updated formatter and json2object libs * refactored rename cache * fixed repeated rename operations breaking rename cache * fixed rename / refactor operations not working on unsaved files * fixed formatter check failing with formatter git version * remove full cache invalidation before rename / refactor operation
1 parent 900c057 commit 2f03d9d

23 files changed

+967
-822
lines changed

.github/workflows/formatting.yml

+1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ jobs:
1313
submodules: true
1414
- run: |
1515
npm ci
16+
npx lix install haxelib:formatter
1617
npx lix run formatter -s . --check

.haxerc

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"version": "b537e99",
2+
"version": "2dc801f",
33
"resolveLibs": "scoped"
4-
}
4+
}

haxe_libraries/formatter.hxml

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# @install: lix --silent download "haxelib:/formatter#1.17.1" into formatter/1.17.1/haxelib
2-
# @run: haxelib run-dir formatter "${HAXE_LIBCACHE}/formatter/1.17.1/haxelib"
3-
-cp ${HAXE_LIBCACHE}/formatter/1.17.1/haxelib/src
4-
-D formatter=1.17.1
1+
# @install: lix --silent download "haxelib:/formatter#1.18.0" into formatter/1.18.0/haxelib
2+
# @run: haxelib run-dir formatter "${HAXE_LIBCACHE}/formatter/1.18.0/haxelib"
3+
-cp ${HAXE_LIBCACHE}/formatter/1.18.0/haxelib/src
4+
-D formatter=1.18.0

haxe_libraries/json2object.hxml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# @install: lix --silent download "gh://github.com/elnabo/json2object#429986134031cbb1980f09d0d3d642b4b4cbcd6a" into json2object/3.11.0/github/429986134031cbb1980f09d0d3d642b4b4cbcd6a
1+
# @install: lix --silent download "gh://github.com/elnabo/json2object#a75859de1e966c09e73591b6c9186086c143fe60" into json2object/3.11.0/github/a75859de1e966c09e73591b6c9186086c143fe60
22
-lib hxjsonast
3-
-cp ${HAXE_LIBCACHE}/json2object/3.11.0/github/429986134031cbb1980f09d0d3d642b4b4cbcd6a/src
3+
-cp ${HAXE_LIBCACHE}/json2object/3.11.0/github/a75859de1e966c09e73591b6c9186086c143fe60/src
44
-D json2object=3.11.0

haxe_libraries/rename.hxml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# @install: lix --silent download "haxelib:/rename#2.3.0" into rename/2.3.0/haxelib
2-
-cp ${HAXE_LIBCACHE}/rename/2.3.0/haxelib/src
3-
-D rename=2.3.0
1+
# @install: lix --silent download "haxelib:/rename#3.0.0" into rename/3.0.0/haxelib
2+
-cp ${HAXE_LIBCACHE}/rename/3.0.0/haxelib/src
3+
-D rename=3.0.0

package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vshaxe/haxe-language-server",
3-
"version": "2.32.2",
3+
"version": "2.33.0",
44
"devDependencies": {
55
"lix": "^15.12.0",
66
"terser": "^5.15.0"

src/haxeLanguageServer/Configuration.hx

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ typedef UserConfig = {
102102
var importsSortOrder:ImportsSortOrderConfig;
103103
var maxCompletionItems:Int;
104104
var renameSourceFolders:Array<String>;
105+
var disableRefactorCache:Bool;
105106
var inlayHints:InlayHintConfig;
106107
var serverRecording:ServerRecordingConfig;
107108
}
@@ -202,6 +203,7 @@ class Configuration {
202203
importsSortOrder: AllAlphabetical,
203204
maxCompletionItems: 1000,
204205
renameSourceFolders: ["src", "source", "Source", "test", "tests"],
206+
disableRefactorCache: false,
205207
inlayHints: {
206208
variableTypes: false,
207209
parameterNames: false,

src/haxeLanguageServer/Context.hx

+14-1
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ import haxeLanguageServer.features.haxe.GotoDefinitionFeature;
2222
import haxeLanguageServer.features.haxe.GotoImplementationFeature;
2323
import haxeLanguageServer.features.haxe.GotoTypeDefinitionFeature;
2424
import haxeLanguageServer.features.haxe.InlayHintFeature;
25+
import haxeLanguageServer.features.haxe.RefactorFeature;
2526
import haxeLanguageServer.features.haxe.RenameFeature;
2627
import haxeLanguageServer.features.haxe.SignatureHelpFeature;
2728
import haxeLanguageServer.features.haxe.WorkspaceSymbolsFeature;
2829
import haxeLanguageServer.features.haxe.codeAction.CodeActionFeature;
2930
import haxeLanguageServer.features.haxe.documentSymbols.DocumentSymbolsFeature;
3031
import haxeLanguageServer.features.haxe.foldingRange.FoldingRangeFeature;
32+
import haxeLanguageServer.features.haxe.refactoring.RefactorCache;
3133
import haxeLanguageServer.server.DisplayResult;
3234
import haxeLanguageServer.server.HaxeServer;
3335
import haxeLanguageServer.server.ServerRecording;
@@ -64,6 +66,7 @@ class Context {
6466
@:nullSafety(Off) public var findReferences(default, null):FindReferencesFeature;
6567
@:nullSafety(Off) public var determinePackage(default, null):DeterminePackageFeature;
6668
@:nullSafety(Off) public var diagnostics(default, null):DiagnosticsFeature;
69+
@:nullSafety(Off) public var refactorCache(default, null):RefactorCache;
6770
public var experimental(default, null):Null<ExperimentalCapabilities>;
6871

6972
var activeEditor:Null<DocumentUri>;
@@ -376,7 +379,8 @@ class Context {
376379
new GotoTypeDefinitionFeature(this);
377380
findReferences = new FindReferencesFeature(this);
378381
determinePackage = new DeterminePackageFeature(this);
379-
new RenameFeature(this);
382+
refactorCache = new RefactorCache(this);
383+
new RenameFeature(this, refactorCache);
380384
diagnostics = new DiagnosticsFeature(this);
381385
new CodeActionFeature(this);
382386
new CodeLensFeature(this);
@@ -390,6 +394,7 @@ class Context {
390394
} else {
391395
haxeServer.restart(reason, function() {
392396
onServerStarted();
397+
refactorCache.initClassPaths();
393398
if (activeEditor != null) {
394399
publishDiagnostics(activeEditor);
395400
}
@@ -416,6 +421,7 @@ class Context {
416421
serverRecording.onDidChangeTextDocument(event);
417422
invalidateFile(uri);
418423
documents.onDidChangeTextDocument(event);
424+
refactorCache.invalidateFile(uri.toFsPath().toString());
419425
}
420426
}
421427

@@ -432,6 +438,7 @@ class Context {
432438
if (isUriSupported(uri)) {
433439
publishDiagnostics(uri);
434440
invalidated.remove(uri.toString());
441+
refactorCache.invalidateFile(uri.toFsPath().toString());
435442
}
436443
}
437444

@@ -447,6 +454,9 @@ class Context {
447454
invalidateFile(change.uri);
448455
case _:
449456
}
457+
if (change.uri.isHaxeFile()) {
458+
refactorCache.invalidateFile(change.uri.toFsPath().toString());
459+
}
450460
}
451461
}
452462

@@ -466,6 +476,9 @@ class Context {
466476
}
467477

468478
function onDidChangeActiveTextEditor(params:{uri:DocumentUri}) {
479+
if (!params.uri.isFile() || !params.uri.isHaxeFile()) {
480+
return;
481+
}
469482
activeEditor = params.uri;
470483
final document = documents.getHaxe(params.uri);
471484
if (document == null) {

src/haxeLanguageServer/features/haxe/DeterminePackageFeature.hx

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class DeterminePackageFeature {
2020

2121
function handleJsonRpc(path:FsPath, token:Null<CancellationToken>, resolve:{pack:String}->Void, reject:ResponseError<NoData>->Void) {
2222
context.callHaxeMethod(DisplayMethods.DeterminePackage, {file: path}, token, function(result) {
23+
if (result == null) {
24+
reject(ResponseError.internalError("unable to determine package of module"));
25+
return null;
26+
}
2327
resolve({pack: result.join(".")});
2428
return null;
2529
}, reject.handler());

src/haxeLanguageServer/features/haxe/HoverFeature.hx

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class HoverFeature {
3333
function handleJsonRpc(params:TextDocumentPositionParams, token:CancellationToken, resolve:Null<Hover>->Void, reject:ResponseError<NoData>->Void,
3434
doc:HxTextDocument, offset:Int) {
3535
context.callHaxeMethod(DisplayMethods.Hover, {file: doc.uri.toFsPath(), contents: doc.content, offset: offset}, token, function(hover) {
36-
if (hover == null) {
36+
if (hover == null || hover.range == null) {
3737
resolve(null);
3838
} else {
3939
final range = context.displayOffsetConverter.byteRangeToCharacterRange(hover.range, doc);

src/haxeLanguageServer/features/haxe/InlayHintFeature.hx

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class InlayHintFeature {
6262
if (root == null) {
6363
return reject.noFittingDocument(uri);
6464
}
65-
#if debug
65+
#if debug_inlayhints
6666
trace('[inlayHints] requesting inlay hints for $fileName lines ${params.range.start.line}-${params.range.end.line}');
6767
#end
6868
removeCancelledRequests();

0 commit comments

Comments
 (0)