/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.common; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.Reader; import java.io.StringReader; public abstract class CompilerCondition { protected File file; private String sourceCode; public void setSourceLine(String line) { sourceLine = line; } public String getHelpMessage() { StringBuilder helpMessage = new StringBuilder(); if (getFileName() != null) { helpMessage.append(getFileName() + ":"); } helpMessage.append(getLine() + ":" + getColumn() + ":" + getMessage()); final String sourceLine = getSourceLine(); if (sourceLine != null) { final String lineWithoutTabs = replaceTabs(sourceLine); helpMessage.append("\n" + lineWithoutTabs + "\n"); for (int c = 0; c < getColumn() - 1; c++) { helpMessage.append('-'); } int ntabs = countTabs(sourceLine, getColumn()); for (int i = 0; i < ntabs; i++) { helpMessage.append("---"); } helpMessage.append('^'); } return helpMessage.toString(); } private int countTabs(String string, int upToChar) { int ntabs = 0; for (int i = 0; i < string.length(); i++) { if (i > upToChar) return ntabs; if (string.charAt(i) == '\t') ntabs++; } return 0; } public String getFileName() { if (file != null) return file.toString(); return null; } // source line containing the error, for caching reasons, derived from // sourceCode private String sourceLine; private String getSourceLine() { if (sourceLine == null) { if (file != null && file.canRead()) { sourceLine = readLineFromFile(); } if (sourceCode != null) { sourceLine = readLineFromSource(); } } return sourceLine; } private String replaceTabs(String string) { return string.replaceAll("\\t", " "); } private String readLineFromSource() { return readLineFromReader(new StringReader(sourceCode)); } private String readLineFromFile() { try { return readLineFromReader(new FileReader(file)); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } } private String readLineFromReader(Reader r) { try { BufferedReader reader = new BufferedReader(r); String res = null; for (int i = 0; i < getLine(); i++) { res = reader.readLine(); } return res; } catch (Exception e) { e.printStackTrace(); return null; } } public void setFile(String fileName) { this.file = new File(fileName); } public void setFile(File file) { this.file = file; } public void setSourceCode(String sourceCode) { this.sourceCode = sourceCode; } public abstract String getMessage(); public abstract int getColumn(); public abstract int getLine(); public abstract boolean isError(); public abstract boolean isWarning(); @Override public String toString() { StringBuffer buf = new StringBuffer(); // Surprise: according to the docs, new StringBuffer(null) is different from new StringBuffer().append(null) buf.append(getFileName()); buf.append('@'); buf.append(getLine()); buf.append(':'); buf.append(getMessage()); return buf.toString(); } }