00001 package plp.orientadaObjetos1.comando;
00002
00003
00004
00005
00006
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
00069 DefClasseGenerica defClasseGeneric = (DefClasseGenerica) defClasse;
00070 Tipo tipoGeneric = defClasseGeneric.getTipoGeneric();
00071
00072
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 }