00001 package plp.orientadaObjetos1.declaracao.variavel; 00002 00003 import plp.orientadaObjetos1.comando.New; 00004 import plp.orientadaObjetos1.excecao.comando.TryCatchException; 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.VariavelJaDeclaradaException; 00010 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException; 00011 import plp.orientadaObjetos1.expressao.leftExpression.Id; 00012 import plp.orientadaObjetos1.expressao.valor.ValorNull; 00013 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00014 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00015 import plp.orientadaObjetos1.util.Tipo; 00016 import plp.orientadaObjetos1.util.TipoClasse; 00017 import plp.orientadaObjetos1.util.TipoGeneric; 00018 00022 public class DecVariavelObjeto implements DecVariavel{ 00026 private Tipo tipoVariavel; 00030 private Id nomeVariavel; 00034 private Tipo tipoInstancia; 00041 public DecVariavelObjeto(Tipo tipoVariavel, Id nomeVariavel, Tipo tipoInstancia){ 00042 this.tipoVariavel = tipoVariavel; 00043 this.nomeVariavel = nomeVariavel; 00044 this.tipoInstancia = tipoInstancia; 00045 } 00046 00052 public Tipo getTipo(Id id) throws VariavelNaoDeclaradaException{ 00053 if(this.nomeVariavel.equals(id)){ 00054 return tipoVariavel; 00055 } 00056 else { 00057 throw new VariavelNaoDeclaradaException(id); 00058 } 00059 } 00060 00066 public AmbienteExecucao executar(AmbienteExecucao ambiente) 00067 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00068 ClasseJaDeclaradaException, ClasseNaoDeclaradaException, 00069 ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException, TryCatchException{ 00070 Tipo tipoVariavelReal = tipoVariavel; 00071 Tipo tipoInstanciaReal = tipoInstancia; 00072 if (tipoVariavel instanceof TipoGeneric && tipoInstancia instanceof TipoGeneric) { 00073 tipoVariavelReal = ambiente.getTipoReal( tipoVariavel); 00074 tipoInstanciaReal = ambiente.getTipoReal( tipoInstancia); 00075 } 00076 00077 AmbienteExecucao aux = new DecVariavelSimples(tipoVariavelReal, nomeVariavel, new ValorNull()).executar(ambiente); 00078 if ( !this.tipoInstancia.equals( TipoClasse.TIPO_NULL)) { 00079 aux = new New(nomeVariavel, tipoInstanciaReal).executar(aux); 00080 } 00081 return aux; 00082 } 00083 00093 public boolean checaTipo(AmbienteCompilacao ambiente) 00094 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00095 ClasseJaDeclaradaException, ClasseNaoDeclaradaException{ 00096 boolean resposta = false; 00097 if ( tipoInstancia.eValido(ambiente) && tipoVariavel.eValido(ambiente) ) { 00098 resposta = true; 00099 if ( !tipoInstancia.equals(TipoClasse.TIPO_NULL)) { 00100 resposta = resposta && tipoInstancia.equals(tipoVariavel); 00101 } 00102 ambiente.mapTipo(nomeVariavel, tipoInstancia); 00103 } 00104 return resposta; 00105 } 00106 00107 public String toString() { 00108 return this.tipoVariavel + " " + this.nomeVariavel + " := new " + this.tipoInstancia; 00109 } 00110 }