00001 package plp.orientadaObjetos1.expressao.leftExpression; 00002 00003 import plp.expressions2.memory.VariavelJaDeclaradaException; 00004 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00006 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00007 import plp.orientadaObjetos1.expressao.Expressao; 00008 import plp.orientadaObjetos1.expressao.This; 00009 import plp.orientadaObjetos1.expressao.valor.Valor; 00010 import plp.orientadaObjetos1.expressao.valor.ValorRef; 00011 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; 00012 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; 00013 import plp.orientadaObjetos1.memoria.DefClasse; 00014 import plp.orientadaObjetos1.memoria.Objeto; 00015 import plp.orientadaObjetos1.util.Tipo; 00016 00020 public class AcessoAtributoThis extends AcessoAtributo{ 00024 private This varThis; 00030 public AcessoAtributoThis(This varThis, Id id){ 00031 super(id); 00032 this.varThis = varThis; 00033 } 00043 public Valor avaliar(AmbienteExecucaoOO1 ambiente) 00044 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00045 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException{ 00046 return obterValorDeIdNoAmbiente(ambiente); 00047 } 00052 public Expressao getExpressaoObjeto(){ 00053 return varThis; 00054 } 00061 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) { 00062 boolean resposta = false; 00063 try { 00064 resposta = varThis.checaTipo(ambiente); 00065 if(resposta) { 00066 Tipo tipo = varThis.getTipo(ambiente); 00067 DefClasse defClasse = ambiente.getDefClasse(tipo.getTipo()); 00068 defClasse.getTipoAtributo(super.getId()); 00069 resposta = true; 00070 } 00071 } 00072 catch(VariavelNaoDeclaradaException atrib){ 00073 resposta = false; 00074 } 00075 catch(ClasseNaoDeclaradaException clas){ 00076 resposta = false; 00077 } 00078 return resposta; 00079 } 00088 public Tipo getTipo(AmbienteCompilacaoOO1 ambiente) 00089 throws VariavelNaoDeclaradaException,ClasseNaoDeclaradaException{ 00090 //Logo abaixo obtenho a definicao da Classe (seus métodos e atributos). 00091 //this.getTipo() devera retornar uma instancia de TipoClasse e assim, TipoClasse.getTipo() 00092 //retorna o id (contendo o nome da classe) associado ao tipo dela 00093 DefClasse defClasse = ambiente.getDefClasse(varThis.getTipo(ambiente).getTipo()); 00094 //Em seguida retorno o tipo do atributo, caso ele esteja definido na classe. 00095 //caso não esteja, uma exceção será lançada 00096 return defClasse.getTipoAtributo(super.getId()); 00097 } 00098 00105 private Valor obterValorDeIdNoAmbiente(AmbienteExecucaoOO1 ambiente) 00106 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00107 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException { 00108 // Pegando o objeto no ambiente 00109 ValorRef referencia = (ValorRef)varThis.avaliar(ambiente); 00110 Objeto objeto = ambiente.getObjeto(referencia); 00111 // Recuperando o mapeamento de valores do objeto (atributos do objeto) 00112 AmbienteExecucaoOO1 aux = objeto.getEstado(); 00113 // Recuperando o valor do atributo "id" do objeto 00114 return aux.get(super.getId()); 00115 //return ambiente.getObjeto((ValorRef)varThis.avaliar(ambiente)).getEstado().getValor(super.getId()); 00116 } 00117 }