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);
00066 Objeto objeto = ambiente.getObjeto(vr);
00067 Id idClasse = objeto.getClasse();
00068 DefClasse defClasse = ambiente.getDefClasse(idClasse);
00069 Procedimento metodo = defClasse.getMetodo(nomeMetodo);
00070
00071
00072 AmbienteExecucaoOO1 aux = new ContextoExecucaoOO1(ambiente);
00073
00074 aux.changeValor(new Id("this"),vr);
00075
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
00097
00098
00099
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 }