00001 package plp.orientadaObjetos1.comando;
00002
00003
00004
00005
00006
00007
00008 import plp.expressions2.memory.VariavelJaDeclaradaException;
00009 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00010 import plp.orientadaObjetos1.declaracao.variavel.DecVariavel;
00011 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00012 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00013 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00014 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00015 import plp.orientadaObjetos1.expressao.leftExpression.Id;
00016 import plp.orientadaObjetos1.expressao.leftExpression.LeftExpression;
00017 import plp.orientadaObjetos1.expressao.valor.ValorRef;
00018 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
00019 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
00020 import plp.orientadaObjetos1.memoria.ContextoExecucaoOO1;
00021 import plp.orientadaObjetos1.memoria.DefClasse;
00022 import plp.orientadaObjetos1.memoria.Objeto;
00023 import plp.orientadaObjetos1.util.TipoClasse;
00024
00028 public class New implements Comando{
00032 private LeftExpression av;
00036 private Id classe;
00042 public New(LeftExpression av, Id classe){
00043 this.av = av;
00044 this.classe = classe;
00045 }
00052 public AmbienteExecucaoOO1 executar(AmbienteExecucaoOO1 ambiente) throws VariavelJaDeclaradaException,
00053 VariavelNaoDeclaradaException,
00054 ClasseJaDeclaradaException, ClasseNaoDeclaradaException,
00055 ObjetoJaDeclaradoException,ObjetoNaoDeclaradoException{
00056
00057 DefClasse defClasse = ambiente.getDefClasse(classe);
00058 DecVariavel decVariavel = defClasse.getDecVariavel();
00059 AmbienteExecucaoOO1 aux = decVariavel.elabora(new ContextoExecucaoOO1(ambiente));
00060 Objeto objeto = new Objeto(classe, aux.getContextoIdValor());
00061 ValorRef vr = ambiente.getProxRef();
00062 ambiente.mapObjeto(vr, objeto);
00063 ambiente = new Atribuicao(av,vr).executar(ambiente);
00064 return ambiente;
00065 }
00066
00073 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) throws VariavelNaoDeclaradaException,
00074 ClasseJaDeclaradaException, ClasseNaoDeclaradaException {
00075 TipoClasse tpClasse = new TipoClasse(classe);
00076 return av.checaTipo(ambiente) &&
00077 tpClasse.eValido(ambiente) &&
00078 tpClasse.equals(av.getTipo(ambiente));
00079 }
00080 }