From cdd00392c1d1843c1123785a2b3ea823846e6455 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Wed, 24 Feb 2021 15:10:20 -0500 Subject: [PATCH] Bug 571472: Don't resolve multi-line strings Change-Id: Id6a8b208cb6bc965a2c8d781ba41bca3b3094685 --- .../eclipse/cdt/utils/CdtVariableResolverTest.java | 11 +++++++++++ .../cdt/utils/cdtvariables/CdtVariableResolver.java | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/utils/CdtVariableResolverTest.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/utils/CdtVariableResolverTest.java index 677885b97bc..5d202c7894a 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/utils/CdtVariableResolverTest.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/utils/CdtVariableResolverTest.java @@ -50,6 +50,15 @@ public class CdtVariableResolverTest extends TestCase { if (macroName.equals("LOOP")) { return "${loop}"; } + if (macroName.equals("VAR1")) { + return "var1"; + } + if (macroName.equals("VAR2")) { + return "var\n2"; + } + if (macroName.equals("VAR3")) { + return "var3"; + } if (macroName.equals(acceptedChars)) { return "OK"; } @@ -110,6 +119,8 @@ public class CdtVariableResolverTest extends TestCase { assertEquals("#workspace_loc:#Macro1#/#Macro2##", resolveToString("${workspace_loc:${Macro1}/${Macro2}}")); assertEquals("#workspace_loc:#project_loc:/#Macro###", resolveToString("${workspace_loc:${project_loc:/${Macro}}}")); + assertEquals("${ignored}\n${multiline}", resolveToString("${ignored}\n${multiline}")); + assertEquals("var1 var\n2 var3", resolveToString("${VAR1} ${VAR2} ${VAR3}")); } diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/cdtvariables/CdtVariableResolver.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/cdtvariables/CdtVariableResolver.java index 818f50f357b..b5ec1ec381e 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/cdtvariables/CdtVariableResolver.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/cdtvariables/CdtVariableResolver.java @@ -95,6 +95,8 @@ public class CdtVariableResolver { * ${workspace_loc:/${ProjName}/} but resolved just once. No recursive * macro names are allowed. * It is not possible to prevent macros from expanding. + * For historical reasons (See Bug 571472), macros that are multi-line according to + * {@link Pattern}'s Line Terminators are not expanded. * * @param string - macro expression. * @param substitutor - macro resolution provider to retrieve macro values. @@ -106,6 +108,12 @@ public class CdtVariableResolver { if (string == null) { return EMPTY_STRING; } + // Bug 571472 to match historical behaviour, don't substitute multi-line strings + for (char ch : string.toCharArray()) { + if (ch == '\n' || ch == '\r' || (ch | 1) == '\u2029' || ch == '\u0085') { + return string; + } + } final Pattern pattern = Pattern.compile("(\\$\\{([^${}]*)\\})"); //$NON-NLS-1$ final String VARIABLE_PREFIX_MASKED = "$\1"; //$NON-NLS-1$