jdt_move_type: Änderungen werden nicht auf Disk geschrieben #79
Labels
No labels
bug
build
enhancement
headless
P1-critical
P2-high
P3-medium
P4-low
refactoring
No milestone
No project
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set.
Reference
ai-tools/jdt-mcp-server#79
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
jdt_move_typemeldetSUCCESS, aber die Änderungen landen nicht auf dem Filesystem. Das Refactoring findet nur im In-Memory-Buffer statt.Reproduktion
Rückgabe:
{"status": "SUCCESS", "newLocation": "de.g4ch.cg.shared.vocab.VocabAs"}Tatsächliches Ergebnis auf Disk:
Ursache
Change.perform()schreibt im Headless-Mode in denITextFileBufferManagerIn-Memory-Buffer. Ohne Eclipse UI fehlt der automatische Save.Bisheriger Fix-Versuch (Problem 3)
In
RefactoringSupport.performChange()wurde ein expliziter Flush implementiert:IFiles aus dem Change-Tree sammelnICompilationUnit.hasUnsavedChanges()prüfencu.save()aufrufenrefreshLocal()auf betroffene ProjekteDieser Fix greift nicht zuverlässig. Mögliche Ursachen:
hasUnsavedChanges()liefertfalseobwohl der Buffer dirty istNächster Schritt
Log-Output in
RefactoringSupport.performChange()hinzufügen, um zu prüfen:Kontext
Reproduziert in zwei unabhängigen Sessions (ActorId, VocabAs) mit identischem Verhalten — jeweils genau 1 von ~85 Dateien auf Disk aktualisiert. Siehe
agent_communication.md(Problem 3 + Problem 5).Umbau-Versuch auf Branch
fix/79-move-type-cross-moduleEin weiterer Fix-Versuch liegt isoliert auf Branch
fix/79-move-type-cross-module(gepusht). Er kompiliert sauber (mvn clean compile), die Disk-Schreib-Ursache ist aber noch nicht verifiziert.Was der Branch ändert
move_type:MoveDescriptor→ interneJavaMoveProcessor-API (voller Workspace-Scope für Referenzsuche); neuertargetProject-Param für Cross-Modul-Moves; Heartbeat gegen MCP-Timeout bei großen Moves.RefactoringSupport.performChange(): globalerWORKSPACE_MUTATION_LOCK, Headless-AssertionFailedException-Handling, Reflection-basierte Fallbacks (manueller File-Move + manuellerTextEdit-Apply) fürMoveCompilationUnitChange.performChange;MANIFEST.MF+org.eclipse.core.filebuffers.Status / offen
⚠️ Noch nicht mergen. Ob jetzt tatsächlich alle ~85 Dateien auf Disk landen, ist ungeprüft. Nächster Schritt: End-to-End-Verifikation gegen
tests/fixtures/fixture-external— Quelle gelöscht, Zieldatei erstellt, alle Import-Updates auf Disk. Erst grün → PR nachmain.Die eigenständigen Nebenfixes dieser Session (mcpServers-Wrapper, OSGi-Version, Throwable-Catch, self-healing Nav-Errors + Index-Probe, Maven-Dep-Rewire, Launcher-Recovery) sind bereits auf
main.Debugging-Historie aus
agent_communication.md(Datei wird gelöscht, Stand 2026-04-10)Vier zusammenwirkende Headless-Bugs, iterativ mit der Platform-Session verifiziert (Cross-Modul-Move
VocabAs→cg-shared-kernel, 85 Referenzen):Bug A —
TextFileChangeschreibt nicht auf Disk.TextFileChange.releaseDocument()wirftAssertionFailedExceptionvor dem Save-Code.FORCE_SAVE+IWorkspace.run()löst das für die meisten TextFileChanges; für die Move-Quelldatei nicht, dort ist der Buffer nach dem Assert korrupt.Bug B —
MoveCompilationUnitChangecrasht headless.doPerformReorg()→CompilationUnit.move()aktiviertorg.eclipse.jdt.ui→ClassNotFoundException. Fix: manueller Move als Fallback (Quelldatei von Disk lesen, nicht über CU-Buffer; Package-Deklaration anpassen; Ziel viaIPackageFragment.createCompilationUnit(); Quelle löschen). Verifiziert (Fixtures, Version ≥ 202604101145).Bug C — Cross-Modul-Ziel im falschen Projekt.
moveType()suchte das Target-Package nur im Source-Root des Quell-Typs;findPackageInSourceProject()reichte nicht. Fix: optionalertargetProject-Parameter, ohne ihn bei Mehrdeutigkeit hilfreicher Fehler statt stillem Fehlplatzieren. Verifiziert durch Platform-Session (Version 202604101200): Quelle gelöscht, Ziel im richtigen Projekt.Bug D — Import-Updates: 1 von 85 auf Disk (offen). Nach der
AssertionFailedExceptionist derITextFileBufferdisconnected:getTextFileBuffer()liefertnulloderisDirty()istfalse, daher greiftbuffer.commit()nicht. Sackgasse: Pre-Connect viabufferManager.connect()vorperform()macht es schlimmer, bricht die Referenzzählung, danach wirft jede Datei den Assert. Letzter Ansatz (Version 202604101442): bei Assert dasTextEditper Reflection aus dem Change holen (FeldfEdit), Datei von Disk lesen,edit.copy().apply(doc), viaIFile.setContents()zurückschreiben. In Fixtures grün (intra-Modul, 3 Dateien), gegen den 85-Dateien-Fall nicht mehr verifiziert. Genau dieser Stand liegt auffix/79-move-type-cross-module(siehe Kommentar oben).Offene Frage für die Verifikation: Ob der Reflection-Pfad wirklich für alle betroffenen
TextFileChanges erreicht wird, oder ob der Assert nur bei einem Teil feuert und der Rest still im Buffer bleibt.