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

New.java

Go to the documentation of this file.
00001 package plp.orientadaObjetos1.comando;
00002 
00003 /*
00004  * A execucao de um comando ocorre em um determinado ambiente. O
00005  * resultado de tal execucao é a modificação deste ambiente, i.e., comandos
00006  * tem efeito colateral.
00007  */
00008 import plp.orientadaObjetos1.declaracao.variavel.DecVariavel;
00009 import plp.orientadaObjetos1.excecao.comando.TryCatchException;
00010 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00011 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00012 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00013 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00014 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException;
00015 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException;
00016 import plp.orientadaObjetos1.expressao.leftExpression.LeftExpression;
00017 import plp.orientadaObjetos1.expressao.valor.ValorRef;
00018 import plp.orientadaObjetos1.memoria.AmbienteCompilacao;
00019 import plp.orientadaObjetos1.memoria.AmbienteExecucao;
00020 import plp.orientadaObjetos1.memoria.ContextoExecucao;
00021 import plp.orientadaObjetos1.memoria.DefClasse;
00022 import plp.orientadaObjetos1.memoria.DefClasseGenerica;
00023 import plp.orientadaObjetos1.memoria.Objeto;
00024 import plp.orientadaObjetos1.util.Tipo;
00025 import plp.orientadaObjetos1.util.TipoClasseGeneric;
00026 
00030 public class New implements Comando {
00034     private LeftExpression av;
00035 
00039     private Tipo tipoInstancia;
00040 
00047     public New(LeftExpression av, Tipo tipoInstancia) {
00048         this.av = av;
00049         this.tipoInstancia = tipoInstancia;
00050     }
00051 
00060     public AmbienteExecucao executar(AmbienteExecucao ambiente)
00061             throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00062             ClasseJaDeclaradaException, ClasseNaoDeclaradaException,
00063             ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException, TryCatchException {
00064 
00065         AmbienteExecucao aux = null;
00066         DefClasse defClasse = ambiente.getDefClasse(tipoInstancia.getTipo());
00067         if ( defClasse instanceof DefClasseGenerica) {
00068             //Pegar o tipo Generic atraves da definicao da classe generica
00069             DefClasseGenerica defClasseGeneric = (DefClasseGenerica) defClasse;
00070             Tipo tipoGeneric = defClasseGeneric.getTipoGeneric();
00071             
00072             //Pegar o tipo real atraves do tipoInstancia
00073             TipoClasseGeneric tg = (TipoClasseGeneric) this.tipoInstancia;
00074             Tipo tipoReal = tg.getTipoGeneric();
00075             
00076             ambiente.incrementa();
00077             
00078             ambiente.mapTipoReal(tipoGeneric, tipoReal);
00079             DecVariavel decVariavel = defClasse.getDecVariavel();
00080             aux = decVariavel.executar(new ContextoExecucao(ambiente));
00081             
00082             ambiente.restaura();
00083         }
00084         else {
00085             DecVariavel decVariavel = defClasse.getDecVariavel();
00086             aux = decVariavel.executar(new ContextoExecucao(ambiente));
00087         }
00088 
00089         Objeto objeto = new Objeto(tipoInstancia.getTipo(), aux.getContextoIdValor());
00090         ValorRef vr = ambiente.getProxRef();
00091         ambiente.mapObjeto(vr, objeto);
00092         ambiente = new Atribuicao(av, vr).executar(ambiente);
00093         return ambiente;
00094     }
00095 
00104     public boolean checaTipo(AmbienteCompilacao ambiente)
00105             throws VariavelNaoDeclaradaException, ClasseJaDeclaradaException,
00106             ClasseNaoDeclaradaException {
00107         return av.checaTipo(ambiente) && tipoInstancia.eValido(ambiente)
00108                 && tipoInstancia.equals(av.getTipo(ambiente));
00109     }
00110 }

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