jikeserrorparser.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 216 行

JAVA
216
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.java;import com.caucho.util.CharBuffer;import com.caucho.vfs.ByteToChar;import java.io.IOException;import java.io.InputStream;/** * Reads jikes error messages and parses them into a usable format. */class JikesErrorParser extends ErrorParser {  private ByteToChar token = ByteToChar.create();  private ByteToChar buf = ByteToChar.create();  private String filename = "filename";  /**   * Parse all the errors into an array.   *   * @return null if no errors found.   */  String parseErrors(InputStream is, LineMap lineMap)    throws IOException  {    CharBuffer errors = new CharBuffer();    scanError(is, lineMap, errors);    return errors.toString();  }  /**   * Scans a single error.   *   * <p>Javac errors look like "filename:line: message"   */  private void scanError(InputStream is, LineMap lineMap, CharBuffer errors)    throws IOException  {    int ch = is.read();    ByteToChar sourceLine = ByteToChar.create();    sourceLine.setEncoding(System.getProperty("file.encoding"));    filename = "filename";    buf.clear();    while (ch >= 0) {      int colOffset = 0;      for (; ch >= 0 && (ch == ' ' || ch == '\t'); ch = is.read())	colOffset++;      int line = 0;      for (; ch >= 0 && ch >= '0' && ch <= '9'; ch = is.read()) {	line = 10 * line + ch - '0';	colOffset++;      }      if (ch < 0)	return;      else if (colOffset == 0 && ! Character.isWhitespace((char) ch)) {	ch = scanUnknownLine(is, ch, errors);      }      else if (ch != '.') {	ch = skipToNewline(is, ch);	continue;      }      sourceLine.clear();      for (ch = is.read(); ch >= 0 && ch != '\n'; ch = is.read())	sourceLine.addByte(ch);      sourceLine.addChar('\n');      int column = 0;      for (ch = is.read(); ch >= 0 && ch != '\n'; ch = is.read()) {	if (ch == '^')	  break;	else if (ch == ' ')	  column++;	else if (ch == '\t')	  column = ((column + 8) / 8) * 8;      }      for (int i = colOffset + 1; i < column; i++)	sourceLine.addChar(' ');      sourceLine.addChar('^');      sourceLine.addChar('\n');      ch = skipToNewline(is, ch);      if (ch != '*')	continue;      buf.clear();      for (; ch >= 0 && ch != ':' && ch != '\n'; ch = is.read()) {      }      if (ch != ':') {	ch = skipToNewline(is, ch);	continue;      }      for (ch = is.read();	   ch >= 0 && (ch == ' ' || ch == ' ');	   ch = is.read()) {      }      for (; ch >= 0 && ch != '\n'; ch = is.read())	buf.addByte(ch);      String message = buf.getConvertedString();      if (lineMap != null)	errors.append(lineMap.convertError(filename, line, 0, message));      else	errors.append(filename + ":" + line + ": " + message);      errors.append('\n');      errors.append(sourceLine.getConvertedString());    }  }  private int scanUnknownLine(InputStream is, int ch, CharBuffer errors)    throws IOException  {    token.clear();    token.addByte(ch);    for (ch = is.read();	 ch > 0 && ! Character.isWhitespace((char) ch); 	 ch = is.read()) {    }    if (token.equals("Found")) {      return scanFilename(is, ch);    }    else if (token.equals("***")) {      for (; ch == ' ' || ch == '\t'; ch = is.read()) {      }      token.clear();      for (; ch > 0 && ch != '\n' && ch != ':'; ch = is.read()) {	token.addByte(ch);      }            if (token.equals("Warning"))	return skipToNewline(is, ch);      token.clear();      for (ch = is.read(); ch > 0 && ch != '\n'; ch = is.read())	token.addByte(ch);      token.addChar('\n');      errors.append(token.getConvertedString());      return is.read();    }    else      return skipToNewline(is, ch);  }  private int scanFilename(InputStream is, int ch)    throws IOException  {    for (; ch >= 0 && ch != '\n' && ch != '"'; ch = is.read()) {    }    if (ch != '"')      return skipToNewline(is, ch);    token.clear();    for (ch = is.read(); 	 ch >= 0 && ch != '"' && ch != '\n';	 ch = is.read()) {      token.addByte(ch);    }    if (ch != '"')      return skipToNewline(is, ch);    filename = token.getConvertedString();    return skipToNewline(is, ch);  }  private int skipToNewline(InputStream is, int ch)    throws IOException  {    for (; ch >= 0 && ch != '\n'; ch = is.read()) {    }    return is.read();  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?