package compiler;

import java.util.ArrayList;
import java.util.List;

/**
 * Gestion des fonctions usuelles, de leur paramètres et valeur de retour.
 * 
 */
public class IdFun extends Ident {

	// L'ordre des paramètres est important car c'est
	// lui qui défini l'odre d'appel
	private List<Parameter> parameters;
	private int currentParameterIndex = -1; // no parameters

	/****************************************
	 * Sous-classe pour gérer les paramètres.
	 ****************************************/
	class Parameter {

		String name;
		IdVar id;

		/* Constructeur */
		public Parameter(String n, IdVar p) {
			name = n;
			id = p;
		}

		/* GetSet */
		public String getName(){ return name; }
		public IdVar getIdent(){ return id; }

		public String toString(){
			return name+" "+id;
		}

	}

	// Contructeur de fonction (sans paramètre)
	public IdFun(Type t) {
		super(t); // type de retour
		parameters =  new ArrayList<Parameter>();
	}

	/* GetSet */
	public List<Parameter> getParameters(){ return parameters; }

	/**
	 * Ajoute un paramètre à la fonction.
	 * L'offset est mis à la construction
	 */
	public void addParameter(String name, IdVar p){
		//System.out.println("Add parameter to "+Declaration.getNameCurrentFunction()+"@"+p.getOffset());
		parameters.add(new Parameter(name, p));
		computeParametersOffets();
	}

	public void computeParametersOffets(){
		int end = parameters.size()*2+2;
		for (Parameter p : parameters) {
			p.getIdent().setOffset(end);
			end -= 2;
		}
	}

	/**
	 * Retourne le paramètre correspondant à l'appel courant.
	 */
	public void callParameter(String name){
		parameters.get(currentParameterIndex++);
	}

	/**
	 * Retourne l'offset de retour de la fonction.
	 * (n_param + 2) * 2
	 */
	public int getReturnOffset(){
		return getNumberOfParameters()*2+4;
	}

	public int getNumberOfParameters(){
		return parameters.size();
	}

	/**
	 * String output for debug purpose
	 */
	public String toString(){
		String s = new String("FONCTION\n");
		for (Parameter i : parameters) {
			s += i;
		}
		return s;
	}
}

@@ -796,17 +796,22 @@
 %0A%0A%09%7D%0A%0A%09/
-/
+**%0A%09 *
  Contruc
@@ -830,25 +830,60 @@
 tion
- (sans param%C3%A8tre)
+.%0A%09 * Initialement sans param%C3%A8tres%0A%09 * @param t%0A%09 */
 %0A%09pu
@@ -1365,25 +1365,91 @@
 ffets();%0A%09%7D%0A
+%09%0A%09/**%0A%09 * Calcul les offsets des param%C3%A8tres et les assignes.%0A%09 */
 %0A
-
 %09public void
@@ -1812,16 +1812,24 @@
 ion.%0A%09 *
+ @return
  (n_para
@@ -1917,16 +1917,126 @@
 +4;%0A%09%7D%0A%0A
+%09/**%0A%09 * Retourne le nombre de param%C3%A8tres de la fonction%0A%09 * @return nombre de param%C3%A8tres de la fonction%0A%09 */%0A
 %09public 

Improve comments