mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-05 06:33:23 +02:00
Bug 578683: o.e.cdt.jsoncdb.core Arglets are not thread safe
Change-Id: I5f54d6729cffcf47382a37a436a2772a5ca84340 Signed-off-by: Martin Weber <fifteenknots505@gmail.com>
This commit is contained in:
parent
ab1c0fddc4
commit
1c404b050d
6 changed files with 115 additions and 71 deletions
|
@ -70,6 +70,12 @@
|
||||||
<li><a href="#GnuMakefileGeneratorAPI">GnuMakefileGenerator is no longer part of API</a></li>
|
<li><a href="#GnuMakefileGeneratorAPI">GnuMakefileGenerator is no longer part of API</a></li>
|
||||||
<li><a href="#Spawner.signals">The Spawner signal constants are nolonger API</a></li>
|
<li><a href="#Spawner.signals">The Spawner signal constants are nolonger API</a></li>
|
||||||
</ol>
|
</ol>
|
||||||
|
<p>
|
||||||
|
Planned Removals after March 2024
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li><a href="#ArgletsMatcher">java.util.regex.Matcher use in JSONCDB API will be removed</a></li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
API Changes prior to CDT 10.0 / 2020-09.
|
API Changes prior to CDT 10.0 / 2020-09.
|
||||||
|
@ -524,6 +530,23 @@
|
||||||
<li>INT</li>
|
<li>INT</li>
|
||||||
<li>CTRLC</li>
|
<li>CTRLC</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h3>API Removals after March 2024</h3>
|
||||||
|
|
||||||
|
<h3>1. <a name="ArgletsMatcher">java.util.regex.Matcher use in JSONCDB API will be removed</a></h3>
|
||||||
|
<p>
|
||||||
|
The following fields will be removed from the API as it is not thread safe. Use the patten instead and call matcher(input) to obtain a matcher.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>org.eclipse.cdt.jsoncdb.core.participant.Arglets.NameOptionMatcher.matcher</li>
|
||||||
|
<li>org.eclipse.cdt.jsoncdb.core.participant.DefaultToolDetectionParticipant.toolNameMatchersExt</li>
|
||||||
|
<li>org.eclipse.cdt.jsoncdb.core.participant.DefaultToolDetectionParticipant.toolNameMatchersExtBackslash</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=578683" target="_blank">Bug 578683</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
@ -389,8 +390,8 @@ public final class ParserDetection {
|
||||||
*/
|
*/
|
||||||
public ParserDetectionResult(DetectorWithMethod detectorWMethod,
|
public ParserDetectionResult(DetectorWithMethod detectorWMethod,
|
||||||
DefaultToolDetectionParticipant.MatchResult commandLine) {
|
DefaultToolDetectionParticipant.MatchResult commandLine) {
|
||||||
this.detectorWMethod = detectorWMethod;
|
this.detectorWMethod = Objects.requireNonNull(detectorWMethod, "detectorWMethod");
|
||||||
this.commandLine = commandLine;
|
this.commandLine = Objects.requireNonNull(commandLine, "commandLine");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -62,7 +62,13 @@ public final class Arglets {
|
||||||
* @author Martin Weber
|
* @author Martin Weber
|
||||||
*/
|
*/
|
||||||
public static class NameOptionMatcher {
|
public static class NameOptionMatcher {
|
||||||
|
/**
|
||||||
|
* Do not use the matcher field, it is not thread safe. Instead use pattern.matcher(input).
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
final Matcher matcher;
|
final Matcher matcher;
|
||||||
|
final Pattern pattern;
|
||||||
final int nameGroup;
|
final int nameGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -72,14 +78,15 @@ public final class Arglets {
|
||||||
* @param nameGroup - capturing group number defining name of an entry.
|
* @param nameGroup - capturing group number defining name of an entry.
|
||||||
*/
|
*/
|
||||||
public NameOptionMatcher(String pattern, int nameGroup) {
|
public NameOptionMatcher(String pattern, int nameGroup) {
|
||||||
this.matcher = Pattern.compile(pattern).matcher(EMPTY_STR);
|
this.pattern = Pattern.compile(pattern);
|
||||||
|
this.matcher = this.pattern.matcher(EMPTY_STR);
|
||||||
this.nameGroup = nameGroup;
|
this.nameGroup = nameGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("nls")
|
@SuppressWarnings("nls")
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "NameOptionMatcher [matcher=" + this.matcher + ", nameGroup=" + this.nameGroup + "]";
|
return "NameOptionMatcher [pattern=" + this.pattern + ", nameGroup=" + this.nameGroup + "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,13 +106,8 @@ public final class Arglets {
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param pattern - regular expression pattern being parsed by the parser.
|
* @param pattern regular expression pattern being parsed by the parser.
|
||||||
* @param nameGroup - capturing group number defining name of an entry.
|
* @param nameGroup the number of the value group
|
||||||
* @param valueGroup - capturing group number defining value of an entry.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @param pattern
|
|
||||||
* @param nameGroup
|
|
||||||
* @param valueGroup the number of the value group, or {@code -1} for a pattern
|
* @param valueGroup the number of the value group, or {@code -1} for a pattern
|
||||||
* that does not recognize a macro value
|
* that does not recognize a macro value
|
||||||
*/
|
*/
|
||||||
|
@ -117,7 +119,7 @@ public final class Arglets {
|
||||||
@SuppressWarnings("nls")
|
@SuppressWarnings("nls")
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "NameValueOptionMatcher [matcher=" + this.matcher + ", nameGroup=" + this.nameGroup + ", valueGroup="
|
return "NameValueOptionMatcher [pattern=" + this.pattern + ", nameGroup=" + this.nameGroup + ", valueGroup="
|
||||||
+ this.valueGroup + "]";
|
+ this.valueGroup + "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -134,9 +136,8 @@ public final class Arglets {
|
||||||
protected final int processArgument(IArgumentCollector resultCollector, String args,
|
protected final int processArgument(IArgumentCollector resultCollector, String args,
|
||||||
NameValueOptionMatcher[] optionMatchers) {
|
NameValueOptionMatcher[] optionMatchers) {
|
||||||
for (NameValueOptionMatcher oMatcher : optionMatchers) {
|
for (NameValueOptionMatcher oMatcher : optionMatchers) {
|
||||||
final Matcher matcher = oMatcher.matcher;
|
final Matcher matcher = oMatcher.pattern.matcher(args);
|
||||||
|
|
||||||
matcher.reset(args);
|
|
||||||
if (matcher.lookingAt()) {
|
if (matcher.lookingAt()) {
|
||||||
final String name = matcher.group(oMatcher.nameGroup);
|
final String name = matcher.group(oMatcher.nameGroup);
|
||||||
final String value = oMatcher.valueGroup == -1 ? null : matcher.group(oMatcher.valueGroup);
|
final String value = oMatcher.valueGroup == -1 ? null : matcher.group(oMatcher.valueGroup);
|
||||||
|
@ -159,9 +160,8 @@ public final class Arglets {
|
||||||
*/
|
*/
|
||||||
protected final int processArgument(IArgumentCollector resultCollector, String argsLine,
|
protected final int processArgument(IArgumentCollector resultCollector, String argsLine,
|
||||||
NameOptionMatcher optionMatcher) {
|
NameOptionMatcher optionMatcher) {
|
||||||
final Matcher oMatcher = optionMatcher.matcher;
|
final Matcher oMatcher = optionMatcher.pattern.matcher(argsLine);
|
||||||
|
|
||||||
oMatcher.reset(argsLine);
|
|
||||||
if (oMatcher.lookingAt()) {
|
if (oMatcher.lookingAt()) {
|
||||||
final String name = oMatcher.group(1);
|
final String name = oMatcher.group(1);
|
||||||
resultCollector.addUndefine(name);
|
resultCollector.addUndefine(name);
|
||||||
|
@ -185,9 +185,8 @@ public final class Arglets {
|
||||||
protected final int processArgument(boolean isSystemIncludePath, IArgumentCollector resultCollector, IPath cwd,
|
protected final int processArgument(boolean isSystemIncludePath, IArgumentCollector resultCollector, IPath cwd,
|
||||||
String argsLine, NameOptionMatcher[] optionMatchers) {
|
String argsLine, NameOptionMatcher[] optionMatchers) {
|
||||||
for (NameOptionMatcher oMatcher : optionMatchers) {
|
for (NameOptionMatcher oMatcher : optionMatchers) {
|
||||||
final Matcher matcher = oMatcher.matcher;
|
final Matcher matcher = oMatcher.pattern.matcher(argsLine);
|
||||||
|
|
||||||
matcher.reset(argsLine);
|
|
||||||
if (matcher.lookingAt()) {
|
if (matcher.lookingAt()) {
|
||||||
String name = matcher.group(oMatcher.nameGroup);
|
String name = matcher.group(oMatcher.nameGroup);
|
||||||
// workaround for relative path by cmake bug
|
// workaround for relative path by cmake bug
|
||||||
|
@ -221,9 +220,8 @@ public final class Arglets {
|
||||||
protected final int processArgument(IArgumentCollector resultCollector, IPath cwd, String argsLine,
|
protected final int processArgument(IArgumentCollector resultCollector, IPath cwd, String argsLine,
|
||||||
NameOptionMatcher[] optionMatchers) {
|
NameOptionMatcher[] optionMatchers) {
|
||||||
for (NameOptionMatcher oMatcher : optionMatchers) {
|
for (NameOptionMatcher oMatcher : optionMatchers) {
|
||||||
final Matcher matcher = oMatcher.matcher;
|
final Matcher matcher = oMatcher.pattern.matcher(argsLine);
|
||||||
|
|
||||||
matcher.reset(argsLine);
|
|
||||||
if (matcher.lookingAt()) {
|
if (matcher.lookingAt()) {
|
||||||
String name = matcher.group(oMatcher.nameGroup);
|
String name = matcher.group(oMatcher.nameGroup);
|
||||||
resultCollector.addIncludeFile(name);
|
resultCollector.addIncludeFile(name);
|
||||||
|
@ -246,9 +244,8 @@ public final class Arglets {
|
||||||
protected final int processArgument(IArgumentCollector resultCollector, IPath cwd, String argsLine,
|
protected final int processArgument(IArgumentCollector resultCollector, IPath cwd, String argsLine,
|
||||||
NameOptionMatcher[] optionMatchers) {
|
NameOptionMatcher[] optionMatchers) {
|
||||||
for (NameOptionMatcher oMatcher : optionMatchers) {
|
for (NameOptionMatcher oMatcher : optionMatchers) {
|
||||||
final Matcher matcher = oMatcher.matcher;
|
final Matcher matcher = oMatcher.pattern.matcher(argsLine);
|
||||||
|
|
||||||
matcher.reset(argsLine);
|
|
||||||
if (matcher.lookingAt()) {
|
if (matcher.lookingAt()) {
|
||||||
String name = matcher.group(oMatcher.nameGroup);
|
String name = matcher.group(oMatcher.nameGroup);
|
||||||
resultCollector.addMacroFile(name);
|
resultCollector.addMacroFile(name);
|
||||||
|
|
|
@ -71,19 +71,33 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
protected static final String REGEX_CMD_PATH_BSLASH_QUOTE_END = ")\\1\\s";
|
protected static final String REGEX_CMD_PATH_BSLASH_QUOTE_END = ")\\1\\s";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the Matchers to match the name of the tool (including its path, BUT WITHOUT
|
* the Patterns to match the name of the tool (including its path, BUT WITHOUT
|
||||||
* its filename extension) on a given command-line
|
* its filename extension) on a given command-line
|
||||||
*/
|
*/
|
||||||
private final Matcher[] toolNameMatchers;
|
private final Pattern[] toolNamePatterns;
|
||||||
private final Matcher[] toolNameMatchersBackslash;
|
private final Pattern[] toolNamePatternsBackslash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the Matcher that matches the name of the tool (including its path AND its
|
* the Matcher that matches the name of the tool (including its path AND its
|
||||||
* filename extension) on a given command-line or {@code null}
|
* filename extension) on a given command-line or {@code null}
|
||||||
|
*
|
||||||
|
* @deprecated Use toolNamePatternsExt instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
protected final Matcher[] toolNameMatchersExt;
|
protected final Matcher[] toolNameMatchersExt;
|
||||||
|
/**
|
||||||
|
* @deprecated Use toolNamePatternsExtBackslash instead
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
protected final Matcher[] toolNameMatchersExtBackslash;
|
protected final Matcher[] toolNameMatchersExtBackslash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the Pattern that matches the name of the tool (including its path AND its
|
||||||
|
* filename extension) on a given command-line or {@code null}
|
||||||
|
*/
|
||||||
|
private final Pattern[] toolNamePatternsExt;
|
||||||
|
private final Pattern[] toolNamePatternsExtBackslash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the corresponding parser for the tool arguments
|
* the corresponding parser for the tool arguments
|
||||||
*/
|
*/
|
||||||
|
@ -174,39 +188,48 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
this.alsoHandleNtfsPaths = alsoHandleNtfsPaths;
|
this.alsoHandleNtfsPaths = alsoHandleNtfsPaths;
|
||||||
this.extensionRegex = extensionRegex;
|
this.extensionRegex = extensionRegex;
|
||||||
|
|
||||||
this.toolNameMatchers = new Matcher[] {
|
this.toolNamePatterns = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_SLASH_QUOTE, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_SLASH_QUOTE, basenameRegex,
|
||||||
REGEX_CMD_PATH_SLASH_QUOTE_END)).matcher(""),
|
REGEX_CMD_PATH_SLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
||||||
REGEX_CMD_PATH_SLASH_END)).matcher("") };
|
REGEX_CMD_PATH_SLASH_END)) };
|
||||||
if (alsoHandleNtfsPaths) {
|
if (alsoHandleNtfsPaths) {
|
||||||
this.toolNameMatchersBackslash = new Matcher[] {
|
this.toolNamePatternsBackslash = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_BSLASH_QUOTE, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_BSLASH_QUOTE, basenameRegex,
|
||||||
REGEX_CMD_PATH_BSLASH_QUOTE_END)).matcher(""),
|
REGEX_CMD_PATH_BSLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
||||||
REGEX_CMD_PATH_BSLASH_END)).matcher("") };
|
REGEX_CMD_PATH_BSLASH_END)) };
|
||||||
} else {
|
} else {
|
||||||
this.toolNameMatchersBackslash = new Matcher[] {};
|
this.toolNamePatternsBackslash = new Pattern[] {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extensionRegex != null) {
|
if (extensionRegex != null) {
|
||||||
this.toolNameMatchersExt = new Matcher[] {
|
this.toolNamePatternsExt = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_SLASH_QUOTE, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_SLASH_QUOTE, basenameRegex,
|
||||||
extensionRegex, REGEX_CMD_PATH_SLASH_QUOTE_END)).matcher(""),
|
extensionRegex, REGEX_CMD_PATH_SLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
||||||
extensionRegex, REGEX_CMD_PATH_SLASH_END)).matcher("") };
|
extensionRegex, REGEX_CMD_PATH_SLASH_END)) };
|
||||||
if (alsoHandleNtfsPaths) {
|
if (alsoHandleNtfsPaths) {
|
||||||
this.toolNameMatchersExtBackslash = new Matcher[] {
|
this.toolNamePatternsExtBackslash = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH_QUOTE,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH_QUOTE,
|
||||||
basenameRegex, extensionRegex, REGEX_CMD_PATH_BSLASH_QUOTE_END)).matcher(""),
|
basenameRegex, extensionRegex, REGEX_CMD_PATH_BSLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
||||||
extensionRegex, REGEX_CMD_PATH_BSLASH_END)).matcher("") };
|
extensionRegex, REGEX_CMD_PATH_BSLASH_END)) };
|
||||||
} else {
|
} else {
|
||||||
this.toolNameMatchersExtBackslash = new Matcher[] {};
|
this.toolNamePatternsExtBackslash = new Pattern[] {};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.toolNameMatchersExt = new Matcher[] {};
|
this.toolNamePatternsExt = new Pattern[] {};
|
||||||
this.toolNameMatchersExtBackslash = new Matcher[] {};
|
this.toolNamePatternsExtBackslash = new Pattern[] {};
|
||||||
|
}
|
||||||
|
|
||||||
|
toolNameMatchersExt = new Matcher[toolNamePatternsExt.length];
|
||||||
|
for (int i = 0; i < toolNameMatchersExt.length; i++) {
|
||||||
|
toolNameMatchersExt[i] = toolNamePatternsExt[i].matcher("");
|
||||||
|
}
|
||||||
|
toolNameMatchersExtBackslash = new Matcher[toolNamePatternsExtBackslash.length];
|
||||||
|
for (int i = 0; i < toolNameMatchersExtBackslash.length; i++) {
|
||||||
|
toolNameMatchersExtBackslash[i] = toolNamePatternsExtBackslash[i].matcher((""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,8 +248,8 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
if (matchBackslash && !canHandleNtfsPaths()) {
|
if (matchBackslash && !canHandleNtfsPaths()) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
for (Matcher matcher : matchBackslash ? toolNameMatchersBackslash : toolNameMatchers) {
|
for (Pattern pattern : matchBackslash ? toolNamePatternsBackslash : toolNamePatterns) {
|
||||||
Optional<MatchResult> result = matcherMatches(matcher, commandLine);
|
Optional<MatchResult> result = patternMatches(pattern, commandLine);
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -242,23 +265,23 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Matcher[] toolNameMatchers;
|
Pattern[] toolNamePatterns;
|
||||||
if (matchBackslash) {
|
if (matchBackslash) {
|
||||||
toolNameMatchers = new Matcher[] {
|
toolNamePatterns = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_BSLASH_QUOTE, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_BSLASH_QUOTE, basenameRegex,
|
||||||
versionRegex, REGEX_CMD_PATH_BSLASH_QUOTE_END)).matcher(""),
|
versionRegex, REGEX_CMD_PATH_BSLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
||||||
versionRegex, REGEX_CMD_PATH_BSLASH_END)).matcher("") };
|
versionRegex, REGEX_CMD_PATH_BSLASH_END)) };
|
||||||
} else {
|
} else {
|
||||||
toolNameMatchers = new Matcher[] {
|
toolNamePatterns = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_SLASH_QUOTE, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_SLASH_QUOTE, basenameRegex,
|
||||||
versionRegex, REGEX_CMD_PATH_SLASH_QUOTE_END)).matcher(""),
|
versionRegex, REGEX_CMD_PATH_SLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
||||||
versionRegex, REGEX_CMD_PATH_SLASH_END)).matcher("") };
|
versionRegex, REGEX_CMD_PATH_SLASH_END)) };
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Matcher matcher : toolNameMatchers) {
|
for (Pattern pattern : toolNamePatterns) {
|
||||||
Optional<MatchResult> result = matcherMatches(matcher, commandLine);
|
Optional<MatchResult> result = patternMatches(pattern, commandLine);
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -271,8 +294,8 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
if (matchBackslash && !canHandleNtfsPaths()) {
|
if (matchBackslash && !canHandleNtfsPaths()) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
for (Matcher matcher : matchBackslash ? toolNameMatchersExtBackslash : toolNameMatchersExt) {
|
for (Pattern pattern : matchBackslash ? toolNamePatternsExtBackslash : toolNamePatternsExt) {
|
||||||
Optional<MatchResult> result = matcherMatches(matcher, commandLine);
|
Optional<MatchResult> result = patternMatches(pattern, commandLine);
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -288,23 +311,23 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Matcher[] toolNameMatchers;
|
Pattern[] toolNamePatterns;
|
||||||
if (matchBackslash) {
|
if (matchBackslash) {
|
||||||
toolNameMatchers = new Matcher[] {
|
toolNamePatterns = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH_QUOTE,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH_QUOTE,
|
||||||
basenameRegex, versionRegex, extensionRegex, REGEX_CMD_PATH_BSLASH_QUOTE_END)).matcher(""),
|
basenameRegex, versionRegex, extensionRegex, REGEX_CMD_PATH_BSLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_BSLASH, basenameRegex,
|
||||||
versionRegex, extensionRegex, REGEX_CMD_PATH_BSLASH_END)).matcher("") };
|
versionRegex, extensionRegex, REGEX_CMD_PATH_BSLASH_END)) };
|
||||||
} else {
|
} else {
|
||||||
toolNameMatchers = new Matcher[] {
|
toolNamePatterns = new Pattern[] {
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_SLASH_QUOTE,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_SLASH_QUOTE,
|
||||||
basenameRegex, versionRegex, extensionRegex, REGEX_CMD_PATH_SLASH_QUOTE_END)).matcher(""),
|
basenameRegex, versionRegex, extensionRegex, REGEX_CMD_PATH_SLASH_QUOTE_END)),
|
||||||
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
Pattern.compile(String.format(Locale.ROOT, "%s%s%s\\.%s%s", REGEX_CMD_PATH_SLASH, basenameRegex,
|
||||||
versionRegex, extensionRegex, REGEX_CMD_PATH_SLASH_END)).matcher("") };
|
versionRegex, extensionRegex, REGEX_CMD_PATH_SLASH_END)) };
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Matcher matcher : toolNameMatchers) {
|
for (Pattern pattern : toolNamePatterns) {
|
||||||
Optional<MatchResult> result = matcherMatches(matcher, commandLine);
|
Optional<MatchResult> result = patternMatches(pattern, commandLine);
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -313,11 +336,11 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets, whether the specified Matcher for the tool arguments can properly parse
|
* Gets, whether the specified Pattern for the tool arguments can properly parse
|
||||||
* the specified command-line string. If so, the remaining arguments of the
|
* the specified command-line string. If so, the remaining arguments of the
|
||||||
* command-line are returned.
|
* command-line are returned.
|
||||||
*
|
*
|
||||||
* @param matcher the matcher that performs the match a regular expression
|
* @param pattern the pattern that performs the match a regular expression
|
||||||
* that matches the version string in the name of the tool to
|
* that matches the version string in the name of the tool to
|
||||||
* detect.
|
* detect.
|
||||||
* @param commandLine the command-line to match
|
* @param commandLine the command-line to match
|
||||||
|
@ -325,8 +348,8 @@ public class DefaultToolDetectionParticipant implements IToolDetectionParticipan
|
||||||
* command-line string. Otherwise, if the tool name matches, a
|
* command-line string. Otherwise, if the tool name matches, a
|
||||||
* MatchResult holding the de-composed command-line is returned.
|
* MatchResult holding the de-composed command-line is returned.
|
||||||
*/
|
*/
|
||||||
private Optional<DefaultToolDetectionParticipant.MatchResult> matcherMatches(Matcher matcher, String commandLine) {
|
private Optional<DefaultToolDetectionParticipant.MatchResult> patternMatches(Pattern pattern, String commandLine) {
|
||||||
matcher.reset(commandLine);
|
Matcher matcher = pattern.matcher(commandLine);
|
||||||
if (matcher.lookingAt()) {
|
if (matcher.lookingAt()) {
|
||||||
return Optional.of(new DefaultToolDetectionParticipant.MatchResult(matcher.group(REGEX_GROUP_CMD),
|
return Optional.of(new DefaultToolDetectionParticipant.MatchResult(matcher.group(REGEX_GROUP_CMD),
|
||||||
commandLine.substring(matcher.end())));
|
commandLine.substring(matcher.end())));
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.jsoncdb.core.participant;
|
package org.eclipse.cdt.jsoncdb.core.participant;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,8 +125,8 @@ public interface IToolDetectionParticipant {
|
||||||
* command
|
* command
|
||||||
*/
|
*/
|
||||||
public MatchResult(String command, String arguments) {
|
public MatchResult(String command, String arguments) {
|
||||||
this.command = command;
|
this.command = Objects.requireNonNull(command, "command"); //$NON-NLS-1$
|
||||||
this.arguments = arguments;
|
this.arguments = Objects.requireNonNull(arguments, "arguments"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,9 +55,8 @@ public class ResponseFileArglets {
|
||||||
@Override
|
@Override
|
||||||
public int process(IParserHandler parserHandler, String argsLine) {
|
public int process(IParserHandler parserHandler, String argsLine) {
|
||||||
for (NameOptionMatcher oMatcher : optionMatchers) {
|
for (NameOptionMatcher oMatcher : optionMatchers) {
|
||||||
final Matcher matcher = oMatcher.matcher;
|
final Matcher matcher = oMatcher.pattern.matcher(argsLine);
|
||||||
|
|
||||||
matcher.reset(argsLine);
|
|
||||||
if (matcher.lookingAt()) {
|
if (matcher.lookingAt()) {
|
||||||
String fname = matcher.group(oMatcher.nameGroup);
|
String fname = matcher.group(oMatcher.nameGroup);
|
||||||
final int consumed = matcher.end();
|
final int consumed = matcher.end();
|
||||||
|
|
Loading…
Add table
Reference in a new issue