From 33093deaf3731c44610f35c3f4f25fa2f5e39436 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 9 Jan 2026 14:45:49 +0100 Subject: [PATCH 01/28] Start implementing custom code templates Still WIP --- .../icons/full/obj16/template_obj.svg | Bin 0 -> 387 bytes org.eclipse.tm4e.ui/plugin.properties | 1 + org.eclipse.tm4e.ui/plugin.xml | 40 +++ .../java/org/eclipse/tm4e/ui/TMImages.java | 93 +++++++ .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 100 ++++++++ .../CustomCodeTemplatePreferencePage.java | 87 +++++++ .../Tm4eTemplateCompletionProcessor.java | 234 ++++++++++++++++++ .../ui/internal/templates/package-info.java | 6 + .../AbstractTm4eTemplateContextType.java | 58 +++++ .../templates/CommentTemplateContextType.java | 27 ++ .../DefaultTm4eTemplateContextType.java | 28 +++ ...cumentationCommentTemplateContextType.java | 27 ++ .../tm4e/ui/templates/package-info.java | 6 + .../resources/templates/templates.properties | 4 + .../main/resources/templates/templates.xml | 13 + 15 files changed, 724 insertions(+) create mode 100644 org.eclipse.tm4e.ui/icons/full/obj16/template_obj.svg create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMImages.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/package-info.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/package-info.java create mode 100644 org.eclipse.tm4e.ui/src/main/resources/templates/templates.properties create mode 100644 org.eclipse.tm4e.ui/src/main/resources/templates/templates.xml diff --git a/org.eclipse.tm4e.ui/icons/full/obj16/template_obj.svg b/org.eclipse.tm4e.ui/icons/full/obj16/template_obj.svg new file mode 100644 index 0000000000000000000000000000000000000000..377d931416e7c190677b17d700a67cce70ec7760 GIT binary patch literal 387 zcmV-}0et?6P)TR1kJ3(vRKZN*I~pv?f@9u$^VJANX?xsm&<*9Ed%!WiKy0(X-;SeQ#7 znIMQEm>?(wb2$B7>!@Wi%RK;S^z%PKel47w-JmE67-K3CYkM0j^#Y6YN$nH)-yU2E;H_yDT}mg~B3vZ??8002ovPDHLkV1n8No96%k literal 0 HcmV?d00001 diff --git a/org.eclipse.tm4e.ui/plugin.properties b/org.eclipse.tm4e.ui/plugin.properties index 17e97ed0b..dcf288dd2 100644 --- a/org.eclipse.tm4e.ui/plugin.properties +++ b/org.eclipse.tm4e.ui/plugin.properties @@ -29,6 +29,7 @@ TextMatePreferencePage.name=TextMate GrammarPreferencePage.name=Grammar TaskTagsPreferencePage.name=Task Tags ThemePreferencePage.name=Theme +TemplatesPreferencePage.name=Templates (TM4E) # Wizards TextMateWizard.category=TextMate diff --git a/org.eclipse.tm4e.ui/plugin.xml b/org.eclipse.tm4e.ui/plugin.xml index fc7ffbb05..50ac6d9ac 100644 --- a/org.eclipse.tm4e.ui/plugin.xml +++ b/org.eclipse.tm4e.ui/plugin.xml @@ -71,6 +71,11 @@ class="org.eclipse.tm4e.ui.internal.preferences.ThemePreferencePage" id="org.eclipse.tm4e.ui.preferences.ThemePreferencePage" category="org.eclipse.tm4e.ui.preferences.TextMatePreferencePage" /> + + @@ -155,4 +160,39 @@ class="org.eclipse.tm4e.ui.internal.hover.TMTokenTextHover" contentType="org.eclipse.core.runtime.text" /> + + + + + + + + + + + + + + + + + + diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMImages.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMImages.java new file mode 100644 index 000000000..caae3b459 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMImages.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui; + +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.swt.graphics.Image; +import org.osgi.framework.Bundle; + +public final class TMImages { + + private static final String ICONS_PATH = "$nl$/icons/full/"; //$NON-NLS-1$ + private static final String OBJECT = ICONS_PATH + "obj16/"; // basic colors - size 16x16 //$NON-NLS-1$ + + public static final String IMG_TEMPLATE = "IMG_TEMPALTE"; //$NON-NLS-1$ + + private TMImages() { + // no instantiation desired + } + + private static @Nullable ImageRegistry imageRegistry; + + public static void initalize(final ImageRegistry registry) { + imageRegistry = registry; + + registerImage(IMG_TEMPLATE, OBJECT + "template_obj.svg"); //$NON-NLS-1$ + } + + private static void registerImage(final String key, final String path) { + ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor(); + final Bundle bundle = Platform.getBundle(TMUIPlugin.PLUGIN_ID); + final ImageRegistry imageRegistry = getImageRegistry(); + URL url = null; + if (bundle != null) { + url = FileLocator.find(bundle, new Path(path), null); + if (url != null) { + desc = ImageDescriptor.createFromURL(url); + } + } + if (imageRegistry != null) { + imageRegistry.put(key, desc); + } + } + + /** + * Returns the {@link Image} identified by the given key, or null if it does not exist. + */ + public static @Nullable Image getImage(final String key) { + final ImageRegistry imageRegistry = getImageRegistry(); + if (imageRegistry == null) { + return null; + } + return imageRegistry.get(key); + } + + /** + * Returns the {@link ImageDescriptor} identified by the given key, or null if it does not exist. + */ + public static @Nullable ImageDescriptor getImageDescriptor(final String key) { + final ImageRegistry imageRegistry = getImageRegistry(); + if (imageRegistry == null) { + return null; + } + return imageRegistry.getDescriptor(key); + } + + public static @Nullable ImageRegistry getImageRegistry() { + if (imageRegistry == null) { + final TMUIPlugin plugin = TMUIPlugin.getDefault(); + if (plugin == null) { + return null; + } + imageRegistry = plugin.getImageRegistry(); + } + return imageRegistry; + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 1b20bbca6..6b6dbbd8d 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -8,9 +8,12 @@ * * Contributors: * Angelo Zerr - initial API and implementation + * Dietrich Travkin (SOLUNAR GmbH) - Additions for custom code templates */ package org.eclipse.tm4e.ui; +import java.io.IOException; +import java.util.Iterator; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -19,14 +22,24 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.text.templates.TemplateContextType; +import org.eclipse.jface.text.templates.persistence.TemplateStore; +import org.eclipse.text.templates.ContextTypeRegistry; +import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.ui.internal.model.TMModelManager; import org.eclipse.tm4e.ui.internal.samples.SampleManager; import org.eclipse.tm4e.ui.internal.themes.ThemeManager; import org.eclipse.tm4e.ui.model.ITMModelManager; import org.eclipse.tm4e.ui.samples.ISampleManager; +import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; +import org.eclipse.tm4e.ui.templates.DefaultTm4eTemplateContextType; +import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; import org.eclipse.tm4e.ui.themes.ColorManager; import org.eclipse.tm4e.ui.themes.IThemeManager; +import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; +import org.eclipse.ui.editors.text.templates.ContributionTemplateStore; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; @@ -39,9 +52,17 @@ public class TMUIPlugin extends AbstractUIPlugin { public static final String PLUGIN_ID = "org.eclipse.tm4e.ui"; //$NON-NLS-1$ private static final String TRACE_ID = PLUGIN_ID + "/trace"; //$NON-NLS-1$ + // IDs for custom code templates + private static final String CUSTOM_TEMPLATES_KEY = PLUGIN_ID + ".text.templates.custom"; //$NON-NLS-1$ + private static final String TEMPLATES_REGISTRY_ID = PLUGIN_ID + ".templates"; //$NON-NLS-1$ + // The shared instance private static volatile @Nullable TMUIPlugin plugin; + // registry and store for custom code templates + private @Nullable ContributionContextTypeRegistry contextTypeRegistry = null; + private @Nullable TemplateStore templateStore = null; + /** * Returns the shared instance * @@ -146,12 +167,91 @@ public void close() throws SecurityException { } }); } + + TMImages.initalize(getImageRegistry()); } @Override public void stop(final BundleContext context) throws Exception { + if (templateStore != null) { + templateStore.stopListeningForPreferenceChanges(); + } ColorManager.getInstance().dispose(); plugin = null; super.stop(context); } + + public ContextTypeRegistry getTemplateContextRegistry() { + @NonNull + ContributionContextTypeRegistry result; + + if (contextTypeRegistry == null) { + result = new ContributionContextTypeRegistry(TEMPLATES_REGISTRY_ID); + contextTypeRegistry = result; + + result.addContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); + result.addContextType(CommentTemplateContextType.CONTEXT_ID); + result.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); + + // TODO add language-specific context types, probably from extensions + } else { + result = NullSafetyHelper.castNonNull(contextTypeRegistry); + } + return result; + } + + @SuppressWarnings("deprecation") + private static class ContextTypeRegistryWrapper extends org.eclipse.jface.text.templates.ContextTypeRegistry { + + private final ContextTypeRegistry delegate; + + public ContextTypeRegistryWrapper(final ContextTypeRegistry registry) { + this.delegate = registry; + delegate.contextTypes(); + } + + @Override + public Iterator contextTypes() { + return delegate.contextTypes(); + } + + @Override + public void addContextType(final @Nullable TemplateContextType contextType) { + delegate.addContextType(contextType); + } + + @Override + public @Nullable TemplateContextType getContextType(final @Nullable String id) { + return delegate.getContextType(id); + } + + } + + public static ContextTypeRegistryWrapper from(final ContextTypeRegistry registry) { + return new ContextTypeRegistryWrapper(registry); + } + + public TemplateStore getTemplateStore() { + @NonNull + TemplateStore result; + + if (templateStore == null) { + result = new ContributionTemplateStore(from(getTemplateContextRegistry()), getPreferenceStore(), + CUSTOM_TEMPLATES_KEY); + templateStore = result; + + try { + result.load(); + } catch (final IOException e) { + Platform.getLog(this.getClass()).error(e.getMessage(), e); + } + + result.startListeningForPreferenceChanges(); + } else { + result = NullSafetyHelper.castNonNull(templateStore); + } + + return result; + } + } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java new file mode 100644 index 000000000..db9cd1a41 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.internal.preferences; + +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.jface.text.templates.Template; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.tm4e.ui.TMUIPlugin; +import org.eclipse.ui.texteditor.templates.TemplatePreferencePage; + +public class CustomCodeTemplatePreferencePage extends TemplatePreferencePage { + + public CustomCodeTemplatePreferencePage() { + final TMUIPlugin plugin = TMUIPlugin.getDefault(); + if (plugin == null) { + return; + } + + setPreferenceStore(plugin.getPreferenceStore()); + setTemplateStore(plugin.getTemplateStore()); + setContextTypeRegistry(TMUIPlugin.from(plugin.getTemplateContextRegistry())); + } + + private static class Tm4eEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { + + public Tm4eEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, + final org.eclipse.jface.text.templates.ContextTypeRegistry contextTypeRegistry) { + super(shell, template, edit, isNameModifiable, contextTypeRegistry); + } + + @Override + protected SourceViewer createViewer(final @Nullable Composite parent) { + // TODO configure viewer + return super.createViewer(parent); + } + } + + @Override + protected String getFormatterPreferenceKey() { + return super.getFormatterPreferenceKey(); + // TODO adapt pref key + //return PreferenceConstants.TEMPLATES_USE_CODEFORMATTER; + } + + @Override + protected @Nullable Template editTemplate(final @Nullable Template template, final boolean edit, final boolean isNameModifiable) { + if (template == null) { + return null; + } + + final Tm4eEditTemplateDialog dialog = new Tm4eEditTemplateDialog(getShell(), template, edit, isNameModifiable, + getContextTypeRegistry()); + if (dialog.open() == Window.OK) { + return dialog.getTemplate(); + } + return null; + } + + @Override + protected SourceViewer createViewer(final @Nullable Composite parent) { + final SourceViewer sourceViewer = super.createViewer(parent); + + // TODO configure source viewer for syntax highlighting with TM4E (adapt highlighting depending on context type) +// sourceViewer.configure(new SourceViewerConfiguration() { +// @Override +// public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { +// // TODO check if we need special config for highlighting template variables +// return new TMPresentationReconciler(); +// } +// }); + + return sourceViewer; + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java new file mode 100644 index 000000000..b5b3a50f7 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java @@ -0,0 +1,234 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.internal.templates; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.contentassist.CompletionProposal; +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.text.templates.Template; +import org.eclipse.jface.text.templates.TemplateCompletionProcessor; +import org.eclipse.jface.text.templates.TemplateContextType; +import org.eclipse.jface.text.templates.persistence.TemplateStore; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.text.templates.ContextTypeRegistry; +import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; +import org.eclipse.tm4e.core.model.TMToken; +import org.eclipse.tm4e.ui.TMImages; +import org.eclipse.tm4e.ui.TMUIPlugin; +import org.eclipse.tm4e.ui.internal.utils.UI; +import org.eclipse.tm4e.ui.model.ITMDocumentModel; +import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; +import org.eclipse.tm4e.ui.templates.DefaultTm4eTemplateContextType; +import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; + +public class Tm4eTemplateCompletionProcessor extends TemplateCompletionProcessor { + + private static final ICompletionProposal[] NO_PROPOSALS = {}; + private static final Template[] NO_TEMPLATES = {}; + + @Override + public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer, final int offset) { + // TODO check why Invalid thread access exception occurs here without syncExec() + final ArrayList templateProposals = new ArrayList<>(); + UI.getDisplay().syncExec(() -> { + final ICompletionProposal[] proposalsFromParent = Tm4eTemplateCompletionProcessor.super.computeCompletionProposals( + viewer, offset); + Collections.addAll(templateProposals, proposalsFromParent); + }); + + if (templateProposals.size() > 0) { + final ICompletionProposal[] proposals = templateProposals + .toArray(new ICompletionProposal[templateProposals.size()]); + return proposals; + } + + if (viewer == null || viewer.getDocument() == null) { + return NO_PROPOSALS; + } + + // add dummy proposal if nothing else applies + final List selectionRangeList = new ArrayList<>(1); + // avoid illegal thread access exception: + UI.getDisplay().syncExec(() -> { + final Point selectionRange = viewer.getSelectedRange(); + selectionRangeList.add(selectionRange); + }); + + final int replacementOffset = selectionRangeList.get(0).x; + final int replacementLength = selectionRangeList.get(0).y; + + final String replacementText = "test completion"; //$NON-NLS-1$ + return new ICompletionProposal[] { + new CompletionProposal(replacementText, replacementOffset, replacementLength, replacementText.length(), getImage(null), + "Dummy code proposal", null, + replacementText) }; + } + + private static class TmTokenRegion implements IRegion { + + private final TMToken token; + private final int offset; + private final int length; + + public TmTokenRegion(final TMToken token, final int offset, final int length) { + this.token = token; + this.offset = offset; + this.length = length; + } + + @Override + public int getLength() { + return this.length; + } + + @Override + public int getOffset() { + return this.offset; + } + + public TMToken getToken() { + return this.token; + } + } + + private @Nullable TmTokenRegion retrieveTmTokenFor(final IDocument document, final int offset) { + final ITMDocumentModel model = TMUIPlugin.getTMModelManager().connect(document); + + int lineIndex; + int lineStartOffset; + int lineLength; + String lineDelimiter; + try { + lineIndex = document.getLineOfOffset(offset); + lineStartOffset = document.getLineOffset(lineIndex); + lineLength = document.getLineLength(lineIndex); + lineDelimiter = document.getLineDelimiter(lineIndex); + } catch (final BadLocationException e) { + Platform.getLog(getClass()).error(e.getMessage(), e); + return null; + } + + final List lineTokens = model.getLineTokens(lineIndex); + if (lineTokens == null) { + return null; + } + + TMToken tokenAtOffset = null; + TMToken nextToken = null; + for (final TMToken token : lineTokens) { + if (token.startIndex <= offset - lineStartOffset) { + tokenAtOffset = token; + } else { + nextToken = token; + break; + } + } + + if (tokenAtOffset == null) { + return null; + } + + int length; + if (nextToken != null) { + length = nextToken.startIndex - tokenAtOffset.startIndex; + } else { + length = lineLength - tokenAtOffset.startIndex; + if (lineDelimiter != null) { + length -= lineDelimiter.length(); + } + } + + return new TmTokenRegion(tokenAtOffset, offset, length); + } + + private @Nullable TemplateContextType retrieveTemplateContextType(final TMToken textMateToken) { + final TMUIPlugin plugin = TMUIPlugin.getDefault(); + if (plugin == null) { + return null; + } + + final ContextTypeRegistry contextTypeRegistry = plugin.getTemplateContextRegistry(); + if (textMateToken.type.contains("comment")) { + TemplateContextType contextType; + if (textMateToken.type.contains("documentation")) { + contextType = contextTypeRegistry.getContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); + } else { + contextType = contextTypeRegistry.getContextType(CommentTemplateContextType.CONTEXT_ID); + } + + if (contextType != null) { + return contextType; + } + } + + // TODO use language-specific context type mappers from extensions + + // last option + return contextTypeRegistry.getContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); + } + + @Override + public @Nullable String getErrorMessage() { + // TODO add error message if applicable + return null; + } + + @Override + protected @Nullable TemplateContextType getContextType(final @Nullable ITextViewer viewer, final @Nullable IRegion region) { + if (viewer != null && region != null && viewer.getDocument() != null) { + final TmTokenRegion tokenRegion = retrieveTmTokenFor( + NullSafetyHelper.castNonNull(viewer.getDocument()), region.getOffset()); + if (tokenRegion != null) { + return retrieveTemplateContextType(tokenRegion.getToken()); + } + } + + final TMUIPlugin plugin = TMUIPlugin.getDefault(); + if (plugin == null) { + return null; + } + + return plugin.getTemplateContextRegistry() + .getContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); + } + + @Override + protected @Nullable Image getImage(final @Nullable Template template) { + return TMImages.getImage(TMImages.IMG_TEMPLATE); + } + + @Override + protected Template[] getTemplates(final @Nullable String contextTypeId) { + final TMUIPlugin plugin = TMUIPlugin.getDefault(); + if (contextTypeId == null || plugin == null) { + return NO_TEMPLATES; + } + + final TemplateStore templateStore = plugin.getTemplateStore(); + final Template[] customTemplates = templateStore.getTemplates(contextTypeId); + if (customTemplates == null || customTemplates.length == 0) { + return NO_TEMPLATES; + } + return customTemplates; + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/package-info.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/package-info.java new file mode 100644 index 000000000..f2eee715c --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/package-info.java @@ -0,0 +1,6 @@ +@NonNullByDefault({ ARRAY_CONTENTS, PARAMETER, RETURN_TYPE, FIELD, TYPE_BOUND, TYPE_ARGUMENT }) +package org.eclipse.tm4e.ui.internal.templates; + +import static org.eclipse.jdt.annotation.DefaultLocation.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java new file mode 100644 index 000000000..c03697472 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.templates; + +import org.eclipse.jface.text.templates.GlobalTemplateVariables; +import org.eclipse.jface.text.templates.TemplateContextType; +import org.eclipse.jface.text.templates.TemplateVariableResolver; + +/** + * Default implementation for new, language-specific code template context types. + */ +public abstract class AbstractTm4eTemplateContextType extends TemplateContextType { + + public AbstractTm4eTemplateContextType(final String contextTypeId, final String contextTypeName) { + super(contextTypeId, contextTypeName); + addTemplateVariableResolvers(); + } + + /** + * Adds {@link TemplateVariableResolver}s. + * Subclasses may override this method, but should call super.addTemplateVariableResolvers(). + * The default implementation adds some global template variables like ${user}, + * ${date}, and ${cursor} (see {@link #addGlobalTemplateVariableResolvers()}). + */ + protected void addTemplateVariableResolvers() { + addGlobalTemplateVariableResolvers(); + } + + /** + * Adds {@link TemplateVariableResolver}s for some global template variables like + * ${user} (user name), + * ${date}, ${time}, ${year}, ${cursor}, + * ${lineselection}, and ${wordselection}. + */ + protected final void addGlobalTemplateVariableResolvers() { + addResolver(new GlobalTemplateVariables.User()); + + addResolver(new GlobalTemplateVariables.Date()); + addResolver(new GlobalTemplateVariables.Time()); + addResolver(new GlobalTemplateVariables.Year()); + + addResolver(new GlobalTemplateVariables.Cursor()); + addResolver(new GlobalTemplateVariables.LineSelection()); + addResolver(new GlobalTemplateVariables.WordSelection()); + + addResolver(new GlobalTemplateVariables.Dollar()); + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java new file mode 100644 index 000000000..18ec76c28 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.templates; + +import org.eclipse.tm4e.ui.TMUIPlugin; + +/** + * Language-independent code template context type for comments. + */ +public class CommentTemplateContextType extends AbstractTm4eTemplateContextType { + + public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context.comment"; //$NON-NLS-1$ + + public CommentTemplateContextType() { + super(CONTEXT_ID, "Comment (TM4E)"); + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java new file mode 100644 index 000000000..749e53eb6 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.templates; + +import org.eclipse.tm4e.ui.TMUIPlugin; + +/** + * Language-independent default code template context type. + * It is used by TM4E as a fallback if case no other applicable context type can be found. + */ +public class DefaultTm4eTemplateContextType extends AbstractTm4eTemplateContextType { + + public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context"; //$NON-NLS-1$ + + public DefaultTm4eTemplateContextType() { + super(CONTEXT_ID, "Default context (TM4E)"); + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java new file mode 100644 index 000000000..4c330a391 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.templates; + +import org.eclipse.tm4e.ui.TMUIPlugin; + +/** + * Language-independent code template context type for documentation comments, e.g. for javadoc comments. + */ +public class DocumentationCommentTemplateContextType extends AbstractTm4eTemplateContextType { + + public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context.comment.doc"; //$NON-NLS-1$ + + public DocumentationCommentTemplateContextType() { + super(CONTEXT_ID, "Documentation Comment (TM4E)"); + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/package-info.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/package-info.java new file mode 100644 index 000000000..f28f526f9 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/package-info.java @@ -0,0 +1,6 @@ +@NonNullByDefault({ ARRAY_CONTENTS, PARAMETER, RETURN_TYPE, FIELD, TYPE_BOUND, TYPE_ARGUMENT }) +package org.eclipse.tm4e.ui.templates; + +import static org.eclipse.jdt.annotation.DefaultLocation.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/org.eclipse.tm4e.ui/src/main/resources/templates/templates.properties b/org.eclipse.tm4e.ui/src/main/resources/templates/templates.properties new file mode 100644 index 000000000..11a503c86 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/resources/templates/templates.properties @@ -0,0 +1,4 @@ +# template content + +author.description=Author +author.pattern=author ${user}${cursor} diff --git a/org.eclipse.tm4e.ui/src/main/resources/templates/templates.xml b/org.eclipse.tm4e.ui/src/main/resources/templates/templates.xml new file mode 100644 index 000000000..b77cff10b --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/resources/templates/templates.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file From 2bc3cdea777a48c88c6f8a721e6b0ad256024a4a Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 9 Jan 2026 18:22:49 +0100 Subject: [PATCH 02/28] Use TM4E grammar and reconsiler for code template syntax highlighting --- .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 25 +++++- .../CustomCodeTemplatePreferencePage.java | 88 ++++++++++++++++--- .../Tm4eTemplateCompletionProcessor.java | 10 ++- .../Tm4eLanguageTemplateContextType.java | 33 +++++++ 4 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 6b6dbbd8d..28c46feca 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -27,7 +27,11 @@ import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.text.templates.ContextTypeRegistry; +import org.eclipse.tm4e.core.grammar.IGrammar; import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; +import org.eclipse.tm4e.registry.IGrammarDefinition; +import org.eclipse.tm4e.registry.ITMScope; +import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.internal.model.TMModelManager; import org.eclipse.tm4e.ui.internal.samples.SampleManager; import org.eclipse.tm4e.ui.internal.themes.ThemeManager; @@ -36,6 +40,7 @@ import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; import org.eclipse.tm4e.ui.templates.DefaultTm4eTemplateContextType; import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; +import org.eclipse.tm4e.ui.templates.Tm4eLanguageTemplateContextType; import org.eclipse.tm4e.ui.themes.ColorManager; import org.eclipse.tm4e.ui.themes.IThemeManager; import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; @@ -193,7 +198,25 @@ public ContextTypeRegistry getTemplateContextRegistry() { result.addContextType(CommentTemplateContextType.CONTEXT_ID); result.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); - // TODO add language-specific context types, probably from extensions + // Add language-specific context types + // TODO also load context types from extensions? + final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); + for (final IGrammarDefinition definition : grammarDefinitions) { + final ITMScope languageScope = definition.getScope(); + final String contextTypeIdSuffix = languageScope.getQualifiedName(); + final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(languageScope); + if (languageGrammar != null) { + String name = languageGrammar.getName(); + if (name == null) { + name = ""; + } + name += " (" + languageScope.getName() + ")"; + final Tm4eLanguageTemplateContextType languageContextType = new Tm4eLanguageTemplateContextType( + name, contextTypeIdSuffix); + result.addContextType(languageContextType); + } + } + } else { result = NullSafetyHelper.castNonNull(contextTypeRegistry); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index db9cd1a41..322c169e1 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -11,17 +11,36 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.internal.preferences; +import java.util.Arrays; + import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.presentation.IPresentationReconciler; +import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.text.templates.Template; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; +import org.eclipse.text.templates.TemplatePersistenceData; +import org.eclipse.tm4e.core.grammar.IGrammar; +import org.eclipse.tm4e.registry.IGrammarDefinition; +import org.eclipse.tm4e.registry.ITMScope; +import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; +import org.eclipse.tm4e.ui.internal.model.TMDocumentModel; +import org.eclipse.tm4e.ui.text.TMPresentationReconciler; import org.eclipse.ui.texteditor.templates.TemplatePreferencePage; public class CustomCodeTemplatePreferencePage extends TemplatePreferencePage { + private @Nullable TMDocumentModel model; + private @Nullable TMPresentationReconciler reconsiler; + public CustomCodeTemplatePreferencePage() { final TMUIPlugin plugin = TMUIPlugin.getDefault(); if (plugin == null) { @@ -70,18 +89,65 @@ protected String getFormatterPreferenceKey() { @Override protected SourceViewer createViewer(final @Nullable Composite parent) { - final SourceViewer sourceViewer = super.createViewer(parent); - // TODO configure source viewer for syntax highlighting with TM4E (adapt highlighting depending on context type) -// sourceViewer.configure(new SourceViewerConfiguration() { -// @Override -// public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { -// // TODO check if we need special config for highlighting template variables -// return new TMPresentationReconciler(); -// } -// }); - - return sourceViewer; + + final SourceViewer viewer = new SourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { + @Override + public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { + // TODO check if we need special config for highlighting template variables + reconsiler = new TMPresentationReconciler(); + return reconsiler; + } + }; + viewer.configure(configuration); + final IDocument document = new Document(); + viewer.setDocument(document); +// model = TMModelManager.INSTANCE.connect(document); + getTableViewer().addSelectionChangedListener(e -> selectionChanged()); + return viewer; + } + + private void selectionChanged() { + final Template selectedTemplate = getSelectedTemplate(); + + if (selectedTemplate != null /*&& model != null*/) { + + final String id = selectedTemplate.getContextTypeId(); + + final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); + final ITMScope scope = Arrays.stream(grammarDefinitions) + .map(IGrammarDefinition::getScope) + .filter(s -> id.endsWith(s.getQualifiedName())) + .findFirst().orElse(null); + + if (scope != null) { + final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope); + if (languageGrammar != null && reconsiler != null) { +// model.setGrammar(languageGrammar); + reconsiler.setGrammar(languageGrammar); + return; + +// getViewer().invalidateTextPresentation(); + } + + } + } + if (reconsiler != null) { + reconsiler.setGrammar(null); + } + } + + private @Nullable Template getSelectedTemplate() { + final IStructuredSelection selection = getTableViewer().getStructuredSelection(); + + if (selection != null && selection.size() == 1) { + final TemplatePersistenceData data = (TemplatePersistenceData) selection.getFirstElement(); + if (data != null) { + return data.getTemplate(); + } + } + return null; } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java index b5b3a50f7..8edfe2fb7 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java @@ -180,7 +180,14 @@ public TMToken getToken() { } } - // TODO use language-specific context type mappers from extensions + // Check language-specific context types + final String id = TMUIPlugin.PLUGIN_ID + ".templates.context." + textMateToken.grammarScope; + final TemplateContextType contextType = plugin.getTemplateContextRegistry().getContextType(id); + if (contextType != null) { + return contextType; + } + + // TODO Also check language-specific context types from extensions? // last option return contextTypeRegistry.getContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); @@ -225,6 +232,7 @@ protected Template[] getTemplates(final @Nullable String contextTypeId) { final TemplateStore templateStore = plugin.getTemplateStore(); final Template[] customTemplates = templateStore.getTemplates(contextTypeId); + if (customTemplates == null || customTemplates.length == 0) { return NO_TEMPLATES; } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java new file mode 100644 index 000000000..d06082411 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.templates; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.tm4e.ui.TMUIPlugin; + +/** + * Language-specific default code template context type. It is created for each language with a registered TM4E grammar. + */ +public class Tm4eLanguageTemplateContextType extends AbstractTm4eTemplateContextType { + + private static final String CONTEXT_TYPE_ID_PREFIX = TMUIPlugin.PLUGIN_ID + ".templates.context."; //$NON-NLS-1$ + + public Tm4eLanguageTemplateContextType(final String contextTypeName, final String contextTypeIdSuffix) { + super(CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix, contextTypeName); + } + + public static String getContextTypeId(final String contextTypeIdSuffix) { + Assert.isLegal(contextTypeIdSuffix != null && contextTypeIdSuffix.length() > 0); + + return CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix; + } +} From 1710b9f7d119d21970ea6f66dc79ea9536fb92e6 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 11:50:56 +0100 Subject: [PATCH 03/28] Temporarily switch off null-safety check for a method I didn't find a way to satisfy the compiler with adapting the return type or modifying the returned value. It always complains about incompatible nullability constraints on the Iterator type in the method signature. --- .../src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 28c46feca..0cbe313af 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -230,11 +230,12 @@ private static class ContextTypeRegistryWrapper extends org.eclipse.jface.text.t public ContextTypeRegistryWrapper(final ContextTypeRegistry registry) { this.delegate = registry; - delegate.contextTypes(); } + // TODO How can this null-safety check be handled correctly? + @SuppressWarnings("null") @Override - public Iterator contextTypes() { + public Iterator<@Nullable TemplateContextType> contextTypes() { return delegate.contextTypes(); } From ea5ec10b42d4e759fc86056d9a689d19c6116cce Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 12:02:30 +0100 Subject: [PATCH 04/28] Rename classes Tm4e* to Tm*, remove "(TM4E)" in names --- org.eclipse.tm4e.ui/plugin.properties | 2 +- org.eclipse.tm4e.ui/plugin.xml | 10 +++++----- .../src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java | 8 ++++---- .../preferences/CustomCodeTemplatePreferencePage.java | 6 +++--- ...ocessor.java => TmTemplateCompletionProcessor.java} | 10 +++++----- ...extType.java => AbstractTmTemplateContextType.java} | 4 ++-- .../tm4e/ui/templates/CommentTemplateContextType.java | 4 ++-- ...textType.java => DefaultTmTemplateContextType.java} | 6 +++--- .../DocumentationCommentTemplateContextType.java | 4 ++-- ...extType.java => TmLanguageTemplateContextType.java} | 4 ++-- 10 files changed, 29 insertions(+), 29 deletions(-) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/{Tm4eTemplateCompletionProcessor.java => TmTemplateCompletionProcessor.java} (94%) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/{AbstractTm4eTemplateContextType.java => AbstractTmTemplateContextType.java} (92%) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/{DefaultTm4eTemplateContextType.java => DefaultTmTemplateContextType.java} (83%) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/{Tm4eLanguageTemplateContextType.java => TmLanguageTemplateContextType.java} (85%) diff --git a/org.eclipse.tm4e.ui/plugin.properties b/org.eclipse.tm4e.ui/plugin.properties index dcf288dd2..ffe7f1210 100644 --- a/org.eclipse.tm4e.ui/plugin.properties +++ b/org.eclipse.tm4e.ui/plugin.properties @@ -29,7 +29,7 @@ TextMatePreferencePage.name=TextMate GrammarPreferencePage.name=Grammar TaskTagsPreferencePage.name=Task Tags ThemePreferencePage.name=Theme -TemplatesPreferencePage.name=Templates (TM4E) +TemplatesPreferencePage.name=Templates # Wizards TextMateWizard.category=TextMate diff --git a/org.eclipse.tm4e.ui/plugin.xml b/org.eclipse.tm4e.ui/plugin.xml index 50ac6d9ac..35f1f7285 100644 --- a/org.eclipse.tm4e.ui/plugin.xml +++ b/org.eclipse.tm4e.ui/plugin.xml @@ -163,21 +163,21 @@ diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 0cbe313af..2305644ac 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -38,9 +38,9 @@ import org.eclipse.tm4e.ui.model.ITMModelManager; import org.eclipse.tm4e.ui.samples.ISampleManager; import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; -import org.eclipse.tm4e.ui.templates.DefaultTm4eTemplateContextType; +import org.eclipse.tm4e.ui.templates.DefaultTmTemplateContextType; import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; -import org.eclipse.tm4e.ui.templates.Tm4eLanguageTemplateContextType; +import org.eclipse.tm4e.ui.templates.TmLanguageTemplateContextType; import org.eclipse.tm4e.ui.themes.ColorManager; import org.eclipse.tm4e.ui.themes.IThemeManager; import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; @@ -194,7 +194,7 @@ public ContextTypeRegistry getTemplateContextRegistry() { result = new ContributionContextTypeRegistry(TEMPLATES_REGISTRY_ID); contextTypeRegistry = result; - result.addContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); + result.addContextType(DefaultTmTemplateContextType.CONTEXT_ID); result.addContextType(CommentTemplateContextType.CONTEXT_ID); result.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); @@ -211,7 +211,7 @@ public ContextTypeRegistry getTemplateContextRegistry() { name = ""; } name += " (" + languageScope.getName() + ")"; - final Tm4eLanguageTemplateContextType languageContextType = new Tm4eLanguageTemplateContextType( + final TmLanguageTemplateContextType languageContextType = new TmLanguageTemplateContextType( name, contextTypeIdSuffix); result.addContextType(languageContextType); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 322c169e1..c64a67ecb 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -52,9 +52,9 @@ public CustomCodeTemplatePreferencePage() { setContextTypeRegistry(TMUIPlugin.from(plugin.getTemplateContextRegistry())); } - private static class Tm4eEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { + private static class TmEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { - public Tm4eEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, + public TmEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, final org.eclipse.jface.text.templates.ContextTypeRegistry contextTypeRegistry) { super(shell, template, edit, isNameModifiable, contextTypeRegistry); } @@ -79,7 +79,7 @@ protected String getFormatterPreferenceKey() { return null; } - final Tm4eEditTemplateDialog dialog = new Tm4eEditTemplateDialog(getShell(), template, edit, isNameModifiable, + final TmEditTemplateDialog dialog = new TmEditTemplateDialog(getShell(), template, edit, isNameModifiable, getContextTypeRegistry()); if (dialog.open() == Window.OK) { return dialog.getTemplate(); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TmTemplateCompletionProcessor.java similarity index 94% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TmTemplateCompletionProcessor.java index 8edfe2fb7..9287603e3 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/Tm4eTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TmTemplateCompletionProcessor.java @@ -37,10 +37,10 @@ import org.eclipse.tm4e.ui.internal.utils.UI; import org.eclipse.tm4e.ui.model.ITMDocumentModel; import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; -import org.eclipse.tm4e.ui.templates.DefaultTm4eTemplateContextType; +import org.eclipse.tm4e.ui.templates.DefaultTmTemplateContextType; import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; -public class Tm4eTemplateCompletionProcessor extends TemplateCompletionProcessor { +public class TmTemplateCompletionProcessor extends TemplateCompletionProcessor { private static final ICompletionProposal[] NO_PROPOSALS = {}; private static final Template[] NO_TEMPLATES = {}; @@ -50,7 +50,7 @@ public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer // TODO check why Invalid thread access exception occurs here without syncExec() final ArrayList templateProposals = new ArrayList<>(); UI.getDisplay().syncExec(() -> { - final ICompletionProposal[] proposalsFromParent = Tm4eTemplateCompletionProcessor.super.computeCompletionProposals( + final ICompletionProposal[] proposalsFromParent = TmTemplateCompletionProcessor.super.computeCompletionProposals( viewer, offset); Collections.addAll(templateProposals, proposalsFromParent); }); @@ -190,7 +190,7 @@ public TMToken getToken() { // TODO Also check language-specific context types from extensions? // last option - return contextTypeRegistry.getContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); + return contextTypeRegistry.getContextType(DefaultTmTemplateContextType.CONTEXT_ID); } @Override @@ -215,7 +215,7 @@ public TMToken getToken() { } return plugin.getTemplateContextRegistry() - .getContextType(DefaultTm4eTemplateContextType.CONTEXT_ID); + .getContextType(DefaultTmTemplateContextType.CONTEXT_ID); } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTmTemplateContextType.java similarity index 92% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTmTemplateContextType.java index c03697472..95f65e184 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTm4eTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTmTemplateContextType.java @@ -18,9 +18,9 @@ /** * Default implementation for new, language-specific code template context types. */ -public abstract class AbstractTm4eTemplateContextType extends TemplateContextType { +public abstract class AbstractTmTemplateContextType extends TemplateContextType { - public AbstractTm4eTemplateContextType(final String contextTypeId, final String contextTypeName) { + public AbstractTmTemplateContextType(final String contextTypeId, final String contextTypeName) { super(contextTypeId, contextTypeName); addTemplateVariableResolvers(); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java index 18ec76c28..3e8178ecb 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java @@ -16,12 +16,12 @@ /** * Language-independent code template context type for comments. */ -public class CommentTemplateContextType extends AbstractTm4eTemplateContextType { +public class CommentTemplateContextType extends AbstractTmTemplateContextType { public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context.comment"; //$NON-NLS-1$ public CommentTemplateContextType() { - super(CONTEXT_ID, "Comment (TM4E)"); + super(CONTEXT_ID, "Comment"); } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTmTemplateContextType.java similarity index 83% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTmTemplateContextType.java index 749e53eb6..947d82765 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTm4eTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTmTemplateContextType.java @@ -17,12 +17,12 @@ * Language-independent default code template context type. * It is used by TM4E as a fallback if case no other applicable context type can be found. */ -public class DefaultTm4eTemplateContextType extends AbstractTm4eTemplateContextType { +public class DefaultTmTemplateContextType extends AbstractTmTemplateContextType { public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context"; //$NON-NLS-1$ - public DefaultTm4eTemplateContextType() { - super(CONTEXT_ID, "Default context (TM4E)"); + public DefaultTmTemplateContextType() { + super(CONTEXT_ID, "Default context"); } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java index 4c330a391..7865c6d3e 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java @@ -16,12 +16,12 @@ /** * Language-independent code template context type for documentation comments, e.g. for javadoc comments. */ -public class DocumentationCommentTemplateContextType extends AbstractTm4eTemplateContextType { +public class DocumentationCommentTemplateContextType extends AbstractTmTemplateContextType { public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context.comment.doc"; //$NON-NLS-1$ public DocumentationCommentTemplateContextType() { - super(CONTEXT_ID, "Documentation Comment (TM4E)"); + super(CONTEXT_ID, "Documentation Comment"); } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TmLanguageTemplateContextType.java similarity index 85% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TmLanguageTemplateContextType.java index d06082411..f90bc6b76 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/Tm4eLanguageTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TmLanguageTemplateContextType.java @@ -17,11 +17,11 @@ /** * Language-specific default code template context type. It is created for each language with a registered TM4E grammar. */ -public class Tm4eLanguageTemplateContextType extends AbstractTm4eTemplateContextType { +public class TmLanguageTemplateContextType extends AbstractTmTemplateContextType { private static final String CONTEXT_TYPE_ID_PREFIX = TMUIPlugin.PLUGIN_ID + ".templates.context."; //$NON-NLS-1$ - public Tm4eLanguageTemplateContextType(final String contextTypeName, final String contextTypeIdSuffix) { + public TmLanguageTemplateContextType(final String contextTypeName, final String contextTypeIdSuffix) { super(CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix, contextTypeName); } From 8d9391a0598ec8be42ab6606a038f527ea65cc03 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 13:29:17 +0100 Subject: [PATCH 05/28] Rename Tm* classes to TM* classes --- org.eclipse.tm4e.ui/plugin.xml | 4 ++-- .../src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java | 8 ++++---- .../preferences/CustomCodeTemplatePreferencePage.java | 6 +++--- ...ocessor.java => TMTemplateCompletionProcessor.java} | 10 +++++----- ...extType.java => AbstractTMTemplateContextType.java} | 4 ++-- .../tm4e/ui/templates/CommentTemplateContextType.java | 2 +- ...textType.java => DefaultTMTemplateContextType.java} | 4 ++-- .../DocumentationCommentTemplateContextType.java | 2 +- ...extType.java => TMLanguageTemplateContextType.java} | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/{TmTemplateCompletionProcessor.java => TMTemplateCompletionProcessor.java} (96%) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/{AbstractTmTemplateContextType.java => AbstractTMTemplateContextType.java} (94%) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/{DefaultTmTemplateContextType.java => DefaultTMTemplateContextType.java} (89%) rename org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/{TmLanguageTemplateContextType.java => TMLanguageTemplateContextType.java} (90%) diff --git a/org.eclipse.tm4e.ui/plugin.xml b/org.eclipse.tm4e.ui/plugin.xml index 35f1f7285..7764df5c2 100644 --- a/org.eclipse.tm4e.ui/plugin.xml +++ b/org.eclipse.tm4e.ui/plugin.xml @@ -163,7 +163,7 @@ @@ -191,7 +191,7 @@ diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 2305644ac..3b8539b65 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -38,9 +38,9 @@ import org.eclipse.tm4e.ui.model.ITMModelManager; import org.eclipse.tm4e.ui.samples.ISampleManager; import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; -import org.eclipse.tm4e.ui.templates.DefaultTmTemplateContextType; +import org.eclipse.tm4e.ui.templates.DefaultTMTemplateContextType; import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; -import org.eclipse.tm4e.ui.templates.TmLanguageTemplateContextType; +import org.eclipse.tm4e.ui.templates.TMLanguageTemplateContextType; import org.eclipse.tm4e.ui.themes.ColorManager; import org.eclipse.tm4e.ui.themes.IThemeManager; import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; @@ -194,7 +194,7 @@ public ContextTypeRegistry getTemplateContextRegistry() { result = new ContributionContextTypeRegistry(TEMPLATES_REGISTRY_ID); contextTypeRegistry = result; - result.addContextType(DefaultTmTemplateContextType.CONTEXT_ID); + result.addContextType(DefaultTMTemplateContextType.CONTEXT_ID); result.addContextType(CommentTemplateContextType.CONTEXT_ID); result.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); @@ -211,7 +211,7 @@ public ContextTypeRegistry getTemplateContextRegistry() { name = ""; } name += " (" + languageScope.getName() + ")"; - final TmLanguageTemplateContextType languageContextType = new TmLanguageTemplateContextType( + final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( name, contextTypeIdSuffix); result.addContextType(languageContextType); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index c64a67ecb..e172ad9ea 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -52,9 +52,9 @@ public CustomCodeTemplatePreferencePage() { setContextTypeRegistry(TMUIPlugin.from(plugin.getTemplateContextRegistry())); } - private static class TmEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { + private static class TMEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { - public TmEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, + public TMEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, final org.eclipse.jface.text.templates.ContextTypeRegistry contextTypeRegistry) { super(shell, template, edit, isNameModifiable, contextTypeRegistry); } @@ -79,7 +79,7 @@ protected String getFormatterPreferenceKey() { return null; } - final TmEditTemplateDialog dialog = new TmEditTemplateDialog(getShell(), template, edit, isNameModifiable, + final TMEditTemplateDialog dialog = new TMEditTemplateDialog(getShell(), template, edit, isNameModifiable, getContextTypeRegistry()); if (dialog.open() == Window.OK) { return dialog.getTemplate(); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TmTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java similarity index 96% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TmTemplateCompletionProcessor.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java index 9287603e3..1b342333c 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TmTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java @@ -37,10 +37,10 @@ import org.eclipse.tm4e.ui.internal.utils.UI; import org.eclipse.tm4e.ui.model.ITMDocumentModel; import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; -import org.eclipse.tm4e.ui.templates.DefaultTmTemplateContextType; +import org.eclipse.tm4e.ui.templates.DefaultTMTemplateContextType; import org.eclipse.tm4e.ui.templates.DocumentationCommentTemplateContextType; -public class TmTemplateCompletionProcessor extends TemplateCompletionProcessor { +public class TMTemplateCompletionProcessor extends TemplateCompletionProcessor { private static final ICompletionProposal[] NO_PROPOSALS = {}; private static final Template[] NO_TEMPLATES = {}; @@ -50,7 +50,7 @@ public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer // TODO check why Invalid thread access exception occurs here without syncExec() final ArrayList templateProposals = new ArrayList<>(); UI.getDisplay().syncExec(() -> { - final ICompletionProposal[] proposalsFromParent = TmTemplateCompletionProcessor.super.computeCompletionProposals( + final ICompletionProposal[] proposalsFromParent = TMTemplateCompletionProcessor.super.computeCompletionProposals( viewer, offset); Collections.addAll(templateProposals, proposalsFromParent); }); @@ -190,7 +190,7 @@ public TMToken getToken() { // TODO Also check language-specific context types from extensions? // last option - return contextTypeRegistry.getContextType(DefaultTmTemplateContextType.CONTEXT_ID); + return contextTypeRegistry.getContextType(DefaultTMTemplateContextType.CONTEXT_ID); } @Override @@ -215,7 +215,7 @@ public TMToken getToken() { } return plugin.getTemplateContextRegistry() - .getContextType(DefaultTmTemplateContextType.CONTEXT_ID); + .getContextType(DefaultTMTemplateContextType.CONTEXT_ID); } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTmTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTMTemplateContextType.java similarity index 94% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTmTemplateContextType.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTMTemplateContextType.java index 95f65e184..1a21a6c50 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTmTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/AbstractTMTemplateContextType.java @@ -18,9 +18,9 @@ /** * Default implementation for new, language-specific code template context types. */ -public abstract class AbstractTmTemplateContextType extends TemplateContextType { +public abstract class AbstractTMTemplateContextType extends TemplateContextType { - public AbstractTmTemplateContextType(final String contextTypeId, final String contextTypeName) { + public AbstractTMTemplateContextType(final String contextTypeId, final String contextTypeName) { super(contextTypeId, contextTypeName); addTemplateVariableResolvers(); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java index 3e8178ecb..44ffe859b 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/CommentTemplateContextType.java @@ -16,7 +16,7 @@ /** * Language-independent code template context type for comments. */ -public class CommentTemplateContextType extends AbstractTmTemplateContextType { +public class CommentTemplateContextType extends AbstractTMTemplateContextType { public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context.comment"; //$NON-NLS-1$ diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTmTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTMTemplateContextType.java similarity index 89% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTmTemplateContextType.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTMTemplateContextType.java index 947d82765..83a84c829 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTmTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DefaultTMTemplateContextType.java @@ -17,11 +17,11 @@ * Language-independent default code template context type. * It is used by TM4E as a fallback if case no other applicable context type can be found. */ -public class DefaultTmTemplateContextType extends AbstractTmTemplateContextType { +public class DefaultTMTemplateContextType extends AbstractTMTemplateContextType { public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context"; //$NON-NLS-1$ - public DefaultTmTemplateContextType() { + public DefaultTMTemplateContextType() { super(CONTEXT_ID, "Default context"); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java index 7865c6d3e..896933a26 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/DocumentationCommentTemplateContextType.java @@ -16,7 +16,7 @@ /** * Language-independent code template context type for documentation comments, e.g. for javadoc comments. */ -public class DocumentationCommentTemplateContextType extends AbstractTmTemplateContextType { +public class DocumentationCommentTemplateContextType extends AbstractTMTemplateContextType { public static final String CONTEXT_ID = TMUIPlugin.PLUGIN_ID + ".templates.context.comment.doc"; //$NON-NLS-1$ diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TmLanguageTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java similarity index 90% rename from org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TmLanguageTemplateContextType.java rename to org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java index f90bc6b76..97f7ced01 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TmLanguageTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java @@ -17,11 +17,11 @@ /** * Language-specific default code template context type. It is created for each language with a registered TM4E grammar. */ -public class TmLanguageTemplateContextType extends AbstractTmTemplateContextType { +public class TMLanguageTemplateContextType extends AbstractTMTemplateContextType { private static final String CONTEXT_TYPE_ID_PREFIX = TMUIPlugin.PLUGIN_ID + ".templates.context."; //$NON-NLS-1$ - public TmLanguageTemplateContextType(final String contextTypeName, final String contextTypeIdSuffix) { + public TMLanguageTemplateContextType(final String contextTypeName, final String contextTypeIdSuffix) { super(CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix, contextTypeName); } From 9c84493044380cc555ffb21ae9dd922f8711025d Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 15:48:22 +0100 Subject: [PATCH 06/28] Update TODO comments, remove obsolete code --- .../src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java | 2 +- .../preferences/CustomCodeTemplatePreferencePage.java | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 3b8539b65..581b9a89a 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -199,7 +199,7 @@ public ContextTypeRegistry getTemplateContextRegistry() { result.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); // Add language-specific context types - // TODO also load context types from extensions? + // TODO Skip certain grammars? Some grammars have no name or are only used for highlighting code snippets, e.g. in Markdown final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); for (final IGrammarDefinition definition : grammarDefinitions) { final ITMScope languageScope = definition.getScope(); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index e172ad9ea..abbf65488 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -32,13 +32,11 @@ import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; -import org.eclipse.tm4e.ui.internal.model.TMDocumentModel; import org.eclipse.tm4e.ui.text.TMPresentationReconciler; import org.eclipse.ui.texteditor.templates.TemplatePreferencePage; public class CustomCodeTemplatePreferencePage extends TemplatePreferencePage { - private @Nullable TMDocumentModel model; private @Nullable TMPresentationReconciler reconsiler; public CustomCodeTemplatePreferencePage() { @@ -89,8 +87,6 @@ protected String getFormatterPreferenceKey() { @Override protected SourceViewer createViewer(final @Nullable Composite parent) { - // TODO configure source viewer for syntax highlighting with TM4E (adapt highlighting depending on context type) - final SourceViewer viewer = new SourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { @Override @@ -103,7 +99,6 @@ public IPresentationReconciler getPresentationReconciler(@Nullable final ISource viewer.configure(configuration); final IDocument document = new Document(); viewer.setDocument(document); -// model = TMModelManager.INSTANCE.connect(document); getTableViewer().addSelectionChangedListener(e -> selectionChanged()); return viewer; } @@ -111,7 +106,7 @@ public IPresentationReconciler getPresentationReconciler(@Nullable final ISource private void selectionChanged() { final Template selectedTemplate = getSelectedTemplate(); - if (selectedTemplate != null /*&& model != null*/) { + if (selectedTemplate != null) { final String id = selectedTemplate.getContextTypeId(); @@ -124,13 +119,9 @@ private void selectionChanged() { if (scope != null) { final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope); if (languageGrammar != null && reconsiler != null) { -// model.setGrammar(languageGrammar); reconsiler.setGrammar(languageGrammar); return; - -// getViewer().invalidateTextPresentation(); } - } } if (reconsiler != null) { From 1ef2605b7ccddf3841cfa9bdb10c74fba1805c93 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 16:12:37 +0100 Subject: [PATCH 07/28] Add prefs constant for "use code formatter" for code templates --- .../preferences/CustomCodeTemplatePreferencePage.java | 4 +--- .../tm4e/ui/internal/preferences/PreferenceConstants.java | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index abbf65488..f9db28db4 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -66,9 +66,7 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { @Override protected String getFormatterPreferenceKey() { - return super.getFormatterPreferenceKey(); - // TODO adapt pref key - //return PreferenceConstants.TEMPLATES_USE_CODEFORMATTER; + return PreferenceConstants.TEMPLATES_USE_CODEFORMATTER; } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java index 79164b536..8c36dbace 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java @@ -27,6 +27,8 @@ public final class PreferenceConstants { public static final String TMTOKEN_HOVER_ENABLED = "org.eclipse.tm4e.ui.tmScopeHoverEnabled"; + public static final String TEMPLATES_USE_CODEFORMATTER = "org.eclipse.tm4e.ui.templates.useCodeFormatter"; + private PreferenceConstants() { } } From 7d7792580c8162347d2d28ac0ebe691ddafc1a4b Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 16:44:47 +0100 Subject: [PATCH 08/28] Update TODO: configuring source viewer in the edit code template dialog --- .../CustomCodeTemplatePreferencePage.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index f9db28db4..99d0e6269 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -37,7 +37,7 @@ public class CustomCodeTemplatePreferencePage extends TemplatePreferencePage { - private @Nullable TMPresentationReconciler reconsiler; + private @Nullable TMPresentationReconciler previewReconsiler; public CustomCodeTemplatePreferencePage() { final TMUIPlugin plugin = TMUIPlugin.getDefault(); @@ -59,7 +59,7 @@ public TMEditTemplateDialog(final Shell shell, final Template template, final bo @Override protected SourceViewer createViewer(final @Nullable Composite parent) { - // TODO configure viewer + // TODO Can we adapt the SourceViewerConfiguration from super.createViewer and add our own presentation reconsiler that adapts to the selected context type? return super.createViewer(parent); } } @@ -90,18 +90,18 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { @Override public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { // TODO check if we need special config for highlighting template variables - reconsiler = new TMPresentationReconciler(); - return reconsiler; + previewReconsiler = new TMPresentationReconciler(); + return previewReconsiler; } }; viewer.configure(configuration); final IDocument document = new Document(); viewer.setDocument(document); - getTableViewer().addSelectionChangedListener(e -> selectionChanged()); + getTableViewer().addSelectionChangedListener(e -> selectedCodeTemplateChanged()); return viewer; } - private void selectionChanged() { + private void selectedCodeTemplateChanged() { final Template selectedTemplate = getSelectedTemplate(); if (selectedTemplate != null) { @@ -116,14 +116,14 @@ private void selectionChanged() { if (scope != null) { final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope); - if (languageGrammar != null && reconsiler != null) { - reconsiler.setGrammar(languageGrammar); + if (languageGrammar != null && previewReconsiler != null) { + previewReconsiler.setGrammar(languageGrammar); return; } } } - if (reconsiler != null) { - reconsiler.setGrammar(null); + if (previewReconsiler != null) { + previewReconsiler.setGrammar(null); } } From 8d8a2550b033903e5b67b90a5f1a1a12409da17e Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 17:50:42 +0100 Subject: [PATCH 09/28] Switch off deprecation warning for an unmodifiable method parameter --- .../internal/preferences/CustomCodeTemplatePreferencePage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 99d0e6269..3952ace6c 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -53,7 +53,7 @@ public CustomCodeTemplatePreferencePage() { private static class TMEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { public TMEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, - final org.eclipse.jface.text.templates.ContextTypeRegistry contextTypeRegistry) { + @SuppressWarnings("deprecation") final org.eclipse.jface.text.templates.ContextTypeRegistry contextTypeRegistry) { super(shell, template, edit, isNameModifiable, contextTypeRegistry); } From 79fd5909b622617c6d15e97ffe97714b5f5bd3d6 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 17:57:38 +0100 Subject: [PATCH 10/28] Export new package to other plug-ins --- org.eclipse.tm4e.ui/META-INF/MANIFEST.MF | 1 + 1 file changed, 1 insertion(+) diff --git a/org.eclipse.tm4e.ui/META-INF/MANIFEST.MF b/org.eclipse.tm4e.ui/META-INF/MANIFEST.MF index 2821ff4cf..c715a73ae 100644 --- a/org.eclipse.tm4e.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.tm4e.ui/META-INF/MANIFEST.MF @@ -29,6 +29,7 @@ Export-Package: org.eclipse.tm4e.ui, org.eclipse.tm4e.ui.internal.widgets;x-friends:="org.eclipse.tm4e.languageconfiguration", org.eclipse.tm4e.ui.model, org.eclipse.tm4e.ui.samples, + org.eclipse.tm4e.ui.templates, org.eclipse.tm4e.ui.text, org.eclipse.tm4e.ui.themes, org.eclipse.tm4e.ui.themes.css From a6abd346cb15448ecfe8a474b171f68484d5d9b4 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 18:11:56 +0100 Subject: [PATCH 11/28] Extract calculating context type ID to a separate class --- .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 3 +- .../CustomCodeTemplatePreferencePage.java | 3 +- .../utils/CodeTemplateContextTypeUtils.java | 31 +++++++++++++++++++ .../TMLanguageTemplateContextType.java | 15 +++------ 4 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 581b9a89a..2ffccfedb 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -203,7 +203,6 @@ public ContextTypeRegistry getTemplateContextRegistry() { final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); for (final IGrammarDefinition definition : grammarDefinitions) { final ITMScope languageScope = definition.getScope(); - final String contextTypeIdSuffix = languageScope.getQualifiedName(); final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(languageScope); if (languageGrammar != null) { String name = languageGrammar.getName(); @@ -212,7 +211,7 @@ public ContextTypeRegistry getTemplateContextRegistry() { } name += " (" + languageScope.getName() + ")"; final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( - name, contextTypeIdSuffix); + name, languageScope); result.addContextType(languageContextType); } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 3952ace6c..93fe4b132 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -32,6 +32,7 @@ import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; +import org.eclipse.tm4e.ui.internal.utils.CodeTemplateContextTypeUtils; import org.eclipse.tm4e.ui.text.TMPresentationReconciler; import org.eclipse.ui.texteditor.templates.TemplatePreferencePage; @@ -111,7 +112,7 @@ private void selectedCodeTemplateChanged() { final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); final ITMScope scope = Arrays.stream(grammarDefinitions) .map(IGrammarDefinition::getScope) - .filter(s -> id.endsWith(s.getQualifiedName())) + .filter(s -> id.equals(CodeTemplateContextTypeUtils.toContextTypeId(s))) .findFirst().orElse(null); if (scope != null) { diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java new file mode 100644 index 000000000..71acfd354 --- /dev/null +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2026 Advantest Europe GmbH and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Dietrich Travkin (SOLUNAR GmbH) - initial implementation + *******************************************************************************/ +package org.eclipse.tm4e.ui.internal.utils; + +import org.eclipse.tm4e.registry.ITMScope; +import org.eclipse.tm4e.ui.TMUIPlugin; + +public class CodeTemplateContextTypeUtils { + + private static final String CONTEXT_TYPE_ID_PREFIX = TMUIPlugin.PLUGIN_ID + ".templates.context."; //$NON-NLS-1$ + + private CodeTemplateContextTypeUtils() { + // no instantiation desired + } + + public static String toContextTypeId(final ITMScope languageScope) { + final String contextTypeIdSuffix = languageScope.getQualifiedName(); + + return CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix; + } + +} diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java index 97f7ced01..64bb5271a 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java @@ -11,23 +11,16 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.templates; -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm4e.ui.TMUIPlugin; +import org.eclipse.tm4e.registry.ITMScope; +import org.eclipse.tm4e.ui.internal.utils.CodeTemplateContextTypeUtils; /** * Language-specific default code template context type. It is created for each language with a registered TM4E grammar. */ public class TMLanguageTemplateContextType extends AbstractTMTemplateContextType { - private static final String CONTEXT_TYPE_ID_PREFIX = TMUIPlugin.PLUGIN_ID + ".templates.context."; //$NON-NLS-1$ - - public TMLanguageTemplateContextType(final String contextTypeName, final String contextTypeIdSuffix) { - super(CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix, contextTypeName); + public TMLanguageTemplateContextType(final String contextTypeName, final ITMScope languageScope) { + super(CodeTemplateContextTypeUtils.toContextTypeId(languageScope), contextTypeName); } - public static String getContextTypeId(final String contextTypeIdSuffix) { - Assert.isLegal(contextTypeIdSuffix != null && contextTypeIdSuffix.length() > 0); - - return CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix; - } } From 1d1d8ac1934aa3a713a89e3827a2b3cfeafb2289 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 13 Jan 2026 18:19:29 +0100 Subject: [PATCH 12/28] Extract another convenience method --- .../CustomCodeTemplatePreferencePage.java | 10 +--------- .../utils/CodeTemplateContextTypeUtils.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 93fe4b132..aac2ffe01 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -11,8 +11,6 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.internal.preferences; -import java.util.Arrays; - import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; @@ -28,7 +26,6 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.text.templates.TemplatePersistenceData; import org.eclipse.tm4e.core.grammar.IGrammar; -import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; @@ -108,12 +105,7 @@ private void selectedCodeTemplateChanged() { if (selectedTemplate != null) { final String id = selectedTemplate.getContextTypeId(); - - final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); - final ITMScope scope = Arrays.stream(grammarDefinitions) - .map(IGrammarDefinition::getScope) - .filter(s -> id.equals(CodeTemplateContextTypeUtils.toContextTypeId(s))) - .findFirst().orElse(null); + final ITMScope scope = CodeTemplateContextTypeUtils.findScopeFor(id); if (scope != null) { final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java index 71acfd354..e170cccf5 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java @@ -11,7 +11,12 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.internal.utils; +import java.util.Arrays; + +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; +import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; public class CodeTemplateContextTypeUtils { @@ -28,4 +33,13 @@ public static String toContextTypeId(final ITMScope languageScope) { return CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix; } + public static @Nullable ITMScope findScopeFor(final String contextTypeId) { + final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); + + return Arrays.stream(grammarDefinitions) + .map(IGrammarDefinition::getScope) + .filter(scope -> contextTypeId.equals(CodeTemplateContextTypeUtils.toContextTypeId(scope))) + .findFirst().orElse(null); + } + } From 9d642905092acc69aae724a0b9e17a5964564308 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 23 Jan 2026 14:44:56 +0100 Subject: [PATCH 13/28] Extract additional convenience method for template context types Also remove obsolete (dummy) code --- .../TMTemplateCompletionProcessor.java | 37 +++---------------- .../utils/CodeTemplateContextTypeUtils.java | 7 +++- 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java index 1b342333c..19020fbb9 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java @@ -21,19 +21,18 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.templates.Template; import org.eclipse.jface.text.templates.TemplateCompletionProcessor; import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; import org.eclipse.text.templates.ContextTypeRegistry; import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.core.model.TMToken; import org.eclipse.tm4e.ui.TMImages; import org.eclipse.tm4e.ui.TMUIPlugin; +import org.eclipse.tm4e.ui.internal.utils.CodeTemplateContextTypeUtils; import org.eclipse.tm4e.ui.internal.utils.UI; import org.eclipse.tm4e.ui.model.ITMDocumentModel; import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; @@ -61,26 +60,7 @@ public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer return proposals; } - if (viewer == null || viewer.getDocument() == null) { - return NO_PROPOSALS; - } - - // add dummy proposal if nothing else applies - final List selectionRangeList = new ArrayList<>(1); - // avoid illegal thread access exception: - UI.getDisplay().syncExec(() -> { - final Point selectionRange = viewer.getSelectedRange(); - selectionRangeList.add(selectionRange); - }); - - final int replacementOffset = selectionRangeList.get(0).x; - final int replacementLength = selectionRangeList.get(0).y; - - final String replacementText = "test completion"; //$NON-NLS-1$ - return new ICompletionProposal[] { - new CompletionProposal(replacementText, replacementOffset, replacementLength, replacementText.length(), getImage(null), - "Dummy code proposal", null, - replacementText) }; + return NO_PROPOSALS; } private static class TmTokenRegion implements IRegion { @@ -166,6 +146,7 @@ public TMToken getToken() { return null; } + // check language-agnostic context types (comment context types) final ContextTypeRegistry contextTypeRegistry = plugin.getTemplateContextRegistry(); if (textMateToken.type.contains("comment")) { TemplateContextType contextType; @@ -181,24 +162,16 @@ public TMToken getToken() { } // Check language-specific context types - final String id = TMUIPlugin.PLUGIN_ID + ".templates.context." + textMateToken.grammarScope; - final TemplateContextType contextType = plugin.getTemplateContextRegistry().getContextType(id); + final TemplateContextType contextType = plugin.getTemplateContextRegistry().getContextType( + CodeTemplateContextTypeUtils.toContextTypeId(textMateToken)); if (contextType != null) { return contextType; } - // TODO Also check language-specific context types from extensions? - // last option return contextTypeRegistry.getContextType(DefaultTMTemplateContextType.CONTEXT_ID); } - @Override - public @Nullable String getErrorMessage() { - // TODO add error message if applicable - return null; - } - @Override protected @Nullable TemplateContextType getContextType(final @Nullable ITextViewer viewer, final @Nullable IRegion region) { if (viewer != null && region != null && viewer.getDocument() != null) { diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java index e170cccf5..5a92ab05e 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java @@ -14,6 +14,7 @@ import java.util.Arrays; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tm4e.core.model.TMToken; import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; @@ -28,9 +29,11 @@ private CodeTemplateContextTypeUtils() { } public static String toContextTypeId(final ITMScope languageScope) { - final String contextTypeIdSuffix = languageScope.getQualifiedName(); + return CONTEXT_TYPE_ID_PREFIX + languageScope.getQualifiedName(); + } - return CONTEXT_TYPE_ID_PREFIX + contextTypeIdSuffix; + public static String toContextTypeId(final TMToken textMateToken) { + return CONTEXT_TYPE_ID_PREFIX + textMateToken.grammarScope; } public static @Nullable ITMScope findScopeFor(final String contextTypeId) { From 72cee958168cf4ff2a390f6e9151de9ef34b68ed Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 23 Jan 2026 14:59:25 +0100 Subject: [PATCH 14/28] Re-word TODO comment --- .../internal/preferences/CustomCodeTemplatePreferencePage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index aac2ffe01..e139b7985 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -87,7 +87,7 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { @Override public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { - // TODO check if we need special config for highlighting template variables + // TODO Is there a hopefully easy way of adding highlighting for code template variables in all grammars? previewReconsiler = new TMPresentationReconciler(); return previewReconsiler; } From 8585c949e871c6a7739bce668c12c7ebf5360c8a Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 23 Jan 2026 15:06:35 +0100 Subject: [PATCH 15/28] Add a TODO comment on adding code template variable resolvers --- .../eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java index 64bb5271a..2b83c2de7 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/templates/TMLanguageTemplateContextType.java @@ -19,6 +19,7 @@ */ public class TMLanguageTemplateContextType extends AbstractTMTemplateContextType { + // TODO What could be a good approach for adding language-specific code template variables (resolvers)? public TMLanguageTemplateContextType(final String contextTypeName, final ITMScope languageScope) { super(CodeTemplateContextTypeUtils.toContextTypeId(languageScope), contextTypeName); } From 91eaedaffdf3bd3c3602d39c5853790410665a20 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Wed, 28 Jan 2026 13:51:39 +0100 Subject: [PATCH 16/28] Set min size for name text field in edit code template dialog --- .../CustomCodeTemplatePreferencePage.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index e139b7985..abc62e147 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -22,8 +22,11 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; import org.eclipse.text.templates.TemplatePersistenceData; import org.eclipse.tm4e.core.grammar.IGrammar; import org.eclipse.tm4e.registry.ITMScope; @@ -55,6 +58,30 @@ public TMEditTemplateDialog(final Shell shell, final Template template, final bo super(shell, template, edit, isNameModifiable, contextTypeRegistry); } + @Override + protected Control createDialogArea(final Composite ancestor) { + final Control result = super.createDialogArea(ancestor); + + // work-around: find the name text field and set a minimum width + for (final Control childControlLvl1 : ancestor.getChildren()) { + if (childControlLvl1 instanceof final Composite childL1) { + for (final Control childControlLvl2 : childL1.getChildren()) { + if (childControlLvl2 instanceof final Composite childL2) { + for (final Control childControlLvl3 : childL2.getChildren()) { + if (childControlLvl3 instanceof final Text nameTextField + && nameTextField.getLayoutData() instanceof final GridData gridData) { + gridData.minimumWidth = 50; + return result; + } + } + } + } + } + } + + return result; + } + @Override protected SourceViewer createViewer(final @Nullable Composite parent) { // TODO Can we adapt the SourceViewerConfiguration from super.createViewer and add our own presentation reconsiler that adapts to the selected context type? From f9dac232de129ab68da949e7d6c2ff6d944b0e55 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Wed, 28 Jan 2026 14:16:10 +0100 Subject: [PATCH 17/28] Remove "Use code formatter" checkbox from templates preferences page --- .../preferences/CustomCodeTemplatePreferencePage.java | 5 +++-- .../tm4e/ui/internal/preferences/PreferenceConstants.java | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index abc62e147..9057cb8b5 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -90,8 +90,9 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { } @Override - protected String getFormatterPreferenceKey() { - return PreferenceConstants.TEMPLATES_USE_CODEFORMATTER; + protected boolean isShowFormatterSetting() { + // Do not show a checkbox for formatting template code, since TM4E can't do that + return false; } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java index 8c36dbace..79164b536 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceConstants.java @@ -27,8 +27,6 @@ public final class PreferenceConstants { public static final String TMTOKEN_HOVER_ENABLED = "org.eclipse.tm4e.ui.tmScopeHoverEnabled"; - public static final String TEMPLATES_USE_CODEFORMATTER = "org.eclipse.tm4e.ui.templates.useCodeFormatter"; - private PreferenceConstants() { } } From 96c03fba5c69244f720a9ab7a08cd173540ad959 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Wed, 28 Jan 2026 15:26:19 +0100 Subject: [PATCH 18/28] Add user documentation --- docs/img/code_template_proposal.png | Bin 0 -> 13653 bytes docs/img/templates_preferences.png | Bin 0 -> 82079 bytes docs/user-guide.md | 24 +++++++++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/img/code_template_proposal.png create mode 100644 docs/img/templates_preferences.png diff --git a/docs/img/code_template_proposal.png b/docs/img/code_template_proposal.png new file mode 100644 index 0000000000000000000000000000000000000000..59e3673e5a10b655c44834648418ccf8bb55069a GIT binary patch literal 13653 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

VuZr_p|h7-inExFuQHcO3gp^w{?Nx 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 Q1OSkcP!um0HT?Sj0bGW?jQ{`u literal 0 HcmV?d00001 diff --git a/docs/img/templates_preferences.png b/docs/img/templates_preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4a00d1be94bb070f65a1c66e34481b80c513b5 GIT binary patch literal 82079 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 Templates` preferences page. + +Each template is registered to a context type, i.e. a language or grammar (technically a TextMate scope). +In addition to available grammars, TM4E offers two special context types for comments. +Templates registered for these context types can be used in all languages having such comments in their grammar. + +For example, users can register custom C/C++ or JavaScript statements, but also generally usable comment texts like a Copyright notice, a license, or a TODO comment with the user's name. +Having a TM4E-based editor open, they'll get that code snippets suggested via code completion triggered by Ctrl + Space. + +The two generic context types for comments are: + +- Comment (any comment that is not a documentation comment, i.e. line comments and standard block comments like code between `/*` and `*/` in Java / C++) +- Documentation comment (a comment that is used for code documentation, e.g. javadoc comments in Java, i.e. code between `/**` and `*/`) + +![Custom Code Proposal](img/code_template_proposal.png) + +### 4) Diagnostic tools (token hover) For advanced users, some editors expose a TextMate token hover that shows the token scopes and partition information at the caret location. @@ -102,6 +121,9 @@ Most user-facing configuration lives under the `TextMate` section in the Eclipse 1. `TextMate > Task Tags` lets you define tags in comments (such as `TODO` or `FIXME`) that should be treated as tasks or problems, and configure how they are marked in the workspace.\ ![Task Tags Preferences](img/task_tags_preferences.png) +1. `TextMate > Templates` lets you specify custom code templates for available TextMate grammars (languages). These will be used in code proposals triggered by Ctrl + Space.\ + ![Templates Preferences](img/templates_preferences.png) + 1. `TextMate > Themes` lets you choose between built-in Light and Dark themes and any additional themes contributed by installed plugins, as well as import extra theme files and set the default theme for light and dark modes. You can also switch themes from the editor's context menu under `TextMate`.\ ![Themes Preferences](img/themes_preferences.png) From b1b19177068310f3e9e150f94ec744f4ca494c1f Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Thu, 29 Jan 2026 12:19:18 +0100 Subject: [PATCH 19/28] Add syntax highlighting to edit code template dialog I had to use some work-arounds in order to adapt the methods from parent class. --- .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 9 +-- .../CustomCodeTemplatePreferencePage.java | 61 ++++++++++++++++++- .../utils/CodeTemplateContextTypeUtils.java | 23 +++++++ 3 files changed, 84 insertions(+), 9 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 2ffccfedb..71bcf791e 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -35,6 +35,7 @@ import org.eclipse.tm4e.ui.internal.model.TMModelManager; import org.eclipse.tm4e.ui.internal.samples.SampleManager; import org.eclipse.tm4e.ui.internal.themes.ThemeManager; +import org.eclipse.tm4e.ui.internal.utils.CodeTemplateContextTypeUtils; import org.eclipse.tm4e.ui.model.ITMModelManager; import org.eclipse.tm4e.ui.samples.ISampleManager; import org.eclipse.tm4e.ui.templates.CommentTemplateContextType; @@ -205,13 +206,9 @@ public ContextTypeRegistry getTemplateContextRegistry() { final ITMScope languageScope = definition.getScope(); final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(languageScope); if (languageGrammar != null) { - String name = languageGrammar.getName(); - if (name == null) { - name = ""; - } - name += " (" + languageScope.getName() + ")"; + final String contextTypeName = CodeTemplateContextTypeUtils.toContextTypeName(languageGrammar); final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( - name, languageScope); + contextTypeName, languageScope); result.addContextType(languageContextType); } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 9057cb8b5..5f7d22a1a 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -14,8 +14,12 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.contentassist.ContentAssistant; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; +import org.eclipse.jface.text.contentassist.IContentAssistant; import org.eclipse.jface.text.presentation.IPresentationReconciler; import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.jface.text.source.ISourceViewerExtension2; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.text.templates.Template; @@ -23,12 +27,14 @@ import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.text.templates.TemplatePersistenceData; import org.eclipse.tm4e.core.grammar.IGrammar; +import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; @@ -53,6 +59,8 @@ public CustomCodeTemplatePreferencePage() { private static class TMEditTemplateDialog extends TemplatePreferencePage.EditTemplateDialog { + private @Nullable TMPresentationReconciler editTemplatePresentationReconsiler = null; + public TMEditTemplateDialog(final Shell shell, final Template template, final boolean edit, final boolean isNameModifiable, @SuppressWarnings("deprecation") final org.eclipse.jface.text.templates.ContextTypeRegistry contextTypeRegistry) { super(shell, template, edit, isNameModifiable, contextTypeRegistry); @@ -62,7 +70,10 @@ public TMEditTemplateDialog(final Shell shell, final Template template, final bo protected Control createDialogArea(final Composite ancestor) { final Control result = super.createDialogArea(ancestor); - // work-around: find the name text field and set a minimum width + // work-around 1: find the name text field and set a minimum width + // work-around 2: find the combo box (drop-down list) and register a modify listener for updating the reconsiler's grammar to the current context type + boolean foundNameField = false; + boolean foundDropDownList = false; for (final Control childControlLvl1 : ancestor.getChildren()) { if (childControlLvl1 instanceof final Composite childL1) { for (final Control childControlLvl2 : childL1.getChildren()) { @@ -71,6 +82,21 @@ protected Control createDialogArea(final Composite ancestor) { if (childControlLvl3 instanceof final Text nameTextField && nameTextField.getLayoutData() instanceof final GridData gridData) { gridData.minimumWidth = 50; + foundNameField = true; + } else if (childControlLvl3 instanceof final Combo dropDownList) { + foundDropDownList = true; + dropDownList.addModifyListener(e -> { + if (editTemplatePresentationReconsiler != null + && e.widget instanceof final Combo combo + && !combo.isDisposed()) { + final String activeContextTypeName = combo.getText(); + final IGrammar grammar = CodeTemplateContextTypeUtils.toGrammar(activeContextTypeName); + NullSafetyHelper.castNonNull(editTemplatePresentationReconsiler).setGrammar(grammar); + } + }); + } + + if (foundNameField && foundDropDownList) { return result; } } @@ -84,8 +110,37 @@ protected Control createDialogArea(final Composite ancestor) { @Override protected SourceViewer createViewer(final @Nullable Composite parent) { - // TODO Can we adapt the SourceViewerConfiguration from super.createViewer and add our own presentation reconsiler that adapts to the selected context type? - return super.createViewer(parent); + final SourceViewer originalViewer = super.createViewer(parent); + + // work-around 3: re-use source viewer from parent class, but add our reconsiler for syntax highlighting + // by un-configuring and re-configuring the source viewer with a modified SourceViewerConfiguration + final IContentAssistProcessor templateVariableProcessor = getTemplateProcessor(); + if (originalViewer instanceof final ISourceViewerExtension2 viewerExtension) { + viewerExtension.unconfigure(); + + final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { + @Override + public @Nullable IContentAssistant getContentAssistant(@Nullable final ISourceViewer sourceViewer) { + + final ContentAssistant assistant = new ContentAssistant(); + assistant.enableAutoActivation(true); + assistant.enableAutoInsert(true); + assistant.setContentAssistProcessor(templateVariableProcessor, IDocument.DEFAULT_CONTENT_TYPE); + return assistant; + } + + @Override + public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { + // TODO Is there a hopefully easy way of adding highlighting for code template variables in all grammars? + editTemplatePresentationReconsiler = new TMPresentationReconciler(); + return editTemplatePresentationReconsiler; + } + }; + + originalViewer.configure(configuration); + } + + return originalViewer; } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java index 5a92ab05e..34bc88b71 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java @@ -14,6 +14,8 @@ import java.util.Arrays; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tm4e.core.grammar.IGrammar; +import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.core.model.TMToken; import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; @@ -45,4 +47,25 @@ public static String toContextTypeId(final TMToken textMateToken) { .findFirst().orElse(null); } + public static String toContextTypeName(final IGrammar grammar) { + String name = grammar.getName(); + if (name == null) { + name = ""; + } + name += " (" + grammar.getScopeName() + ")"; + return name; + } + + public static @Nullable IGrammar toGrammar(final String contextTypeName) { + final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); + + return Arrays.stream(grammarDefinitions) + .map(IGrammarDefinition::getScope) + .map(scope -> TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope)) + .filter(grammar -> grammar != null) + .map(NullSafetyHelper::castNonNull) + .filter(grammar -> contextTypeName.equals(toContextTypeName(grammar))) + .findFirst().orElse(null); + } + } From 36844a9a1b234c25dcf86460060751fbfeef68f9 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Thu, 29 Jan 2026 18:09:42 +0100 Subject: [PATCH 20/28] Highlight code template variables in preferences --- docs/img/templates_preferences.png | Bin 82079 -> 96988 bytes .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 1 + .../CustomCodeTemplatePreferencePage.java | 139 ++++++++++++++++-- 3 files changed, 130 insertions(+), 10 deletions(-) diff --git a/docs/img/templates_preferences.png b/docs/img/templates_preferences.png index 7d4a00d1be94bb070f65a1c66e34481b80c513b5..fe4b0942cf28c418c4771a1a914566c88f29e53f 100644 GIT binary patch literal 96988 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

2m$T?-$x7=kMByp~fS;X!5~DxRExF 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�^SgiPI*mal+#k)rO$$7v`?M?Oo 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 literal 82079 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 { - if (editTemplatePresentationReconsiler != null - && e.widget instanceof final Combo combo - && !combo.isDisposed()) { - final String activeContextTypeName = combo.getText(); - final IGrammar grammar = CodeTemplateContextTypeUtils.toGrammar(activeContextTypeName); - NullSafetyHelper.castNonNull(editTemplatePresentationReconsiler).setGrammar(grammar); + if (e.widget instanceof Combo) { + updateSyntaxHighlighting(); } }); } @@ -108,6 +216,17 @@ protected Control createDialogArea(final Composite ancestor) { return result; } + private void updateSyntaxHighlighting() { + if (editTemplatePresentationReconsiler == null || contextTypeDropDownList == null + || NullSafetyHelper.castNonNull(contextTypeDropDownList).isDisposed()) { + return; + } + + final String activeContextTypeName = NullSafetyHelper.castNonNull(contextTypeDropDownList).getText(); + final IGrammar grammar = CodeTemplateContextTypeUtils.toGrammar(activeContextTypeName); + NullSafetyHelper.castNonNull(editTemplatePresentationReconsiler).setGrammar(grammar); + } + @Override protected SourceViewer createViewer(final @Nullable Composite parent) { final SourceViewer originalViewer = super.createViewer(parent); @@ -131,8 +250,7 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { @Override public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { - // TODO Is there a hopefully easy way of adding highlighting for code template variables in all grammars? - editTemplatePresentationReconsiler = new TMPresentationReconciler(); + editTemplatePresentationReconsiler = new TMCodeTemplatePresentationReconsiler(); return editTemplatePresentationReconsiler; } }; @@ -140,6 +258,8 @@ public IPresentationReconciler getPresentationReconciler(@Nullable final ISource originalViewer.configure(configuration); } + originalViewer.addTextListener(event -> updateSyntaxHighlighting()); + return originalViewer; } } @@ -170,8 +290,7 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { @Override public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { - // TODO Is there a hopefully easy way of adding highlighting for code template variables in all grammars? - previewReconsiler = new TMPresentationReconciler(); + previewReconsiler = new TMCodeTemplatePresentationReconsiler(); return previewReconsiler; } }; From feeaf097d941360b436c4027e0fd3af3647a9d99 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Thu, 29 Jan 2026 18:36:22 +0100 Subject: [PATCH 21/28] Remove unnecessary type check --- .../CustomCodeTemplatePreferencePage.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 08f5cf755..fa1d9bc4d 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -27,7 +27,6 @@ import org.eclipse.jface.text.contentassist.IContentAssistant; import org.eclipse.jface.text.presentation.IPresentationReconciler; import org.eclipse.jface.text.source.ISourceViewer; -import org.eclipse.jface.text.source.ISourceViewerExtension2; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.text.templates.Template; @@ -234,29 +233,28 @@ protected SourceViewer createViewer(final @Nullable Composite parent) { // work-around 3: re-use source viewer from parent class, but add our reconsiler for syntax highlighting // by un-configuring and re-configuring the source viewer with a modified SourceViewerConfiguration final IContentAssistProcessor templateVariableProcessor = getTemplateProcessor(); - if (originalViewer instanceof final ISourceViewerExtension2 viewerExtension) { - viewerExtension.unconfigure(); - - final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { - @Override - public @Nullable IContentAssistant getContentAssistant(@Nullable final ISourceViewer sourceViewer) { - - final ContentAssistant assistant = new ContentAssistant(); - assistant.enableAutoActivation(true); - assistant.enableAutoInsert(true); - assistant.setContentAssistProcessor(templateVariableProcessor, IDocument.DEFAULT_CONTENT_TYPE); - return assistant; - } - @Override - public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { - editTemplatePresentationReconsiler = new TMCodeTemplatePresentationReconsiler(); - return editTemplatePresentationReconsiler; - } - }; + originalViewer.unconfigure(); - originalViewer.configure(configuration); - } + final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { + @Override + public @Nullable IContentAssistant getContentAssistant(@Nullable final ISourceViewer sourceViewer) { + + final ContentAssistant assistant = new ContentAssistant(); + assistant.enableAutoActivation(true); + assistant.enableAutoInsert(true); + assistant.setContentAssistProcessor(templateVariableProcessor, IDocument.DEFAULT_CONTENT_TYPE); + return assistant; + } + + @Override + public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { + editTemplatePresentationReconsiler = new TMCodeTemplatePresentationReconsiler(); + return editTemplatePresentationReconsiler; + } + }; + + originalViewer.configure(configuration); originalViewer.addTextListener(event -> updateSyntaxHighlighting()); From 18f18de1f214e5ea47575cad0f69203816e0f461 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 30 Jan 2026 10:57:26 +0100 Subject: [PATCH 22/28] Fix compile error when built by Maven But for some reason, my IDE shows me compile errors. --- .../src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index b07555954..d417344d5 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -229,20 +229,19 @@ public ContextTypeRegistryWrapper(final ContextTypeRegistry registry) { this.delegate = registry; } - // TODO How can this null-safety check be handled correctly? - @SuppressWarnings("null") + // TODO Why does my IDE complain about mismatching types, but Maven doesn't? @Override - public Iterator<@Nullable TemplateContextType> contextTypes() { + public Iterator contextTypes() { return delegate.contextTypes(); } @Override - public void addContextType(final @Nullable TemplateContextType contextType) { + public void addContextType(final TemplateContextType contextType) { delegate.addContextType(contextType); } @Override - public @Nullable TemplateContextType getContextType(final @Nullable String id) { + public @Nullable TemplateContextType getContextType(final String id) { return delegate.getContextType(id); } From 3b7834ed36a6d95308c3ca26e8e5dee9e8bcdde5 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 30 Jan 2026 14:36:11 +0100 Subject: [PATCH 23/28] Remove unnecessary @Nullable annotations and null checks --- .../main/java/org/eclipse/tm4e/ui/TMUIPlugin.java | 1 - .../templates/TMTemplateCompletionProcessor.java | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index d417344d5..0c66bb225 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -229,7 +229,6 @@ public ContextTypeRegistryWrapper(final ContextTypeRegistry registry) { this.delegate = registry; } - // TODO Why does my IDE complain about mismatching types, but Maven doesn't? @Override public Iterator contextTypes() { return delegate.contextTypes(); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java index 19020fbb9..48f6d2411 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java @@ -173,8 +173,8 @@ public TMToken getToken() { } @Override - protected @Nullable TemplateContextType getContextType(final @Nullable ITextViewer viewer, final @Nullable IRegion region) { - if (viewer != null && region != null && viewer.getDocument() != null) { + protected @Nullable TemplateContextType getContextType(final ITextViewer viewer, final IRegion region) { + if (viewer.getDocument() != null) { final TmTokenRegion tokenRegion = retrieveTmTokenFor( NullSafetyHelper.castNonNull(viewer.getDocument()), region.getOffset()); if (tokenRegion != null) { @@ -192,21 +192,21 @@ public TMToken getToken() { } @Override - protected @Nullable Image getImage(final @Nullable Template template) { + protected @Nullable Image getImage(final Template template) { return TMImages.getImage(TMImages.IMG_TEMPLATE); } @Override - protected Template[] getTemplates(final @Nullable String contextTypeId) { + protected Template[] getTemplates(final String contextTypeId) { final TMUIPlugin plugin = TMUIPlugin.getDefault(); - if (contextTypeId == null || plugin == null) { + if (plugin == null) { return NO_TEMPLATES; } final TemplateStore templateStore = plugin.getTemplateStore(); final Template[] customTemplates = templateStore.getTemplates(contextTypeId); - if (customTemplates == null || customTemplates.length == 0) { + if (customTemplates.length == 0) { return NO_TEMPLATES; } return customTemplates; From d08a40587c55f2c32664738e81e55ff2461a081a Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Fri, 30 Jan 2026 18:35:22 +0100 Subject: [PATCH 24/28] Avoid unnecessary calls of castNonNull(...) --- .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 89 +++++++++---------- .../CustomCodeTemplatePreferencePage.java | 28 +++--- .../TMTemplateCompletionProcessor.java | 20 ++--- 3 files changed, 65 insertions(+), 72 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 0c66bb225..1dda5e4e5 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -22,13 +22,11 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; -import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.text.templates.ContextTypeRegistry; import org.eclipse.tm4e.core.grammar.IGrammar; -import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; @@ -188,36 +186,34 @@ public void stop(final BundleContext context) throws Exception { } public ContextTypeRegistry getTemplateContextRegistry() { - @NonNull - ContributionContextTypeRegistry result; - - if (contextTypeRegistry == null) { - result = new ContributionContextTypeRegistry(TEMPLATES_REGISTRY_ID); - contextTypeRegistry = result; - - result.addContextType(DefaultTMTemplateContextType.CONTEXT_ID); - result.addContextType(CommentTemplateContextType.CONTEXT_ID); - result.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); - - // Add language-specific context types - // TODO Skip certain grammars? Some grammars have no name or are only used for highlighting code snippets, e.g. in Markdown - final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); - for (final IGrammarDefinition definition : grammarDefinitions) { - final ITMScope languageScope = definition.getScope(); - final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(languageScope); - if (languageGrammar != null) { - // TODO It seems TemplatePreferencePage.EditTemplateDialog requires the context type names to be unique. Can we shorten the names somehow? - final String contextTypeName = CodeTemplateContextTypeUtils.toContextTypeName(languageGrammar); - final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( - contextTypeName, languageScope); - result.addContextType(languageContextType); - } - } + final var contextTypeRegistry = this.contextTypeRegistry; + if (contextTypeRegistry != null) { + return contextTypeRegistry; + } - } else { - result = NullSafetyHelper.castNonNull(contextTypeRegistry); + final var newContextTypeRegistry = new ContributionContextTypeRegistry(TEMPLATES_REGISTRY_ID); + this.contextTypeRegistry = newContextTypeRegistry; + + newContextTypeRegistry.addContextType(DefaultTMTemplateContextType.CONTEXT_ID); + newContextTypeRegistry.addContextType(CommentTemplateContextType.CONTEXT_ID); + newContextTypeRegistry.addContextType(DocumentationCommentTemplateContextType.CONTEXT_ID); + + // Add language-specific context types + // TODO Skip certain grammars? Some grammars have no name or are only used for highlighting code snippets, e.g. in Markdown + final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); + for (final IGrammarDefinition definition : grammarDefinitions) { + final ITMScope languageScope = definition.getScope(); + final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(languageScope); + if (languageGrammar != null) { + // TODO It seems TemplatePreferencePage.EditTemplateDialog requires the context type names to be unique. Can we shorten the names somehow? + final String contextTypeName = CodeTemplateContextTypeUtils.toContextTypeName(languageGrammar); + final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( + contextTypeName, languageScope); + newContextTypeRegistry.addContextType(languageContextType); + } } - return result; + + return newContextTypeRegistry; } @SuppressWarnings("deprecation") @@ -251,26 +247,25 @@ public static ContextTypeRegistryWrapper from(final ContextTypeRegistry registry } public TemplateStore getTemplateStore() { - @NonNull - TemplateStore result; - - if (templateStore == null) { - result = new ContributionTemplateStore(from(getTemplateContextRegistry()), getPreferenceStore(), - CUSTOM_TEMPLATES_KEY); - templateStore = result; - - try { - result.load(); - } catch (final IOException e) { - Platform.getLog(this.getClass()).error(e.getMessage(), e); - } + final var templateStore = this.templateStore; - result.startListeningForPreferenceChanges(); - } else { - result = NullSafetyHelper.castNonNull(templateStore); + if (templateStore != null) { + return templateStore; + } + + final TemplateStore newTemplateStore = new ContributionTemplateStore( + from(getTemplateContextRegistry()), getPreferenceStore(), CUSTOM_TEMPLATES_KEY); + this.templateStore = newTemplateStore; + + try { + newTemplateStore.load(); + } catch (final IOException e) { + Platform.getLog(this.getClass()).error(e.getMessage(), e); } - return result; + newTemplateStore.startListeningForPreferenceChanges(); + + return newTemplateStore; } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index fa1d9bc4d..dc3ae5a5c 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -43,7 +43,6 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.text.templates.TemplatePersistenceData; import org.eclipse.tm4e.core.grammar.IGrammar; -import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; import org.eclipse.tm4e.ui.TMUIPlugin; @@ -80,12 +79,13 @@ public void setDocument(@Nullable final IDocument document) { } public void createPresentation(final @Nullable TextPresentation presentation, final @Nullable IRegion damage) { + final var document = this.document; if (presentation == null || damage == null || document == null) { return; } try { - final String code = NullSafetyHelper.castNonNull(document).get(damage.getOffset(), damage.getLength()); + final String code = document.get(damage.getOffset(), damage.getLength()); final Matcher varMatcher = VARIABLE_PATTERN.matcher(code); while (varMatcher.find()) { final int offset = damage.getOffset() + varMatcher.start(); @@ -127,25 +127,23 @@ public void onInstalled(final ITextViewer viewer, final IDocument document) { @Override public void onColorized(final TextPresentation presentation, @Nullable final Throwable error) { + final var viewer = TMCodeTemplatePresentationReconsiler.this.viewer; if (viewer != null && viewer.getDocument() != null) { - final ITextViewer theViewer = NullSafetyHelper.castNonNull(viewer); - - final IDocument document = theViewer.getDocument(); + final IDocument document = viewer.getDocument(); templateVariableDamagerRepairer.setDocument(document); // highlight code template variables final IRegion region = presentation.getExtent(); templateVariableDamagerRepairer.createPresentation(presentation, region); - theViewer.changeTextPresentation(presentation, false); + viewer.changeTextPresentation(presentation, false); } } }); - if (newGrammar == null && viewer != null && viewer.getDocument() != null) { - final ITextViewer theViewer = NullSafetyHelper.castNonNull(viewer); - - final IDocument document = NullSafetyHelper.castNonNull(theViewer.getDocument()); + final var viewer = this.viewer; + final var document = viewer != null ? viewer.getDocument() : null; + if (newGrammar == null && viewer != null && document != null) { templateVariableDamagerRepairer.setDocument(document); // create default style range for whole document @@ -156,7 +154,7 @@ public void onColorized(final TextPresentation presentation, @Nullable final Thr // highlight code template variables templateVariableDamagerRepairer.createPresentation(presentation, region); - theViewer.changeTextPresentation(presentation, false); + viewer.changeTextPresentation(presentation, false); } } @@ -216,14 +214,16 @@ protected Control createDialogArea(final Composite ancestor) { } private void updateSyntaxHighlighting() { + final var editTemplatePresentationReconsiler = this.editTemplatePresentationReconsiler; + final var contextTypeDropDownList = this.contextTypeDropDownList; if (editTemplatePresentationReconsiler == null || contextTypeDropDownList == null - || NullSafetyHelper.castNonNull(contextTypeDropDownList).isDisposed()) { + || contextTypeDropDownList.isDisposed()) { return; } - final String activeContextTypeName = NullSafetyHelper.castNonNull(contextTypeDropDownList).getText(); + final String activeContextTypeName = contextTypeDropDownList.getText(); final IGrammar grammar = CodeTemplateContextTypeUtils.toGrammar(activeContextTypeName); - NullSafetyHelper.castNonNull(editTemplatePresentationReconsiler).setGrammar(grammar); + editTemplatePresentationReconsiler.setGrammar(grammar); } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java index 48f6d2411..2d4d7ad37 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java @@ -28,7 +28,6 @@ import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.swt.graphics.Image; import org.eclipse.text.templates.ContextTypeRegistry; -import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.core.model.TMToken; import org.eclipse.tm4e.ui.TMImages; import org.eclipse.tm4e.ui.TMUIPlugin; @@ -174,21 +173,20 @@ public TMToken getToken() { @Override protected @Nullable TemplateContextType getContextType(final ITextViewer viewer, final IRegion region) { - if (viewer.getDocument() != null) { - final TmTokenRegion tokenRegion = retrieveTmTokenFor( - NullSafetyHelper.castNonNull(viewer.getDocument()), region.getOffset()); + final var plugin = TMUIPlugin.getDefault(); + if (plugin == null) { + return null; + } + + final var document = viewer.getDocument(); + if (document != null) { + final TmTokenRegion tokenRegion = retrieveTmTokenFor(document, region.getOffset()); if (tokenRegion != null) { return retrieveTemplateContextType(tokenRegion.getToken()); } } - final TMUIPlugin plugin = TMUIPlugin.getDefault(); - if (plugin == null) { - return null; - } - - return plugin.getTemplateContextRegistry() - .getContextType(DefaultTMTemplateContextType.CONTEXT_ID); + return plugin.getTemplateContextRegistry().getContextType(DefaultTMTemplateContextType.CONTEXT_ID); } @Override From fd17d894e306b633ba73cab2595d38add03cbc21 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Mon, 2 Feb 2026 10:51:23 +0100 Subject: [PATCH 25/28] Simplify async method call Replace UI.getDisplay().syncExec(...) with UI.syncRun(...) and simplify code. --- .../TMTemplateCompletionProcessor.java | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java index 2d4d7ad37..38d7dc8b9 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/templates/TMTemplateCompletionProcessor.java @@ -11,8 +11,6 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.internal.templates; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.Platform; @@ -40,26 +38,12 @@ public class TMTemplateCompletionProcessor extends TemplateCompletionProcessor { - private static final ICompletionProposal[] NO_PROPOSALS = {}; private static final Template[] NO_TEMPLATES = {}; @Override public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer, final int offset) { - // TODO check why Invalid thread access exception occurs here without syncExec() - final ArrayList templateProposals = new ArrayList<>(); - UI.getDisplay().syncExec(() -> { - final ICompletionProposal[] proposalsFromParent = TMTemplateCompletionProcessor.super.computeCompletionProposals( - viewer, offset); - Collections.addAll(templateProposals, proposalsFromParent); - }); - - if (templateProposals.size() > 0) { - final ICompletionProposal[] proposals = templateProposals - .toArray(new ICompletionProposal[templateProposals.size()]); - return proposals; - } - - return NO_PROPOSALS; + // TODO Check why Invalid thread access exception occurs here without UI.runSync() + return UI.runSync(() -> TMTemplateCompletionProcessor.super.computeCompletionProposals(viewer, offset)); } private static class TmTokenRegion implements IRegion { From 456ea93dc934dad3279520e55a8b9dc64cea2888 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Mon, 2 Feb 2026 14:11:20 +0100 Subject: [PATCH 26/28] Use content type name instead of grammar name for unique context type names Thanks to @sebthom's [hint](https://github.com/eclipse-tm4e/tm4e/pull/988#discussion_r2747583850) we're using the content type name instead of the grammar name for building a unique code template context type name. The grammar name is more often not available and is often less human-readable. --- .../java/org/eclipse/tm4e/ui/TMUIPlugin.java | 16 ++++------ .../utils/CodeTemplateContextTypeUtils.java | 32 +++++++++++++------ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java index 1dda5e4e5..18837c9d0 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/TMUIPlugin.java @@ -26,7 +26,6 @@ import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.text.templates.ContextTypeRegistry; -import org.eclipse.tm4e.core.grammar.IGrammar; import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; @@ -203,14 +202,13 @@ public ContextTypeRegistry getTemplateContextRegistry() { final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); for (final IGrammarDefinition definition : grammarDefinitions) { final ITMScope languageScope = definition.getScope(); - final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(languageScope); - if (languageGrammar != null) { - // TODO It seems TemplatePreferencePage.EditTemplateDialog requires the context type names to be unique. Can we shorten the names somehow? - final String contextTypeName = CodeTemplateContextTypeUtils.toContextTypeName(languageGrammar); - final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( - contextTypeName, languageScope); - newContextTypeRegistry.addContextType(languageContextType); - } + + // TODO It seems TemplatePreferencePage.EditTemplateDialog requires the context type names to be unique. Can we shorten the names somehow? + final String contextTypeName = CodeTemplateContextTypeUtils.toContextTypeName(languageScope); + + final TMLanguageTemplateContextType languageContextType = new TMLanguageTemplateContextType( + contextTypeName, languageScope); + newContextTypeRegistry.addContextType(languageContextType); } return newContextTypeRegistry; diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java index 34bc88b71..5c98343d5 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/CodeTemplateContextTypeUtils.java @@ -12,10 +12,11 @@ package org.eclipse.tm4e.ui.internal.utils; import java.util.Arrays; +import java.util.Collection; +import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tm4e.core.grammar.IGrammar; -import org.eclipse.tm4e.core.internal.utils.NullSafetyHelper; import org.eclipse.tm4e.core.model.TMToken; import org.eclipse.tm4e.registry.IGrammarDefinition; import org.eclipse.tm4e.registry.ITMScope; @@ -47,12 +48,27 @@ public static String toContextTypeId(final TMToken textMateToken) { .findFirst().orElse(null); } - public static String toContextTypeName(final IGrammar grammar) { - String name = grammar.getName(); - if (name == null) { - name = ""; + public static @Nullable String getContentTypeName(final ITMScope languageScope) { + @Nullable + final Collection contentTypes = TMEclipseRegistryPlugin.getGrammarRegistryManager() + .getContentTypesForScope(languageScope); + + if (contentTypes != null && contentTypes.size() > 0) { + // we only consider the first content type + return contentTypes.iterator().next().getName(); + } + return null; + } + + public static String toContextTypeName(final ITMScope languageScope) { + final String contentTypeName = getContentTypeName(languageScope); + + String name = ""; + if (contentTypeName != null) { + name = contentTypeName; } - name += " (" + grammar.getScopeName() + ")"; + + name += " (" + languageScope.getQualifiedName() + ")"; return name; } @@ -61,10 +77,8 @@ public static String toContextTypeName(final IGrammar grammar) { return Arrays.stream(grammarDefinitions) .map(IGrammarDefinition::getScope) + .filter(scope -> contextTypeName.equals(toContextTypeName(scope))) .map(scope -> TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope)) - .filter(grammar -> grammar != null) - .map(NullSafetyHelper::castNonNull) - .filter(grammar -> contextTypeName.equals(toContextTypeName(grammar))) .findFirst().orElse(null); } From 95b42971ab8110585c7d923f70604522a7ed9b2c Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Mon, 2 Feb 2026 14:23:21 +0100 Subject: [PATCH 27/28] Remove unnecessary type check --- .../preferences/CustomCodeTemplatePreferencePage.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index dc3ae5a5c..4167330f9 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -195,9 +195,7 @@ protected Control createDialogArea(final Composite ancestor) { updateSyntaxHighlighting(); dropDownList.addModifyListener(e -> { - if (e.widget instanceof Combo) { - updateSyntaxHighlighting(); - } + updateSyntaxHighlighting(); }); } From 252ace7d3a531b6a43c08a84f2155479766a9ecd Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Mon, 2 Feb 2026 14:29:28 +0100 Subject: [PATCH 28/28] Extract method --- .../CustomCodeTemplatePreferencePage.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java index 4167330f9..76e8352b2 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/CustomCodeTemplatePreferencePage.java @@ -174,8 +174,15 @@ public TMEditTemplateDialog(final Shell shell, final Template template, final bo protected Control createDialogArea(final Composite ancestor) { final Control result = super.createDialogArea(ancestor); + findContextTypeComboAndSetMinNameFieldWidth(ancestor); + + return result; + } + + private void findContextTypeComboAndSetMinNameFieldWidth(final Composite ancestor) { // work-around 1: find the name text field and set a minimum width - // work-around 2: find the combo box (drop-down list) and register a modify listener for updating the reconsiler's grammar to the current context type + // work-around 2: find the combo box (drop-down list) and register a modify listener for updating + // the reconsiler's grammar to the current context type boolean foundNameField = false; boolean foundDropDownList = false; for (final Control childControlLvl1 : ancestor.getChildren()) { @@ -200,15 +207,13 @@ protected Control createDialogArea(final Composite ancestor) { } if (foundNameField && foundDropDownList) { - return result; + return; } } } } } } - - return result; } private void updateSyntaxHighlighting() {