diff options
Diffstat (limited to 'org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateTranslator.java')
-rw-r--r-- | org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateTranslator.java | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateTranslator.java b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateTranslator.java index dcb00151040..c56d826edb7 100644 --- a/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateTranslator.java +++ b/org.eclipse.text/src/org/eclipse/jface/text/templates/TemplateTranslator.java @@ -14,10 +14,15 @@ package org.eclipse.jface.text.templates; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -221,9 +226,39 @@ public class TemplateTranslator { buffer.append(string.substring(complete)); TemplateVariable[] vars= createVariables(variables); + fixOffsetsAndBuffer(buffer, vars); return new TemplateBuffer(buffer.toString(), vars); } + /** + * In cases default value is provided dynamically when instantiating the variable (so not part + * of the {@link VariableDescription}), the buffer would actually contain incorrect text (name instead + * of default value) and offsets can also be inconsistent if variable name and default value have different + * length. This methods fix both buffer and variable offsets to ensure default value is used. + * @param buffer the default template string + * @param vars variables + */ + private void fixOffsetsAndBuffer(StringBuilder buffer, TemplateVariable[] vars) { + SortedMap<Integer, TemplateVariable> varsByOffset = new TreeMap<>(); + for (TemplateVariable var : vars) { + for (int offset : var.getOffsets()) { + varsByOffset.put(Integer.valueOf(offset), var); + } + } + int totalOffsetDelta = 0; + Map<TemplateVariable, Collection<Integer>> fixedOffsets = new HashMap<>(vars.length, 1.f); + for (Entry<Integer, TemplateVariable> entry : varsByOffset.entrySet()) { + final int initialOffset = entry.getKey().intValue(); + TemplateVariable variable = entry.getValue(); + final int fixedOffset = initialOffset + totalOffsetDelta; + fixedOffsets.computeIfAbsent(variable, v -> new ArrayList<>(v.getOffsets().length)).add(Integer.valueOf(fixedOffset)); + int currentOffsetDelta = variable.getDefaultValue().length() - variable.getName().length(); + buffer.replace(fixedOffset, fixedOffset + variable.getName().length(), variable.getDefaultValue()); + totalOffsetDelta += currentOffsetDelta; + } + fixedOffsets.forEach((variable, fixs) -> variable.setOffsets(fixs.stream().mapToInt(Integer::valueOf).toArray())); + } + private TemplateVariableType createType(String typeName, String paramString) { if (typeName == null) return null; @@ -237,7 +272,7 @@ public class TemplateTranslator { String argument= matcher.group(); if (argument.charAt(0) == '\'') { // argumentText - argument= argument.substring(1, argument.length() - 1).replaceAll("''", "'"); //$NON-NLS-1$ //$NON-NLS-2$ + argument= argument.substring(1, argument.length() - 1).replace("''", "'"); //$NON-NLS-1$ //$NON-NLS-2$ } params.add(argument); @@ -260,10 +295,11 @@ public class TemplateTranslator { * @param name the name of the variable * @param type the variable type, <code>null</code> for not defined * @param offset the buffer offset of the variable + * @return the variable description found or created for that name * @throws TemplateException if merging the type fails * @since 3.3 */ - private void updateOrCreateVariable(Map<String, VariableDescription> variables, String name, TemplateVariableType type, int offset) throws TemplateException { + private VariableDescription updateOrCreateVariable(Map<String, VariableDescription> variables, String name, TemplateVariableType type, int offset) throws TemplateException { VariableDescription varDesc= variables.get(name); if (varDesc == null) { varDesc= new VariableDescription(name, type); @@ -272,6 +308,7 @@ public class TemplateTranslator { varDesc.mergeType(type); } varDesc.fOffsets.add(Integer.valueOf(offset)); + return varDesc; } /** |