forked from jenkinsci/analysis-model
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMsBuildParser.java
122 lines (108 loc) · 4.42 KB
/
MsBuildParser.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package edu.hm.hafner.analysis.parser;
import java.util.Optional;
import java.util.regex.Matcher;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import edu.hm.hafner.analysis.Issue;
import edu.hm.hafner.analysis.IssueBuilder;
import edu.hm.hafner.analysis.Severity;
import edu.hm.hafner.analysis.RegexpLineParser;
/**
* A parser for the MSBuild/PcLint compiler warnings.
*
* @author Ullrich Hafner
*/
public class MsBuildParser extends RegexpLineParser {
private static final long serialVersionUID = -2141974437420906595L;
private static final String MS_BUILD_WARNING_PATTERN
= "(?:^(?:.*)Command line warning ([A-Za-z0-9]+):\\s*(.*)\\s*\\[(.*)\\])|"
+ ANT_TASK + "(?:(?:\\s*(?:\\d+|\\d+:\\d+)>)?(?:(?:(?:(.*?)\\((\\d*)(?:,(\\d+))?[a-zA-Z]*?\\)|.*LINK)\\s*:|"
+ "(.*):)\\s*([A-z-_]*\\s(?:[Nn]ote|[Ii]nfo|[Ww]arning|(?:fatal\\s*)?[Ee]rror))[^A-Za-z0-9]\\s*:?\\s*([A-Za-z0-9\\-_]+)?"
+ "\\s*:\\s(?:\\s*([A-Za-z0-9.]+)\\s*:)?\\s*(.*?)(?: \\[([^\\]]*)[/\\\\][^\\]\\\\]+\\])?"
+ "|(.*)\\s*:.*error\\s*(LNK[0-9]+):\\s*(.*)))$";
/**
* Creates a new instance of {@link MsBuildParser}.
*/
public MsBuildParser() {
super(MS_BUILD_WARNING_PATTERN);
}
@Override
protected Optional<Issue> createIssue(final Matcher matcher, final IssueBuilder builder) {
builder.setFileName(determineFileName(matcher));
if (StringUtils.isNotBlank(matcher.group(2))) {
return builder.setLineStart(0)
.setCategory(matcher.group(1))
.setMessage(matcher.group(2))
.setSeverity(Severity.WARNING_NORMAL)
.buildOptional();
}
if (StringUtils.isNotBlank(matcher.group(13))) {
return builder.setLineStart(0)
.setCategory(matcher.group(14))
.setType(matcher.group(13))
.setMessage(matcher.group(15))
.setSeverity(Severity.guessFromString(matcher.group(8)))
.buildOptional();
}
if (StringUtils.isNotEmpty(matcher.group(10))) {
return builder.setLineStart(matcher.group(5))
.setColumnStart(matcher.group(6))
.setCategory(matcher.group(9))
.setType(matcher.group(10))
.setMessage(matcher.group(11))
.setSeverity(Severity.guessFromString(matcher.group(8)))
.buildOptional();
}
String category = matcher.group(9);
if ("Expected".equals(category)) {
return Optional.empty();
}
return builder.setLineStart(matcher.group(5))
.setColumnStart(matcher.group(6))
.setCategory(category)
.setMessage(matcher.group(11))
.setSeverity(Severity.guessFromString(matcher.group(8)))
.buildOptional();
}
/**
* Determines the name of the file that is cause of the warning.
*
* @param matcher
* the matcher to get the matches from
*
* @return the name of the file with a warning
*/
private String determineFileName(final Matcher matcher) {
String fileName;
if (StringUtils.isNotBlank(matcher.group(3))) {
fileName = matcher.group(3);
}
else if (StringUtils.isNotBlank(matcher.group(7))) {
fileName = matcher.group(7);
}
else if (StringUtils.isNotBlank(matcher.group(13))) {
fileName = matcher.group(13);
}
else {
fileName = matcher.group(4);
}
if (StringUtils.isBlank(fileName)) {
fileName = StringUtils.substringBetween(matcher.group(11), "'");
}
if (StringUtils.isBlank(fileName)) {
fileName = "unknown.file";
}
String projectDir = matcher.group(12);
if (canResolveRelativeFileName(fileName, projectDir)) {
fileName = FilenameUtils.concat(projectDir, fileName);
}
if ("MSBUILD".equals(fileName.trim())) {
fileName = "-";
}
return fileName;
}
private boolean canResolveRelativeFileName(final String fileName, final String projectDir) {
return StringUtils.isNotBlank(projectDir) && FilenameUtils.getPrefixLength(fileName) == 0
&& !"MSBUILD".equals(fileName.trim());
}
}