docs: protected final synchronized String replaceMacro(String macroName, String text, String replacement,
  			ReplacementType type, boolean enableWarning, File sourceFile, int sourceLine) {
  		if (replacement != null && !EMPTY_STRING.equals(replacement)) {
  			final Pattern p = buildMacroPattern(macroName);
  			final Matcher m = p.matcher(text);
  			return m.replaceAll(Matcher.quoteReplacement(replacement));
  		}
  		if (enableWarning) {
  			getBuildContext().addMessage(
  					sourceFile,
  					sourceLine, 1,
  					"cannot replace empty macro $" + macroName + "$", //$NON-NLS-1$ //$NON-NLS-2$
  					BuildContext.SEVERITY_WARNING, null);
  		}
  		return text;
  	}