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.This; 00009 import plp.orientadaObjetos1.expressao.valor.Valor; 00010 import plp.orientadaObjetos1.expressao.valor.ValorRef; 00011 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00012 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 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(AmbienteExecucao ambiente) 00044 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00045 ObjetoNaoDeclaradoException{ 00046 return obterValorDeIdNoAmbiente(ambiente); 00047 } 00052 public Expressao getExpressaoObjeto(){ 00053 return varThis; 00054 } 00061 public boolean checaTipo(AmbienteCompilacao ambiente) { 00062 boolean resposta = false; 00063 try { 00064 resposta = varThis.checaTipo(ambiente); 00065 if(resposta) { 00066 Tipo tipo = varThis.getTipo(ambiente); 00067 Id idTipo = tipo.getTipo(); 00068 DefClasse defClasse = ambiente.getDefClasse(idTipo); 00069 defClasse.getTipoAtributo(super.getId()); 00070 resposta = true; 00071 } 00072 } 00073 catch(VariavelNaoDeclaradaException atrib){ 00074 resposta = false; 00075 } 00076 catch(ClasseNaoDeclaradaException clas){ 00077 resposta = false; 00078 } 00079 return resposta; 00080 } 00089 public Tipo getTipo(AmbienteCompilacao ambiente) 00090 throws VariavelNaoDeclaradaException,ClasseNaoDeclaradaException{ 00091 //Logo abaixo obtenho a definicao da Classe (seus métodos e atributos). 00092 //this.getTipo() devera retornar uma instancia de TipoClasse e assim, TipoClasse.getTipo() 00093 //retorna o id (contendo o nome da classe) associado ao tipo dela 00094 DefClasse defClasse = ambiente.getDefClasse(varThis.getTipo(ambiente).getTipo()); 00095 //Em seguida retorno o tipo do atributo, caso ele esteja definido na classe. 00096 //caso não esteja, uma exceção será lançada 00097 return defClasse.getTipoAtributo(super.getId()); 00098 } 00099 00105 private Valor obterValorDeIdNoAmbiente(AmbienteExecucao ambiente) 00106 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00107 ObjetoNaoDeclaradoException { 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 AmbienteExecucao aux = objeto.getEstado(); 00113 // Recuperando o valor do atributo "id" do objeto 00114 return aux.getValor(super.getId()); 00115 //return ambiente.getObjeto((ValorRef)varThis.avaliar(ambiente)).getEstado().getValor(super.getId()); 00116 } 00117 }