001/*
002 * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003 *
004 * This file is part of
005 * CleanSheets - a spreadsheet application for the Java platform.
006 *
007 * CleanSheets is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published by
009 * the Free Software Foundation; either version 2 of the License, or
010 * (at your option) any later version.
011 *
012 * CleanSheets is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015 * GNU General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with CleanSheets; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020 */
021package csheets.core.formula.compiler;
022
023import csheets.core.formula.Expression;
024import csheets.core.formula.Function;
025import csheets.core.formula.FunctionParameter;
026
027/**
028 * An exception that is thrown if an function call with illegal argument count
029 * or argument types is encountered during parsing.
030 * @author Einar Pehrson
031 */
032public class IllegalFunctionCallException extends FormulaCompilationException {
033
034        /** The serialVersionUID of the IllegalFunctionCallException.java */
035        private static final long serialVersionUID = 1960534028676316836L;
036
037        /** The function call */
038        private Function function;
039
040        /** The parameter that was not matched */
041        private FunctionParameter parameter;
042
043        /** The argument that failed to match */
044        private Expression argument;
045
046        /**
047         * Creates a new function call exception.
048         * @param function the function that was called
049         * @param parameter the parameter that was not matched
050         * @param argument the argument that failed to match
051         */
052        public IllegalFunctionCallException(Function function,
053                        FunctionParameter parameter, Expression argument) {
054                this.function = function;
055                this.parameter = parameter;
056                this.argument = argument;
057        }
058
059        /**
060         * Returns the function that was called.
061         * @return the function that was called
062         */
063        public Function getFunction() {
064                return function;
065        }
066
067        /**
068         * Returns the parameter that was not matched.
069         * @return the parameter that was not matched
070         */
071        public FunctionParameter getParameter() {
072                return parameter;
073        }
074
075        /**
076         * Returns the argument that failed to match.
077         * @return the argument that failed to match
078         */
079        public Expression getArgument() {
080                return argument;
081        }
082
083        /**
084         * Returns a message describing the exception.
085         * @return a message describing the exception
086         */
087        public String getMessage() {
088                String s = "Illegal function call: ";
089                if (parameter == null)
090                        s += "too many arguments (" + argument + " did not match).";
091                else if (argument == null)
092                        s += "missing argument " + parameter.getName() + ".";
093                return s;
094        }
095
096        /**
097         * Returns a string representation of the exception.
098         * @return a string representation of the exception
099         */
100        public String toString() {
101                return getMessage();
102        }
103}