package org.eclipse.xtend.backend.compiler;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.xtend.backend.common.BackendTypesystem;
import org.eclipse.xtend.backend.common.FunctionDefContext;
import org.eclipse.xtend.backend.common.NamedFunction;
import org.eclipse.xtend.middleend.MiddleEnd;
import org.eclipse.xtend.middleend.MiddleEndFactory;
import org.eclipse.xtend.middleend.NoMiddleEndForResourceException;
import org.eclipse.xtend.middleend.plugins.LanguageSpecificMiddleEnd;
public abstract class AbstractBackendCompilerFacade implements BackendCompilerFacade {
private final static Log _log = LogFactory.getLog (AbstractBackendCompilerFacade.class);
protected BackendTypesystem _typeSystem;
protected List<LanguageSpecificMiddleEnd> _languageHandlers;
public AbstractBackendCompilerFacade(BackendTypesystem typeSystem) {
super();
_typeSystem = typeSystem;
}
public void compile (Collection<String> resources, String contributorNamespace, String contributorName, String outputDir, Map<Class<?>, Object> specificParams, String fileEncoding) {
MiddleEnd me = createMiddleEnd (specificParams);
Map<String, FunctionDefContext> fdcs = new HashMap<String, FunctionDefContext>();
for (String res : resources) {
try {
_log.debug ("Creating FDC for " + res);
FunctionDefContext fdc = me.getFunctions(res);
for (NamedFunction f : fdc.getAllFunctions()) {
_log.debug ("Function " + f.getName());
}
fdcs.put(res, fdc);
} catch (NoMiddleEndForResourceException e) {
// TODO: handle exception
}
}
FdcHolder fdcHolder = new FdcHolder(fdcs);
compileInternal (fdcHolder, _typeSystem, contributorNamespace, contributorName, outputDir, fileEncoding);
}
protected abstract void compileInternal (FdcHolder fdcs, BackendTypesystem bts, String contributorNamespace, String contributorName, String outputDir, String fileEncoding);
protected MiddleEnd createMiddleEnd (Map<Class<?>, Object> specificParams) {
if (MiddleEndFactory.canCreateFromExtentions()) {
return MiddleEndFactory.createFromExtensions(_typeSystem, specificParams);
} else {
return MiddleEndFactory.create(_typeSystem, _languageHandlers);
}
}
}