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);
00070 Objeto objeto = ambiente.getObjeto(vr);
00071 Id idClasse = objeto.getClasse();
00072 DefClasse defClasse = ambiente.getDefClasse(idClasse);
00073 Procedimento metodo = defClasse.getMetodo(nomeMetodo);
00074
00075
00076
00077 AmbienteExecucao aux = new ContextoExecucao(ambiente);
00078
00079 aux.changeValor(new Id("this"),vr);
00080
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
00104
00105
00106
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
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 }