package hudson.plugins.warnings.parser; import hudson.plugins.analysis.util.model.Priority; import java.util.regex.Matcher; import org.apache.commons.lang.StringUtils; /** * A parser for the gcc compiler warnings. * * @author Greg Roth */ public class GccParser extends RegexpLineParser { /** A GCC error. */ static final String GCC_ERROR = "GCC error"; /** A LD error. */ static final String LINKER_ERROR = "Linker error"; /** Warning type of this parser. */ static final String WARNING_TYPE = "gcc"; /** Pattern of gcc compiler warnings. */ private static final String GCC_WARNING_PATTERN = "^(?:\\s*(?:\\[.*\\]\\s*)?(.*\\.[chpimxsola0-9]+):(?:(\\d*):(?:\\d*:)*\\s*(?:(warning|error|note)\\s*:|\\s*(.*))|\\s*(undefined reference to.*))(.*)|.*ld:\\s*(.*-l(.*)))$"; /** * Creates a new instance of <code>GccParser</code>. */ public GccParser() { super(GCC_WARNING_PATTERN, "GNU compiler (gcc)"); } /** {@inheritDoc} */ @Override protected Warning createWarning(final Matcher matcher) { if (StringUtils.isNotBlank(matcher.group(7))) { return new Warning(matcher.group(8), 0, WARNING_TYPE, LINKER_ERROR, matcher.group(7), Priority.HIGH); } Priority priority; String fileName = matcher.group(1); if (StringUtils.contains(fileName, "cleartool")) { return FALSE_POSITIVE; } if ("warning".equalsIgnoreCase(matcher.group(3))) { priority = Priority.NORMAL; } else if ("error".equalsIgnoreCase(matcher.group(3))) { priority = Priority.HIGH; } else if ("note".equalsIgnoreCase(matcher.group(3))) { priority = Priority.LOW; } else if (StringUtils.isNotBlank(matcher.group(4))) { if (matcher.group(4).contains("instantiated from here")) { return FALSE_POSITIVE; } priority = Priority.HIGH; String category = GCC_ERROR; return new Warning(fileName, getLineNumber(matcher.group(2)), WARNING_TYPE, category, matcher.group(4), priority); } else { priority = Priority.HIGH; String category = GCC_ERROR; return new Warning(fileName, 0, WARNING_TYPE, category, matcher.group(5), priority); } String category = "GCC " + matcher.group(3); return new Warning(fileName, getLineNumber(matcher.group(2)), WARNING_TYPE, category, matcher.group(6), priority); } }