/* * #%~ * VDM Code Generator * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.codegen.trans.conv; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; import org.overture.codegen.ir.INode; import org.overture.codegen.ir.IRInfo; import org.overture.codegen.ir.SExpIR; import org.overture.codegen.ir.SObjectDesignatorIR; import org.overture.codegen.ir.STypeIR; import org.overture.codegen.ir.SourceNode; import org.overture.codegen.ir.analysis.AnalysisException; import org.overture.codegen.ir.analysis.AnswerAdaptor; import org.overture.codegen.ir.declarations.ADefaultClassDeclIR; import org.overture.codegen.ir.expressions.AApplyExpIR; import org.overture.codegen.ir.expressions.AFieldExpIR; import org.overture.codegen.ir.expressions.ASelfExpIR; import org.overture.codegen.ir.statements.AApplyObjectDesignatorIR; import org.overture.codegen.ir.statements.AFieldObjectDesignatorIR; import org.overture.codegen.ir.statements.AIdentifierObjectDesignatorIR; import org.overture.codegen.ir.statements.ANewObjectDesignatorIR; import org.overture.codegen.ir.statements.ASelfObjectDesignatorIR; import org.overture.codegen.ir.types.AClassTypeIR; import org.overture.codegen.ir.types.AMethodTypeIR; import org.overture.codegen.ir.types.AUnknownTypeIR; import org.overture.codegen.ir.types.SMapTypeIR; import org.overture.codegen.ir.types.SSeqTypeIR; public class ObjectDesignatorToExpIR extends AnswerAdaptor<SExpIR> { private IRInfo info; private Logger log = Logger.getLogger(this.getClass().getName()); public ObjectDesignatorToExpIR(IRInfo info) { this.info = info; } @SuppressWarnings("unchecked") @Override public SExpIR caseAApplyObjectDesignatorIR(AApplyObjectDesignatorIR node) throws AnalysisException { SObjectDesignatorIR object = node.getObject(); SourceNode sourceNode = node.getSourceNode(); LinkedList<SExpIR> args = node.getArgs(); SExpIR root = object.apply(this); STypeIR rootType = root.getType(); STypeIR applyType = null; if (rootType instanceof SSeqTypeIR) { applyType = ((SSeqTypeIR) rootType).getSeqOf(); } else if (rootType instanceof SMapTypeIR) { applyType = ((SMapTypeIR) rootType).getTo(); } else if (rootType instanceof AMethodTypeIR) { applyType = ((AMethodTypeIR) rootType).getResult(); } applyType = applyType.clone(); AApplyExpIR applyExp = new AApplyExpIR(); applyExp.setArgs((List<? extends SExpIR>) args.clone()); applyExp.setRoot(root); applyExp.setType(applyType); applyExp.setSourceNode(sourceNode); return applyExp; } @Override public SExpIR caseAFieldObjectDesignatorIR(AFieldObjectDesignatorIR node) throws AnalysisException { String fieldName = node.getFieldName(); String fieldModule = node.getFieldModule(); SObjectDesignatorIR obj = node.getObject(); SourceNode sourceNode = node.getSourceNode(); INode parent = node.parent(); STypeIR fieldExpType = null; try { fieldExpType = info.getTypeAssistant().getFieldExpType(info, fieldName, fieldModule, obj, parent); } catch (org.overture.ast.analysis.AnalysisException e) { log.error("Could not find field expression type of " + node); fieldExpType = new AUnknownTypeIR(); } SExpIR objExp = obj.apply(this); AFieldExpIR fieldExp = new AFieldExpIR(); fieldExp.setMemberName(fieldName); fieldExp.setType(fieldExpType); fieldExp.setObject(objExp); fieldExp.setSourceNode(sourceNode); return fieldExp; } @Override public SExpIR caseAIdentifierObjectDesignatorIR( AIdentifierObjectDesignatorIR node) throws AnalysisException { return node.getExp().clone(); } @Override public SExpIR caseANewObjectDesignatorIR(ANewObjectDesignatorIR node) throws AnalysisException { return node.getExp().clone(); } @Override public SExpIR caseASelfObjectDesignatorIR(ASelfObjectDesignatorIR node) throws AnalysisException { ADefaultClassDeclIR enclosingClass = node.getAncestor(ADefaultClassDeclIR.class); String className = enclosingClass.getName(); SourceNode sourceNode = node.getSourceNode(); AClassTypeIR classType = new AClassTypeIR(); classType.setName(className); ASelfExpIR self = new ASelfExpIR(); self.setType(classType); self.setSourceNode(sourceNode); return self; } @Override public SExpIR createNewReturnValue(INode node) throws AnalysisException { assert false : "This should never happen"; return null; } @Override public SExpIR createNewReturnValue(Object node) throws AnalysisException { assert false : "This should never happen"; return null; } }