fix(refactoring): bootstrap JDT code template store headless (#98) #99
No reviewers
Labels
No labels
bug
build
enhancement
headless
P1-critical
P2-high
P3-medium
P4-low
refactoring
No milestone
No project
No assignees
2 participants
Due date
No due date set.
Dependencies
No dependencies set.
Reference
ai-tools/jdt-mcp-server!99
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/98-encapsulate-template-store"
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?
Basis: PR #96 (auf #95) — Branch
fix/61-51-refactoring-status, nichtmain.Befund
jdt_encapsulate_fieldscheiterte headless bei jedem Aufruf mitCannot invoke "TemplateStoreCore.getTemplateData(boolean)" because "this.fInstanceStore" is null.SelfEncapsulateFieldRefactoringrendert Getter-/Setter-Body ausJavaManipulation.getCodeTemplateStore()— ein statisches Feld, das nur dasorg.eclipse.jdt.ui-JavaPlugin beim Workbench-Start füllt. Headless startet diesesPlugin nie, das Feld bleibt null, und die NPE fliegt vor jeder Status-Prüfung.
Gleiche Bug-Klasse wie #77/#95 (jdt.ui-Bundle-Zustand headless).
Lösungsweg
HeadlessCodeTemplatesbaut den Store aus derselben Quelle auf, aus der auch dieWorkbench liest: den Default-Code-Templates, die
org.eclipse.jdt.uipertemplates/default-codetemplates.xmlam Extension Pointorg.eclipse.ui.editors.templatesbeiträgt. Die Extension Registry ist headlessverfügbar, es wird kein UI-Bundle aktiviert. Die Workbench-Implementierung
(
ContributionTemplateStore) war nicht nutzbar: sie braucht einen jfaceIPreferenceStoreund loggt überEditorsPlugin— genau der UI-Stack, aus demsich dieser Server heraushalten muss.
Installiert wird der Store in
HeadlessApplication.initHeadlessPreferences(), nebendem schon vorhandenen Bootstrap für Preference-Node-Id und Import-Order. Damit
profitiert jedes manipulation-Refactoring, das ein Template rendert, nicht nur dieses
eine Tool. Fehlt der Store trotzdem, meldet das Tool das jetzt selbsterklärend unter
Nennung der Template-Id, statt eine NPE durchzureichen.
Zweiter Defekt, der dadurch sichtbar wurde
Mit renderndem Template zeigte sich: das Tool übergab
Flags.AccPrivateansetVisibility(). Das setzt die Sichtbarkeit der generierten Accessoren, nicht diedes Feldes — das Feld macht das Refactoring ohnehin immer privat. Ergebnis war ein
privater Getter und Setter, den keine andere Klasse aufrufen kann; die zugesagte
Aktualisierung aller Feldzugriffe konnte so gar nicht funktionieren. Accessoren sind
jetzt
public.Andere Tools mit demselben Template-Store
Keine.
CodeGenerationTools.generateGettersSetters/generateConstructor/generateEqualsHashCode/generateToStringbauen ihren Quelltext perStringBuilderund fassen den Template-Store nicht an — geprüft, in diesem PRbewusst nicht angefasst. Der Bootstrap wirkt prozessweit, käme also auch künftigen
corext-Refactorings zugute.
Verifikation
mvn clean package(Tycho, Maven 3.9.14) grüntests/refactoring-test.sh: 3/3 — Test 3 vorher rot mit exakt der NPE aus demIssue, danach grün. Assertions lesen die Datei auf Platte: Feld
private, Getter undSetter vorhanden, beide Bodies gerendert (
return name;/this.name = name;),und die Antwort darf weder
NullPointerExceptionnochProjectTemplateStoreenthalten.
tests/smoke-test.sh: 9/9, 52 Toolsneben den Tests 0/0b aus PR #97 mergt.
Closes #98
🤖 Generated with Claude Code
https://claude.ai/code/session_018q6miiQHwQYFgZBy71aUhL
4189f3a54ftob37b82da5a