/*
* Copyright (c) 2009-2011, IETR/INSA of Rennes
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of the IETR/INSA of Rennes nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package net.sf.orcc.frontend;
import net.sf.orcc.cache.Cache;
import net.sf.orcc.cache.CacheManager;
import net.sf.orcc.util.OrccLogger;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
/**
* This class defines an RVC-CAL front-end. Is is mainly used to manage links
* between AST objects and their IR equivalent.
*
* @author Matthieu Wipliez
* @author Antoine Lorence
*
*/
public class Frontend {
public static final Frontend instance = new Frontend();
/**
* Set constructor to private, to ensure it will always used as Singleton
*/
private Frontend() {
}
/**
* <p>
* Returns the IR mapping equivalent of the AST object.
* </p>
*
* <p>
* This method will first try to retrieve the IR object in cache. If it is
* impossible, a {@link StructTransformer} will be used to generate the IR
* equivalent of AST object. In that case, a warning will be displayed,
* since this situation should <b>not</b> happen.
* </p>
*
* @param astObject
* an AST object
* @return the IR equivalent of the given AST object
* @see Frontend#putMapping(EObject, EObject)
*/
@SuppressWarnings("unchecked")
public <T extends EObject> T getMapping(final EObject astObject) {
EObject irObject = null;
if (astObject.eResource() != null) {
final Cache cache = CacheManager.instance.getCache(astObject
.eResource());
irObject = cache.getIrMap().get(astObject);
}
if (irObject == null) {
OrccLogger.warnln("* " + astObject + " is missing from cache");
// AST -> IR transformation. putMapping() is called in the
// transformer, we don't need to call it now.
irObject = new StructTransformer().doSwitch(astObject);
}
return (T) irObject;
}
/**
* <p>Store (in cache) a link between an AST object and its IR equivalent.</p>
*
* <p>This mechanism avoid to transform twice the same object. It is also
* useful to set references to variables, procedures, functions, etc.
* References in AST model are kept in the IR model. It is mandatory to have
* a consistent model to avoid exception when the IR will be serialized.</p>
*
* @param astObject
* an AST object
* @param irObject
* an equivalent IR object
* @see #getMapping(EObject)
*/
public void putMapping(final EObject astObject, final EObject irObject) {
final Resource resource = astObject.eResource();
if (resource != null) {
Cache cache = CacheManager.instance.getCache(resource);
cache.getIrMap().put(astObject, irObject);
} else {
OrccLogger.warnln("Try to put object not contained in a resource: "
+ astObject);
}
}
}