package loo1.plp.orientadaObjetos1.declaracao.variavel;
import loo1.plp.expressions2.memory.VariavelJaDeclaradaException;
import loo1.plp.expressions2.memory.VariavelNaoDeclaradaException;
import loo1.plp.orientadaObjetos1.comando.New;
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.expressao.leftExpression.Id;
import loo1.plp.orientadaObjetos1.expressao.valor.ValorNull;
import loo1.plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import loo1.plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
import loo1.plp.orientadaObjetos1.util.Tipo;
import loo1.plp.orientadaObjetos1.util.TipoClasse;
/**
* Classe que representa a declara�ao de uma vari�vel do tipo objeto.
*/
public class DecVariavelObjeto implements DecVariavel {
/**
* Tipo da vari�vel declarado.
*/
private Tipo tipo;
/**
* Identificador representando o objeto.
*/
private Id objeto;
/**
* Idenficador representando a classe da qual objeto � uma inst�ncia.
*/
private Id classe;
/**
* Construtor.
*
* @param tipo
* Tipo declarado da vari�vel.
* @param objeto
* Identificador do objeto.
* @param classe
* Classe da qual objeto � uma inst�ncia.
*/
public DecVariavelObjeto(Tipo tipo, Id objeto, Id classe) {
this.tipo = tipo;
this.objeto = objeto;
this.classe = classe;
}
/**
* Retorna o tipo do identificador a ser declarado no AmbienteCompilacao
*
* @param id
* o identificador da declaracao
* @return o tipo do identificador
*/
public Tipo getTipo(Id id) throws VariavelNaoDeclaradaException {
if (this.objeto.equals(id)) {
return tipo;
} else {
throw new VariavelNaoDeclaradaException(id);
}
}
/**
* Cria um mapeamento do identificador para o objeto no ambiente de
* execu��o.
*
* @param ambiente
* o ambiente que contem o mapeamento entre identificadores e
* valores.
* @return o ambiente modificado pela inicializa��o da vari�vel.
*/
public AmbienteExecucaoOO1 elabora(AmbienteExecucaoOO1 ambiente)
throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
ClasseJaDeclaradaException, ClasseNaoDeclaradaException,
ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException {
AmbienteExecucaoOO1 aux = new SimplesDecVariavel(tipo, objeto,
new ValorNull()).elabora(ambiente);
aux = new New(objeto, classe).executar(aux);
return aux;
}
/**
*
* Verifica se o tipo da classe associada � v�lido (se existe).
*
* @param ambiente
* o ambiente que contem o mapeamento entre objetos e suas
* classes.
* @return true a classe existe false caso
* contrario.
*
*/
public boolean checaTipo(AmbienteCompilacaoOO1 ambiente)
throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
ClasseJaDeclaradaException, ClasseNaoDeclaradaException {
boolean resposta = false;
TipoClasse tpClasse = new TipoClasse(classe);
if (tpClasse.eValido(ambiente) && tipo.eValido(ambiente)) {
resposta = tpClasse.equals(tipo);
ambiente.map(objeto, tpClasse);
}
return resposta;
}
public Tipo getTipo() {
return tipo;
}
public Id getObjeto() {
return objeto;
}
public Id getClasse() {
return classe;
}
}