X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Feclipse%2Fjdt%2Finternal%2Fcompiler%2Fproblem%2FDefaultProblem.java;fp=src%2Forg%2Feclipse%2Fjdt%2Finternal%2Fcompiler%2Fproblem%2FDefaultProblem.java;h=8ec86190ec36ad19e902197f75ead28efc4903b5;hb=040fa5af2cd00017cf3575950cdaade34a6d7f6c;hp=0000000000000000000000000000000000000000;hpb=a580fb8376d315d05e4d6bfdff9ff1101a151cd6;p=org.ibex.tool.git diff --git a/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.java b/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.java new file mode 100644 index 0000000..8ec8619 --- /dev/null +++ b/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.java @@ -0,0 +1,227 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.compiler.problem; + +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.util.Util; + +public class DefaultProblem implements ProblemSeverities, IProblem { + + private static final String LINE_DELIMITER = System.getProperty("line.separator"); //$NON-NLS-1$ + + private char[] fileName; + private int id; + private int startPosition, endPosition, line; + private int severity; + private String[] arguments; + private String message; + + public DefaultProblem( + char[] originatingFileName, + String message, + int id, + String[] stringArguments, + int severity, + int startPosition, + int endPosition, + int line) { + + this.fileName = originatingFileName; + this.message = message; + this.id = id; + this.arguments = stringArguments; + this.severity = severity; + this.startPosition = startPosition; + this.endPosition = endPosition; + this.line = line; + } + public String errorReportSource(char[] unitSource) { + //extra from the source the innacurate token + //and "highlight" it using some underneath ^^^^^ + //put some context around too. + + //this code assumes that the font used in the console is fixed size + + //sanity ..... + if ((this.startPosition > this.endPosition) + || ((this.startPosition < 0) && (this.endPosition < 0))) + return Util.bind("problem.noSourceInformation"); //$NON-NLS-1$ + + StringBuffer errorBuffer = new StringBuffer(" "); //$NON-NLS-1$ + errorBuffer.append(Util.bind("problem.atLine", String.valueOf(this.line))); //$NON-NLS-1$ + errorBuffer.append(LINE_DELIMITER).append("\t"); //$NON-NLS-1$ + + char c; + final char SPACE = '\u0020'; + final char MARK = '^'; + final char TAB = '\t'; + //the next code tries to underline the token..... + //it assumes (for a good display) that token source does not + //contain any \r \n. This is false on statements ! + //(the code still works but the display is not optimal !) + + // expand to line limits + int length = unitSource.length, begin, end; + for (begin = this.startPosition >= length ? length - 1 : this.startPosition; begin > 0; begin--) { + if ((c = unitSource[begin - 1]) == '\n' || c == '\r') break; + } + for (end = this.endPosition >= length ? length - 1 : this.endPosition ; end+1 < length; end++) { + if ((c = unitSource[end + 1]) == '\r' || c == '\n') break; + } + + // trim left and right spaces/tabs + while ((c = unitSource[begin]) == ' ' || c == '\t') begin++; + //while ((c = unitSource[end]) == ' ' || c == '\t') end--; TODO (philippe) should also trim right, but all tests are to be updated + + // copy source + errorBuffer.append(unitSource, begin, end-begin+1); + errorBuffer.append(LINE_DELIMITER).append("\t"); //$NON-NLS-1$ + + // compute underline + for (int i = begin; i = length ? length - 1 : this.endPosition); i++) { + errorBuffer.append(MARK); + } + return errorBuffer.toString(); + } + + /** + * Answer back the original arguments recorded into the problem. + * @return java.lang.String[] + */ + public String[] getArguments() { + + return this.arguments; + } + + /** + * Answer the type of problem. + * @see org.eclipse.jdt.core.compiler.IProblem#getID() + * @return int + */ + public int getID() { + + return this.id; + } + + /** + * Answer a localized, human-readable message string which describes the problem. + * @return java.lang.String + */ + public String getMessage() { + + return this.message; + } + + /** + * Answer the file name in which the problem was found. + * @return char[] + */ + public char[] getOriginatingFileName() { + + return this.fileName; + } + + /** + * Answer the end position of the problem (inclusive), or -1 if unknown. + * @return int + */ + public int getSourceEnd() { + + return this.endPosition; + } + + /** + * Answer the line number in source where the problem begins. + * @return int + */ + public int getSourceLineNumber() { + + return this.line; + } + + /** + * Answer the start position of the problem (inclusive), or -1 if unknown. + * @return int + */ + public int getSourceStart() { + + return this.startPosition; + } + + /* + * Helper method: checks the severity to see if the Error bit is set. + * @return boolean + */ + public boolean isError() { + + return (this.severity & ProblemSeverities.Error) != 0; + } + + /* + * Helper method: checks the severity to see if the Error bit is not set. + * @return boolean + */ + public boolean isWarning() { + + return (this.severity & ProblemSeverities.Error) == 0; + } + + public void setOriginatingFileName(char[] fileName) { + this.fileName = fileName; + } + + /** + * Set the end position of the problem (inclusive), or -1 if unknown. + * + * Used for shifting problem positions. + * @param sourceEnd the new value of the sourceEnd of the receiver + */ + public void setSourceEnd(int sourceEnd) { + + this.endPosition = sourceEnd; + } + + /** + * Set the line number in source where the problem begins. + * @param lineNumber the new value of the line number of the receiver + */ + public void setSourceLineNumber(int lineNumber) { + + this.line = lineNumber; + } + + /** + * Set the start position of the problem (inclusive), or -1 if unknown. + * + * Used for shifting problem positions. + * @param sourceStart the new value of the source start position of the receiver + */ + public void setSourceStart(int sourceStart) { + + this.startPosition = sourceStart; + } + + public String toString() { + + String s = "Pb(" + (this.id & IgnoreCategoriesMask) + ") "; //$NON-NLS-1$ //$NON-NLS-2$ + if (this.message != null) { + s += this.message; + } else { + if (this.arguments != null) + for (int i = 0; i < this.arguments.length; i++) + s += " " + this.arguments[i]; //$NON-NLS-1$ + } + return s; + } +}