Main Page | Packages | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

ChamadaMetodo.java

Go to the documentation of this file.
00001 package plp.orientadaObjetos1.comando;
00002 
00003 import plp.orientadaObjetos1.excecao.comando.TryCatchException;
00004 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00006 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00007 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00008 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
00009 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
00010 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException;
00011 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException;
00012 import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
00013 import plp.orientadaObjetos1.expressao.Expressao;
00014 import plp.orientadaObjetos1.expressao.ListaExpressao;
00015 import plp.orientadaObjetos1.expressao.leftExpression.Id;
00016 import plp.orientadaObjetos1.expressao.valor.ValorRef;
00017 import plp.orientadaObjetos1.memoria.AmbienteCompilacao;
00018 import plp.orientadaObjetos1.memoria.AmbienteExecucao;
00019 import plp.orientadaObjetos1.memoria.ContextoExecucao;
00020 import plp.orientadaObjetos1.memoria.DefClasse;
00021 import plp.orientadaObjetos1.memoria.DefClasseGenerica;
00022 import plp.orientadaObjetos1.memoria.Objeto;
00023 import plp.orientadaObjetos1.memoria.colecao.ListaValor;
00024 import plp.orientadaObjetos1.util.Tipo;
00025 import plp.orientadaObjetos1.util.TipoClasseGeneric;
00026 
00030 public class ChamadaMetodo implements Comando {
00034     private Expressao expressao;
00038     private Id nomeMetodo;
00042     private ListaExpressao parametrosReais;
00043 
00051     public ChamadaMetodo(Expressao expressao, Id nomeMetodo, ListaExpressao parametrosReais){
00052         this.expressao = expressao;
00053         this.nomeMetodo = nomeMetodo;
00054         this.parametrosReais = parametrosReais;
00055     }
00056     
00063     public AmbienteExecucao executar(AmbienteExecucao ambiente)
00064         throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00065         ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
00066         ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException,
00067         ClasseNaoDeclaradaException, ClasseJaDeclaradaException, EntradaInvalidaException, TryCatchException{
00068         
00069         ValorRef vr = (ValorRef) expressao.avaliar(ambiente);  // recupera o id do objeto
00070         Objeto objeto =  ambiente.getObjeto(vr);               // recupera o objeto
00071         Id idClasse = objeto.getClasse();                      // recupera o tipo do objeto
00072         DefClasse defClasse = ambiente.getDefClasse(idClasse); // recupera a definição da classe
00073         Procedimento metodo = defClasse.getMetodo(nomeMetodo); // recupera o procedimento
00074         
00075         // cria um novo ambiente para a execucao, pois
00076         // não deve levar em conta as variáveis definidas na main
00077         AmbienteExecucao aux = new ContextoExecucao(ambiente);
00078                                                                // é change pois no construtor do ambiente
00079         aux.changeValor(new Id("this"),vr);                    // invocado na linha anterior ja é feito
00080                                                                //  um mapeamento
00081 
00082         ListaValor valoresDosParametros = parametrosReais.avaliar(ambiente);
00083         
00084         new ChamadaProcedimento(metodo, parametrosReais, valoresDosParametros).executar(aux);
00085         
00086         return ambiente;
00087     }
00088 
00099     public boolean checaTipo(AmbienteCompilacao ambiente)
00100     throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
00101          ClasseNaoDeclaradaException {
00102         boolean resposta;
00103         //Antes de incrementar o ambiente, verifico se o método
00104         //é válido para a definicao de classe obtida a partir de expressao.
00105         //Se não for válido, a exceção ProcedimentoNaoDeclaradoException será
00106         //lançada e checaTipo retornará false.
00107         Tipo tipoClasse = expressao.getTipo(ambiente);
00108         DefClasse defClasse = ambiente.getDefClasse(tipoClasse.getTipo());
00109         try{
00110             Procedimento metodo = defClasse.getMetodo(nomeMetodo);
00111             ambiente.incrementa();
00112             ambiente.mapTipo(new Id("this"),tipoClasse);
00113             
00114             if ( defClasse instanceof DefClasseGenerica ) {
00115                 DefClasseGenerica dcg = (DefClasseGenerica) defClasse;
00116                 Tipo tg = dcg.getTipoGeneric();
00117                 Tipo tr = ((TipoClasseGeneric)tipoClasse).getTipoGeneric();
00118                 try {
00119                     ambiente.mapTipoReal( tg, tr);
00120                 } catch (ClasseJaDeclaradaException e) {
00121                     //TODO verificar se isso soh acontece com chamada recursiva.
00122                 }                
00123             }
00124             
00125             resposta = new ChamadaProcedimento(metodo, parametrosReais).checaTipo(ambiente);
00126             ambiente.restaura();
00127         }
00128         catch(ProcedimentoNaoDeclaradoException e){
00129             resposta = false;
00130         }
00131         return resposta;
00132     }
00133 }

Generated on Mon Aug 8 20:20:46 2005 for Linguagem OO1 - Generics by  doxygen 1.4.4