package org.eclipse.jdt.internal.eval;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
import org.eclipse.jdt.internal.compiler.IProblem;

/**
 * An EvaluationResult is the result of a code snippet evaluation, a global 
 * variable evaluation or it is used to report problems against imports and
 * package declaration.
 * It primarily contains the representation of the resulting value (eg. its 
 * toString() representation). However if the code snippet, a global variable 
 * definition, an import or the package declaration could not be compiled, it 
 * contains the corresponding compilation problems.
 */
public class EvaluationResult {
	static final IProblem[] NO_PROBLEMS = new IProblem[0];
	
	char[] evaluationID;
	int evaluationType;
	IProblem[] problems;
	char[] displayString;
	char[] typeName;

	/**
	 * The evaluation result contains the value of a variable or
	 * it reports a problem on a variable. Note that if the problem is
	 * on the type of the variable, the source line number is -1. If the
	 * problem is on the name of the variable, the source line number is 0.
	 * Otherwise the source line number is relative to the initializer code.
	 */
	public static final int T_VARIABLE = 1;

	/**
	 * The evaluation result contains the value of a code snippet or
	 * it reports a problem on a code snippet.
	 */
	public static final int T_CODE_SNIPPET = 2;

	/**
	 * The evaluation result reports a problem on an import declaration.
	 */
	public static final int T_IMPORT = 3;

	/**
	 * The evaluation result reports a problem on a package declaration.
	 */
	public static final int T_PACKAGE = 4;

	/**
	 * The evaluation result reports an internal problem.
	 */
	public static final int T_INTERNAL = 5;
	
public EvaluationResult(char[] evaluationID, int evaluationType, char[] displayString, char[] typeName) {
	this.evaluationID = evaluationID;
	this.evaluationType = evaluationType;
	this.displayString = displayString;
	this.typeName = typeName;
	this.problems = NO_PROBLEMS;
}
public EvaluationResult(char[] evaluationID, int evaluationType, IProblem[] problems) {
	this.evaluationID = evaluationID;
	this.evaluationType = evaluationType;
	this.problems = problems;
}
/**
 * Adds the given problem to the list of problems of this evaluation result.
 */
void addProblem(IProblem problem) {
	IProblem[] existingProblems = this.problems;
	int existingLength = existingProblems.length;
	this.problems = new IProblem[existingLength + 1];
	System.arraycopy(existingProblems, 0, this.problems, 0, existingLength);
	this.problems[existingLength] = problem;
}
/**
 * Returns the ID of the evaluation.
 * If the result is about a global variable, returns the name of the variable.
 * If the result is about a code snippet, returns the code snippet.
 * If the result is about an import, returns the import.
 * If the result is about a package declaration, returns the package declaration.
 */
public char[] getEvaluationID() {
	return this.evaluationID;
}
/**
 * Returns the type of evaluation this result is about.
 * This indicates if the result is about a global variable,
 * a code snippet, an import or a package declaration.
 * Use getEvaluationID() to get the object itself.
 */
public int getEvaluationType() {
	return this.evaluationType;
}
/**
 * Returns an array of problems (errors and warnings) encountered
 * during the compilation of a code snippet or a global variable definition,
 * or during the analysis of a package name or an import.
 * Returns an empty array if there are no problems.
 */
public IProblem[] getProblems() {
	return this.problems;
}
/**
 * Returns a proxy object on this result's value.
 * Returns null if the result's value is null.
 * The returned value is undefined if there is no result.
 * The proxy object is expected to answer questions like:
 *   - What is the proxy type for this object?
 *	 - What is the toString() representation for this object?
 *   - What are the field names of this object?
 *   - What is the value for a given field name?
 * Special proxy objects are expected if the value is a primitive type.
 */
public Object getValue() {
	return null; // Not yet implemented
}
/**
 * Returns the displayable representation of this result's value.
 * This is obtained by sending toString() to the result object on the target side
 * if it is not a primitive value. If it is a primitive value, the corresponding
 * static toString(...) is used, eg. Integer.toString(int n) if it is an int.
 * Returns null if there is no value.
 */
public char[] getValueDisplayString() {
	return this.displayString;
}
/**
 * Returns the dot-separated fully qualified name of this result's value type.
 * If the value is a primitive value, returns the toString() representation of its type
 * (eg. "int", "boolean", etc.)
 * Returns null if there is no value.
 */
public char[] getValueTypeName() {
	return this.typeName;
}
/**
 * Returns whether there are errors in the code snippet or the global variable definition.
 */
public boolean hasErrors() {
	if (this.problems == null) {
		return false;
	} else {
		for (int i = 0; i < this.problems.length; i++) {
			if (this.problems[i].isError()) {
				return true;
			}
		}
		return false;
	}
}
/**
 * Returns whether there are problems in the code snippet or the global variable definition.
 */
public boolean hasProblems() {
	return (this.problems != null) && (this.problems.length != 0);
}
/**
 * Returns whether this result has a value.
 */
public boolean hasValue() {
	return this.displayString != null;
}
/**
 * Returns whether there are warnings in the code snippet or the global variable definition.
 */
public boolean hasWarnings() {
	if (this.problems == null) {
		return false;
	} else {
		for (int i = 0; i < this.problems.length; i++) {
			if (this.problems[i].isWarning()) {
				return true;
			}
		}
		return false;
	}
}
/**
 * Returns a readable representation of this result.
 * This is for debugging purpose only.
 */
public String toString() {
	StringBuffer buffer = new StringBuffer();
	switch (this.evaluationType) {
		case T_CODE_SNIPPET:
			buffer.append("Code snippet"/*nonNLS*/);
			break;
		case T_IMPORT:
			buffer.append("Import"/*nonNLS*/);
			break;
		case T_INTERNAL:
			buffer.append("Internal problem"/*nonNLS*/);
			break;
		case T_PACKAGE:
			buffer.append("Package"/*nonNLS*/);
			break;
		case T_VARIABLE:
			buffer.append("Global variable"/*nonNLS*/);
			break;
	}
	buffer.append(": "/*nonNLS*/);
	buffer.append(this.evaluationID);
	buffer.append("\n"/*nonNLS*/);
	if (hasProblems()) {
		buffer.append("Problems:\n"/*nonNLS*/);
		for (int i = 0; i < this.problems.length; i++) {
			buffer.append(this.problems[i].toString());
		}
	} else {
		if (hasValue()) {
			buffer.append("("/*nonNLS*/);
			buffer.append(this.typeName);
			buffer.append(") "/*nonNLS*/);
			buffer.append(this.displayString);
		} else {
			buffer.append("(No explicit return value)"/*nonNLS*/);
		}
	}
	return buffer.toString();
}
}
