package loo1.plp.orientadaObjetos1.declaracao.classe; import loo1.plp.expressions2.memory.VariavelJaDeclaradaException; import loo1.plp.expressions2.memory.VariavelNaoDeclaradaException; import loo1.plp.orientadaObjetos1.declaracao.procedimento.DecProcedimento; import loo1.plp.orientadaObjetos1.declaracao.variavel.DecVariavel; import loo1.plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException; import loo1.plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 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.memoria.DefClasse; import loo1.plp.orientadaObjetos1.util.TipoClasse; /** * Classe que representa a declaracao de uma unica classe. */ public class DecClasseSimples implements DecClasse { /** * Identificador do nome da classe. */ protected Id nomeClasse; /** * Atributos da classe. */ protected DecVariavel atributos; /** * Metodos da classe. */ protected DecProcedimento metodos; /** * Construtor. * @param nomeClasse Nome da classe * @param atributos Atributos da classe * @param metodos Metodos da classe. */ public DecClasseSimples(Id nomeClasse, DecVariavel atributos, DecProcedimento metodos){ this.nomeClasse = nomeClasse; this.atributos = atributos; this.metodos = metodos; } /** * Verifica se a declaracao esta bem tipada, ou seja, se a checagem dos tipos * dos metodos e atributos esta ok. * @param ambiente o ambiente que contem o mapeamento entre identificadores * e seus tipos. * @return true se os tipos da declara vlidos; * false caso contrario. */ public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, ClasseJaDeclaradaException, ClasseNaoDeclaradaException, ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException { ambiente.mapDefClasse(nomeClasse, new DefClasse(nomeClasse, atributos, metodos)); boolean resposta = false; ambiente.incrementa(); if (atributos.checaTipo(ambiente)){ ambiente.map(new Id("this"), new TipoClasse(nomeClasse)); resposta = metodos.checaTipo(ambiente); } ambiente.restaura(); return resposta; } /** * Cria um mapeamento do identificador para a declarao desta classe. * @param ambiente o ambiente que contem o mapeamento entre identificadores * e valores. * @return o ambiente modificado pela declarao da classe. */ public AmbienteExecucaoOO1 elabora(AmbienteExecucaoOO1 ambiente) throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, ClasseJaDeclaradaException, ClasseNaoDeclaradaException, ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException { ambiente.mapDefClasse(nomeClasse, new DefClasse(nomeClasse, atributos,metodos)); return ambiente; } }