001: package com.tagtraum.framework.compiler;
002:
003: import java.io.FileInputStream;
004: import java.io.IOException;
005: import java.io.InputStreamReader;
006: import java.io.LineNumberReader;
007: import java.util.ArrayList;
008: import java.util.List;
009: import java.util.StringTokenizer;
010:
011: /**
012: * Parses the +E jikes output format.
013: *
014: * @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
015: * @version 1.1beta1 $Id: JikesEmacsErrorMessageParser.java,v 1.8 2005/02/06 18:01:54 hendriks73 Exp $
016: */
017: class JikesEmacsErrorMessageParser {
018: private static final boolean windows = System
019: .getProperty("os.name").toLowerCase().startsWith("win");
020:
021: public static ErrorMessage[] getErrorMessages(String compilerOutput) {
022: System.out.println(compilerOutput);
023: StringTokenizer st = new StringTokenizer(compilerOutput, "\n\r");
024: List messages = new ArrayList();
025: String line;
026: while (st.hasMoreTokens()) {
027: line = st.nextToken();
028: //System.err.println("Line (ignore outer double quotes): \"" + line + "\"");
029: StringTokenizer lineTokens = new StringTokenizer(line, ":");
030: try {
031: String file = lineTokens.nextToken();
032: if (windows && file.length() == 1)
033: file += ":" + lineTokens.nextToken(); // WINDOWS hack
034: int startLineNumber = Integer.parseInt(lineTokens
035: .nextToken());
036: int startCol = Integer.parseInt(lineTokens.nextToken());
037: int endLineNumber = Integer.parseInt(lineTokens
038: .nextToken());
039: // read endcolumn token
040: lineTokens.nextToken();
041: String errorType = lineTokens.nextToken();
042: String errorDescription = lineTokens.nextToken();
043: // only some of the data is actually used...
044: StringBuffer message = new StringBuffer();
045: message.append(errorType);
046: message.append(": ");
047: message.append(errorDescription);
048: message.append(System.getProperty("line.separator"));
049: if (line.trim().endsWith("in:"))
050: appendList(st, message);
051: appendFileExcerpt(file, startLineNumber, endLineNumber,
052: startCol, message);
053: messages.add(new ErrorMessage(file, message.toString(),
054: startLineNumber, startCol));
055: } catch (RuntimeException rte) {
056: System.err
057: .println("Compilerout (ignore outer double quotes): \""
058: + compilerOutput + "\"");
059: System.err
060: .println("Error parsing line (ignore outer double quotes): \""
061: + line + "\"");
062: rte.printStackTrace();
063: }
064: }
065: return (ErrorMessage[]) messages
066: .toArray(new ErrorMessage[messages.size()]);
067: }
068:
069: /**
070: * Sometimes after the message line there is a list that ends with a double newline.
071: *
072: * @param lineTokens
073: * @param message
074: */
075: private static void appendList(StringTokenizer lineTokens,
076: StringBuffer message) {
077: String line;
078: while (lineTokens.hasMoreTokens()) {
079: line = lineTokens.nextToken();
080: if (line != null && line.length() > 0) {
081: message.append(line);
082: message.append(System.getProperty("line.separator"));
083: } else {
084: break;
085: }
086: }
087: }
088:
089: private static void appendFileExcerpt(String file, int firstLine,
090: int lastLine, int col, StringBuffer sb) {
091: LineNumberReader reader = null;
092: try {
093: reader = new LineNumberReader(new InputStreamReader(
094: new FileInputStream(file)));
095: String line;
096: while ((line = reader.readLine()) != null
097: && reader.getLineNumber() <= lastLine) {
098: if (reader.getLineNumber() + 1 >= firstLine) {
099: sb.append(reader.getLineNumber());
100: sb.append(". ");
101: sb.append(line);
102: sb.append(System.getProperty("line.separator"));
103: }
104: }
105: for (int i = 0, max = Integer.toString(
106: reader.getLineNumber()).length()
107: + col + 1; i < max; i++)
108: sb.append(' ');
109: sb.append('^');
110: sb.append(System.getProperty("line.separator"));
111: } catch (Exception e) {
112: sb.append("Failed to access sourcefile " + file + ": " + e);
113: } finally {
114: try {
115: if (reader != null)
116: reader.close();
117: } catch (IOException ioe) {
118: }
119: }
120: }
121:
122: }
|