00001 package plp.orientadaObjetos1.expressao.leftExpression; 00002 00003 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00004 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00005 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException; 00006 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException; 00007 import plp.orientadaObjetos1.expressao.Expressao; 00008 import plp.orientadaObjetos1.expressao.valor.Valor; 00009 import plp.orientadaObjetos1.expressao.valor.ValorRef; 00010 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00011 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00012 import plp.orientadaObjetos1.memoria.DefClasse; 00013 import plp.orientadaObjetos1.memoria.Objeto; 00014 import plp.orientadaObjetos1.util.Tipo; 00015 import plp.orientadaObjetos1.util.TipoClasse; 00016 00020 public class AcessoAtributoId extends AcessoAtributo{ 00024 private LeftExpression av; 00030 public AcessoAtributoId(LeftExpression av, Id id){ 00031 super(id); 00032 this.av = av; 00033 } 00043 public Valor avaliar(AmbienteExecucao ambiente) 00044 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00045 ObjetoNaoDeclaradoException{ 00046 return obterValorDeIdNoAmbiente(ambiente); 00047 } 00052 public Expressao getExpressaoObjeto(){ 00053 return av; 00054 } 00065 public boolean checaTipo(AmbienteCompilacao ambiente) 00066 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException{ 00067 boolean resposta = false; 00068 if(av.checaTipo(ambiente)) { 00069 try{ 00070 Tipo t = av.getTipo(ambiente); 00071 DefClasse defClasse = ambiente.getDefClasse(((TipoClasse)t).getTipo()); 00072 defClasse.getTipoAtributo(super.getId()); 00073 resposta = true; 00074 } 00075 catch(VariavelNaoDeclaradaException atrib){ 00076 resposta = false; 00077 } 00078 catch(ClasseNaoDeclaradaException clas){ 00079 resposta = false; 00080 } 00081 00082 } 00083 return resposta; 00084 } 00092 public Tipo getTipo(AmbienteCompilacao ambiente) 00093 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException{ 00094 //Logo abaixo obtenho a definicao da Classe (seus métodos e atributos). 00095 //av.getTipo devera retornar uma instancia de TipoClasse e assim, TipoClasse.getTipo() 00096 //retorna o id (contendo o nome da classe) associado ao tipo dela 00097 Id nomeClasse = ((TipoClasse)av.getTipo(ambiente)).getTipo(); 00098 DefClasse defClasse = ambiente.getDefClasse(nomeClasse); 00099 Tipo tipoAtr = defClasse.getTipoAtributo(super.getId()); 00100 //Em seguida retorno o tipo do atributo, caso ele esteja definido na classe. 00101 //caso não esteja, uma exceção será lançada 00102 return tipoAtr; 00103 } 00108 public LeftExpression getAv() { 00109 return av; 00110 } 00111 00117 private Valor obterValorDeIdNoAmbiente(AmbienteExecucao ambiente) 00118 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00119 ObjetoNaoDeclaradoException { 00120 // Pegando o objeto no ambiente 00121 ValorRef referencia = (ValorRef) av.avaliar(ambiente); 00122 Objeto objeto = ambiente.getObjeto(referencia); 00123 // Recuperando o mapeamento de valores do objeto (atributos do objeto) 00124 AmbienteExecucao aux = objeto.getEstado(); 00125 // Recuperando o valor do atributo "id" do objeto 00126 return aux.getValor(super.getId()); 00127 } 00128 }