blob: 05a75cf5713cf266012ed3e08351860ba414a967 [file] [log] [blame]
package org.eclipse.cdt.internal.errorparsers;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.core.runtime.Path;
public class MakeErrorParser implements IErrorParser {
public MakeErrorParser() {
}
static int getDirectoryLevel(String line) {
int s = line.indexOf('[');
int num = 0;
if (s != -1) {
int e = line.indexOf(']');
String number = line.substring(s + 1, e).trim();
try {
num = Integer.parseInt(number);
} catch (NumberFormatException exc) {
}
}
return num;
}
public boolean processLine(String line, ErrorParserManager eoParser) {
// make\[[0-9]*\]: error_desc
int firstColon= line.indexOf(':');
if (firstColon != -1 && line.startsWith("make")) { //$NON-NLS-1$
boolean enter = false;
String msg= line.substring(firstColon + 1).trim();
if ((enter = msg.startsWith("Entering directory")) || //$NON-NLS-1$
(msg.startsWith("Leaving directory"))) { //$NON-NLS-1$
int s = msg.indexOf('`');
int e = msg.indexOf('\'');
if (s != -1 && e != -1) {
String dir = msg.substring(s+1, e);
if (enter) {
/* Sometimes make screws up the output, so
* "leave" events can't be seen. Double-check level
* here.
*/
int level = getDirectoryLevel(line);
int parseLevel = eoParser.getDirectoryLevel();
for (; level < parseLevel; level++) {
eoParser.popDirectory();
}
eoParser.pushDirectory(new Path(dir));
} else {
eoParser.popDirectory();
/* Could check to see if they match */
}
}
} else if (msg.startsWith("***")) { //$NON-NLS-1$
boolean warning = false;
if (msg.length() > 4) {
String s = msg.substring(3).trim();
warning = s.startsWith("Warning"); //$NON-NLS-1$
}
if (warning) {
eoParser.generateMarker(null, -1, msg, IMarkerGenerator.SEVERITY_WARNING, null);
} else {
eoParser.generateMarker(null, -1, msg, IMarkerGenerator.SEVERITY_ERROR_BUILD, null);
}
}
}
return false;
}
}