int (int offset, TemplateImpl template, Map<String, String> predefinedVarValues) { myIsToReformat = myText.length() > 0 || template.isToReformat(); removeEndVarAtOffset(offset); String text = template.getTemplateText(); insertText(offset, text, false); Set<String> oldVarNames = new HashSet<>(); for (int i = 0; i < template.getVariableCount(); i++) { String varName = template.getVariableNameAt(i); oldVarNames.add(varName); } Map<String, String> newVarNames = new HashMap<>(); for (int i = 0; i < template.getVariableCount(); i++) { String varName = template.getVariableNameAt(i); if (!TemplateImpl.INTERNAL_VARS_SET.contains(varName)) { if (predefinedVarValues != null && predefinedVarValues.containsKey(varName)) { continue; } String newVarName; if (myVarNames.contains(varName)) { oldVarNames.remove(varName); newVarName = generateUniqueVarName(oldVarNames, isEndVariable(varName)); newVarNames.put(varName, newVarName); if (varName.equals(myLastEndVarName)) { myLastEndVarName = newVarName; } } else { newVarName = varName; } Variable var = new Variable(newVarName, template.getExpressionStringAt(i), template.getDefaultValueStringAt(i), template.isAlwaysStopAt(i)); if (mySegmentLimit >= 0 && myVariables.size() >= mySegmentLimit) { if (mySegmentLimit > 0) { warnTooManySegments(myVariables.size()); } break; } myVariables.add(var); myVarNames.add(newVarName); } } int end = -1; for (int i = 0; i < template.getSegmentsCount(); i++) { String segmentName = template.getSegmentName(i); int localOffset = template.getSegmentOffset(i); if (TemplateImpl.END.equals(segmentName)) { end = offset + localOffset; } else { if (predefinedVarValues != null && predefinedVarValues.containsKey(segmentName)) { String value = predefinedVarValues.get(segmentName); insertText(offset + localOffset, value, false); offset += value.length(); continue; } if (newVarNames.containsKey(segmentName)) { segmentName = newVarNames.get(segmentName); } myVariableOccurrences.add(new VarOccurence(segmentName, offset + localOffset)); } } int endOffset = end >= 0 ? end : offset + text.length(); if (endOffset > 0 && endOffset != offset + text.length() && endOffset < myText.length() && !hasVarAtOffset(endOffset)) { myLastEndVarName = generateUniqueVarName(myVarNames, true); myVariables.add(new Variable(myLastEndVarName, "", "", true)); myVarNames.add(myLastEndVarName); myVariableOccurrences.add(new VarOccurence(myLastEndVarName, endOffset)); } return endOffset; }