ChamadaMetodo.java

Go to the documentation of this file.
00001 package plp.orientadaObjetos1.comando;
00002 
00003 import plp.expressions2.memory.VariavelJaDeclaradaException;
00004 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00006 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00007 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00008 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00009 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
00010 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
00011 import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
00012 import plp.orientadaObjetos1.expressao.Expressao;
00013 import plp.orientadaObjetos1.expressao.ListaExpressao;
00014 import plp.orientadaObjetos1.expressao.leftExpression.Id;
00015 import plp.orientadaObjetos1.expressao.valor.ValorRef;
00016 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
00017 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
00018 import plp.orientadaObjetos1.memoria.ContextoExecucaoOO1;
00019 import plp.orientadaObjetos1.memoria.DefClasse;
00020 import plp.orientadaObjetos1.memoria.Objeto;
00021 import plp.orientadaObjetos1.memoria.colecao.ListaValor;
00022 import plp.orientadaObjetos1.util.Tipo;
00023 
00027 public class ChamadaMetodo implements Comando {
00031     private Expressao expressao;
00035     private Id nomeMetodo;
00039     private ListaExpressao parametrosReais;
00040 
00048     public ChamadaMetodo(Expressao expressao, Id nomeMetodo, ListaExpressao parametrosReais){
00049         this.expressao = expressao;
00050         this.nomeMetodo = nomeMetodo;
00051         this.parametrosReais = parametrosReais;
00052     }
00059     public AmbienteExecucaoOO1 executar(AmbienteExecucaoOO1 ambiente)
00060         throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00061         ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
00062         ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException,
00063         ClasseNaoDeclaradaException, ClasseJaDeclaradaException, EntradaInvalidaException{
00064 
00065         ValorRef vr = (ValorRef) expressao.avaliar(ambiente);  // recupera o id do objeto
00066         Objeto objeto =  ambiente.getObjeto(vr);               // recupera o objeto
00067         Id idClasse = objeto.getClasse();                      // recupera o tipo do objeto
00068         DefClasse defClasse = ambiente.getDefClasse(idClasse); // recupera a definição da classe
00069         Procedimento metodo = defClasse.getMetodo(nomeMetodo); // recupera o procedimento
00070         // cria um novo ambiente para a execucao, pois
00071         // não deve levar em conta as variáveis definidas na main
00072         AmbienteExecucaoOO1 aux = new ContextoExecucaoOO1(ambiente);
00073                                                                // é change pois no construtor do ambiente
00074         aux.changeValor(new Id("this"),vr);                    // invocado na linha anterior ja é feito
00075                                                                //  um mapeamento
00076 
00077         ListaValor valoresDosParametros = parametrosReais.avaliar(ambiente);
00078         new ChamadaProcedimento(metodo, parametrosReais, valoresDosParametros).executar(aux);
00079         return ambiente;
00080     }
00081 
00092     public boolean checaTipo(AmbienteCompilacaoOO1 ambiente)
00093     throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
00094          ClasseNaoDeclaradaException {
00095         boolean resposta;
00096         //Antes de incrementar o ambiente, verifico se o método
00097         //é válido para a definicao de classe obtida a partir de expressao.
00098         //Se não for válido, a exceção ProcedimentoNaoDeclaradoException será
00099         //lançada e checaTipo retornará false.
00100         Tipo tipoClasse = expressao.getTipo(ambiente);
00101         DefClasse defClasse = ambiente.getDefClasse(tipoClasse.getTipo());
00102         try{
00103             Procedimento metodo = defClasse.getMetodo(nomeMetodo);
00104             ambiente.incrementa();
00105             ambiente.map(new Id("this"),tipoClasse);
00106             resposta = new ChamadaProcedimento(metodo, parametrosReais).checaTipo(ambiente);
00107             ambiente.restaura();
00108         }
00109         catch(ProcedimentoNaoDeclaradoException e){
00110             resposta = false;
00111         }
00112         return resposta;
00113     }
00114 }

Generated on Tue Sep 12 21:52:07 2006 for PLP by  doxygen 1.4.7