From e0a2986b2ab8d75c259e481492c6133500c768e1 Mon Sep 17 00:00:00 2001 From: Carsten Hammer Date: Tue, 22 Sep 2026 12:44:27 +0000 Subject: [PATCH 1/3] Use versioned JDT core template registry accessors Migrate the affected SDK template consumers to getTemplateContextRegistryCore(), require JDT UI 3.40.100, and exercise content-assist construction and the dependency floor in plug-in tests. Related: eclipse-jdt/eclipse.jdt.ui#3212 Related: eclipse-platform/eclipse.platform.releng.aggregator#4059 Assisted-by: OpenAI ChatGPT Signed-off-by: Carsten Hammer --- .../jdt/debug/tests/AutomatedSuite.java | 2 + .../debug/tests/ui/TemplateRegistryTests.java | 58 +++++++++++++++++++ org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF | 4 +- org.eclipse.jdt.debug.ui/pom.xml | 2 +- .../ui/actions/ToggleBreakpointAdapter.java | 4 +- .../JavaDebugContentAssistProcessor.java | 4 +- .../JavaSnippetCompletionProcessor.java | 2 +- 7 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/TemplateRegistryTests.java diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java index b5599e38f2..ffd3280d5b 100644 --- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java +++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java @@ -159,6 +159,7 @@ import org.eclipse.jdt.debug.tests.ui.JavaSnippetEditorTest; import org.eclipse.jdt.debug.tests.ui.NoLineNumberAttributesStatusHandlerTest; import org.eclipse.jdt.debug.tests.ui.OpenFromClipboardTests; +import org.eclipse.jdt.debug.tests.ui.TemplateRegistryTests; import org.eclipse.jdt.debug.tests.ui.ViewManagementTests; import org.eclipse.jdt.debug.tests.ui.VirtualThreadsDebugViewTests; import org.eclipse.jdt.debug.tests.ui.presentation.ModelPresentationTests; @@ -354,6 +355,7 @@ public AutomatedSuite() { // Scrapbook editor tests addTest(new TestSuite(JavaSnippetEditorTest.class)); + addTest(new TestSuite(TemplateRegistryTests.class)); // No Line Number Attributes Status Handler tests addTest(new TestSuite(NoLineNumberAttributesStatusHandlerTest.class)); diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/TemplateRegistryTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/TemplateRegistryTests.java new file mode 100644 index 0000000000..fc3cdd12ad --- /dev/null +++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/TemplateRegistryTests.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2026 Carsten Hammer and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.jdt.debug.tests.ui; + +import org.eclipse.jdt.internal.debug.ui.contentassist.CurrentFrameContext; +import org.eclipse.jdt.internal.debug.ui.contentassist.JavaDebugContentAssistProcessor; +import org.eclipse.jdt.internal.debug.ui.snippeteditor.JavaSnippetCompletionProcessor; +import org.eclipse.osgi.util.ManifestElement; +import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.Version; +import org.osgi.framework.VersionRange; + +import junit.framework.TestCase; + +/** + * Checks the registry linkage used when the debugger creates content assist. + */ +public class TemplateRegistryTests extends TestCase { + + public void testDebugContentAssistCanBeCreated() { + JavaDebugContentAssistProcessor processor = new JavaDebugContentAssistProcessor(new CurrentFrameContext()); + assertNotNull(processor.getContextInformationValidator()); + assertNull(processor.getErrorMessage()); + } + + public void testSnippetContentAssistCanBeCreated() { + // The editor is not used until completion is requested. Registry linkage + // must already succeed when the processor is constructed. + JavaSnippetCompletionProcessor processor = new JavaSnippetCompletionProcessor(null); + assertNotNull(processor.getContextInformationValidator()); + assertNull(processor.getErrorMessage()); + } + + public void testRequiresJdtWithCoreRegistryAccessors() throws Exception { + Bundle bundle = FrameworkUtil.getBundle(JavaDebugContentAssistProcessor.class); + ManifestElement[] required = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, + bundle.getHeaders().get(Constants.REQUIRE_BUNDLE)); + for (ManifestElement dependency : required) { + if ("org.eclipse.jdt.ui".equals(dependency.getValue())) { + VersionRange range = new VersionRange(dependency.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE)); + assertFalse("Must reject the JDT version without the Core accessors", range.includes(new Version("3.40.0"))); + assertTrue("Must accept the version introducing the Core accessors", range.includes(new Version("3.40.100"))); + return; + } + } + fail("Missing dependency on org.eclipse.jdt.ui"); + } +} diff --git a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF index 93196f242a..cb31e4c679 100644 --- a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.debug.ui; singleton:=true -Bundle-Version: 3.15.600.qualifier +Bundle-Version: 3.15.700.qualifier Bundle-Activator: org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -42,7 +42,7 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)", org.eclipse.debug.ui;bundle-version="[3.13.400,4.0.0)", org.eclipse.jdt.debug;bundle-version="[3.23.0,4.0.0)", org.eclipse.jdt.launching;bundle-version="[3.23.0,4.0.0)", - org.eclipse.jdt.ui;bundle-version="[3.33.0,4.0.0)", + org.eclipse.jdt.ui;bundle-version="[3.40.100,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.30.0,4.0.0)", org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)", org.eclipse.ui.console;bundle-version="[3.4.0,4.0.0)", diff --git a/org.eclipse.jdt.debug.ui/pom.xml b/org.eclipse.jdt.debug.ui/pom.xml index e72d2c48b7..b71c1112d5 100644 --- a/org.eclipse.jdt.debug.ui/pom.xml +++ b/org.eclipse.jdt.debug.ui/pom.xml @@ -18,7 +18,7 @@ org.eclipse.jdt org.eclipse.jdt.debug.ui - 3.15.600-SNAPSHOT + 3.15.700-SNAPSHOT eclipse-plugin true diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java index e7836f57dd..f4096fa3d3 100644 --- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java +++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java @@ -1893,7 +1893,7 @@ private static String getCodeTemplate(ITextSelection textSelection, JavaEditor p if (viewer == null) { return null; } - TemplateContextType contextType = JavaPlugin.getDefault().getTemplateContextRegistry().getContextType(JavaContextType.ID_STATEMENTS); + TemplateContextType contextType = JavaPlugin.getDefault().getTemplateContextRegistryCore().getContextType(JavaContextType.ID_STATEMENTS); final AtomicReference templateBuffer = new AtomicReference<>(); Display.getDefault().syncExec(() -> doGetCodeTemplate(textSelection, part, viewer, contextType, templateBuffer)); return templateBuffer.get(); @@ -1923,7 +1923,7 @@ private static void doGetCodeTemplate(ITextSelection textSelection, JavaEditor p for (TemplateProposal templateProposal : templateProposals) { Template template = templateProposal.getTemplate(); if (template.getName().equals("systrace")) { //$NON-NLS-1$ - CompilationUnitContextType cuContextType = (CompilationUnitContextType) JavaPlugin.getDefault().getTemplateContextRegistry().getContextType(template.getContextTypeId()); + CompilationUnitContextType cuContextType = (CompilationUnitContextType) JavaPlugin.getDefault().getTemplateContextRegistryCore().getContextType(template.getContextTypeId()); DocumentTemplateContext context = cuContextType.createContext(document, line.getOffset(), 0, cunit); context.setVariable("selection", EMPTY_STRING); //$NON-NLS-1$ ((CompilationUnitContext) context).setForceEvaluation(true); diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java index 5d639e0942..6c661a9e81 100644 --- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java +++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/contentassist/JavaDebugContentAssistProcessor.java @@ -58,11 +58,11 @@ public class JavaDebugContentAssistProcessor implements IContentAssistProcessor public JavaDebugContentAssistProcessor(IJavaDebugContentAssistContext context) { fContext = context; - TemplateContextType contextType= JavaPlugin.getDefault().getTemplateContextRegistry().getContextType(JavaContextType.ID_ALL); + TemplateContextType contextType= JavaPlugin.getDefault().getTemplateContextRegistryCore().getContextType(JavaContextType.ID_ALL); if (contextType != null) { fJavaEngine= new TemplateEngine(contextType); } - contextType = JavaPlugin.getDefault().getTemplateContextRegistry().getContextType(JavaContextType.ID_STATEMENTS); + contextType = JavaPlugin.getDefault().getTemplateContextRegistryCore().getContextType(JavaContextType.ID_STATEMENTS); if (contextType != null) { fStatementEngine= new TemplateEngine(contextType); } diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java index 2a398f1eff..6196ca0b33 100644 --- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java +++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/snippeteditor/JavaSnippetCompletionProcessor.java @@ -53,7 +53,7 @@ public class JavaSnippetCompletionProcessor implements IContentAssistProcessor { public JavaSnippetCompletionProcessor(JavaSnippetEditor editor) { fEditor= editor; - TemplateContextType contextType= JavaPlugin.getDefault().getTemplateContextRegistry().getContextType("java"); //$NON-NLS-1$ + TemplateContextType contextType= JavaPlugin.getDefault().getTemplateContextRegistryCore().getContextType("java"); //$NON-NLS-1$ if (contextType != null) { fTemplateEngine= new TemplateEngine(contextType); } From 08169b7cffb4ba3f5c5899210ff8d5041dfce8c3 Mon Sep 17 00:00:00 2001 From: Carsten Hammer Date: Tue, 22 Sep 2026 14:49:31 +0200 Subject: [PATCH 2/3] Keep the already advanced debugger service version The dependency floor distinguishes the new provider; a second consumer service increment in this release is rejected by API Tools. Assisted-by: OpenAI ChatGPT Signed-off-by: Carsten Hammer --- org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF index cb31e4c679..c3667c7d1c 100644 --- a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.debug.ui; singleton:=true -Bundle-Version: 3.15.700.qualifier +Bundle-Version: 3.15.600.qualifier Bundle-Activator: org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin From c37a60078154eb9d98c071dad720fdbefffdf31c Mon Sep 17 00:00:00 2001 From: Carsten Hammer Date: Tue, 22 Sep 2026 14:50:06 +0200 Subject: [PATCH 3/3] Align the debugger POM with its existing service version Assisted-by: OpenAI ChatGPT Signed-off-by: Carsten Hammer --- org.eclipse.jdt.debug.ui/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jdt.debug.ui/pom.xml b/org.eclipse.jdt.debug.ui/pom.xml index b71c1112d5..e72d2c48b7 100644 --- a/org.eclipse.jdt.debug.ui/pom.xml +++ b/org.eclipse.jdt.debug.ui/pom.xml @@ -18,7 +18,7 @@ org.eclipse.jdt org.eclipse.jdt.debug.ui - 3.15.700-SNAPSHOT + 3.15.600-SNAPSHOT eclipse-plugin true