package loo1.plp.orientadaObjetos1.declaracao.variavel;
import loo1.plp.expressions2.memory.VariavelJaDeclaradaException;
import loo1.plp.expressions2.memory.VariavelNaoDeclaradaException;
import loo1.plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
import loo1.plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import loo1.plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
import loo1.plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import loo1.plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
import loo1.plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
import loo1.plp.orientadaObjetos1.expressao.leftExpression.Id;
import loo1.plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import loo1.plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
import loo1.plp.orientadaObjetos1.util.Tipo;
/**
* Declara��o de vari�vel composta.
*/
public class CompostaDecVariavel implements DecVariavel {
/**
* Primeira declara��o de vari�vel.
*/
private DecVariavel declaracao1;
/**
* Restante da declara��o de vari�veis.
*/
private DecVariavel declaracao2;
/**
* Construtor.
*
* @param parametro1
* Primeira declara�ao de vari�vel.
* @param parametro2
* Restante da declara��o de vari�veis.
*/
public CompostaDecVariavel(DecVariavel declaracao1, DecVariavel declaracao2) {
this.declaracao1 = declaracao1;
this.declaracao2 = declaracao2;
}
/**
* Obt�m o tipo de uma vari�vel nessa declara��o.
*
* @param id
* O identificador da vari�vel.
* @return o tipo deste identificador nessa declara�ao.
* @throws VariavelNaoDeclaradaException
* Quando nao h� nenhuma vari�vel declarada com esse id na
* declara��o.
*/
public Tipo getTipo(Id id) throws VariavelNaoDeclaradaException {
Tipo tipo;
try {
tipo = declaracao1.getTipo(id);
} catch (VariavelNaoDeclaradaException e) {
tipo = declaracao2.getTipo(id);
}
return tipo;
}
/**
* Cria um mapeamento dos identificadores para os valores das express�es
* desta declara��o composta no AmbienteExecucao
*
* @param ambiente
* o ambiente que contem o mapeamento entre identificadores e
* valores.
* @return o ambiente modificado pelas inicializa��es das vari�veis.
* @throws ObjetoJaDeclaradoException
* @throws ObjetoNaoDeclaradoException
* @throws ClasseNaoDeclaradaException
* @throws ClasseJaDeclaradaException
* @throws VariavelNaoDeclaradaException
* @throws VariavelJaDeclaradaException
* @throws ProcedimentoNaoDeclaradoException
* @throws ProcedimentoJaDeclaradoException
*/
public AmbienteExecucaoOO1 elabora(AmbienteExecucaoOO1 ambiente)
throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
ClasseJaDeclaradaException, ClasseNaoDeclaradaException,
ObjetoNaoDeclaradoException, ObjetoJaDeclaradoException {
return declaracao2.elabora(declaracao1.elabora(ambiente));
}
/**
* Verifica se as declara��es est�o bem tipadas, ou seja, se as express�es
* de inicializa��o est�o bem tipadas.
*
* @param ambiente
* o ambiente que contem o mapeamento entre identificadores e
* seus tipos.
* @return true se os tipos da declara��o s�o v�lidos;
* false caso contrario.
*/
public boolean checaTipo(AmbienteCompilacaoOO1 ambiente)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
ClasseNaoDeclaradaException, ClasseJaDeclaradaException {
return declaracao1.checaTipo(ambiente)
&& declaracao2.checaTipo(ambiente);
}
}