blob: 296d9c8678303b5df74ac9c0e24c00c51cb811cc [file] [log] [blame]
/**
* Copyright (c) 2020 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Robert Bosch GmbH - initial API and implementation
*/
package org.eclipse.app4mc.slg.commons.m2t.generators;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.function.Consumer;
import org.eclipse.app4mc.amalthea.model.ActivityGraph;
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.StringExtensions;
public class RunnableTranslationUnit extends TranslationUnit {
public static String getModulePathStatic() {
return "synthetic_gen" + "/" + getModuleNameStatic();
}
public static String getMakeFilePathStatic() {
return getModulePathStatic() + "/" + "CMakeLists.txt";
}
public static String getModuleNameStatic() {
return "runnables";
}
public static String getLibName() {
return "RUNNABLES_LIB";
}
public String getModuleName() {
return RunnableTranslationUnit.getModuleNameStatic();
}
@Override
public String getCall() {
StringConcatenation builder = new StringConcatenation();
builder.append("run_");
builder.append(this.runnable.getName());
builder.append("()");
return builder.toString();
}
@Override
public String getIncFile() {
return getModuleName() + ".h";
}
public ActivityGraphItemTransformer callGraphItemTransformer;
public org.eclipse.app4mc.amalthea.model.Runnable runnable;
private OutputBuffer outputBuffer;
public RunnableTranslationUnit(final OutputBuffer outputBuffer,
final ActivityGraphItemTransformer callGraphItemTransformer,
final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
super();
this.callGraphItemTransformer = callGraphItemTransformer;
this.runnable = runnable;
this.outputBuffer = outputBuffer;
this.genFiles();
}
public void genFiles() {
if (isSrcFileEmpty()) {
srcAppend("#include \"" + getIncFile() + "\"\n");
}
final LinkedHashSet<String> includes = new LinkedHashSet<>();
final ArrayList<String> calls = new ArrayList<>();
ActivityGraph _activityGraph = null;
if (this.runnable != null) {
_activityGraph = this.runnable.getActivityGraph();
}
EList<ActivityGraphItem> _items = null;
if (_activityGraph != null) {
_items = _activityGraph.getItems();
}
final Consumer<ActivityGraphItem> _function = new Consumer<ActivityGraphItem>() {
@Override
public void accept(final ActivityGraphItem item) {
final TranslationUnit tmp = RunnableTranslationUnit.this.callGraphItemTransformer.transform(item);
if (((!StringExtensions.isNullOrEmpty(tmp.getIncFile()))
&& (!RunnableTranslationUnit.this.getIncFile().equals(tmp.getIncFile())))) {
includes.add(tmp.getIncFile());
}
final String call = tmp.getCall();
if (!StringExtensions.isNullOrEmpty(call)) {
calls.add(call);
}
}
};
_items.forEach(_function);
incAppend("\n//Runnable " + runnable.getName() + "----\n");
toH(includes);
srcAppend("\n//Runnable " + runnable.getName() + "----\n");
toCpp(includes, calls);
}
public void toH(final HashSet<String> includes) {
final Consumer<String> _function = new Consumer<String>() {
@Override
public void accept(final String include) {
RunnableTranslationUnit.this.incAppend((("#include \"" + include) + "\"\n"));
}
};
includes.forEach(_function);
StringConcatenation builder = new StringConcatenation();
builder.append("void ");
builder.append(this.getCall());
builder.append(";");
builder.newLineIfNotEmpty();
this.incAppend(builder.toString());
}
public void toCpp(final HashSet<String> includes, final List<String> calls) {
srcAppend("void " + getCall() + "{\n");
final Consumer<String> _function = new Consumer<String>() {
@Override
public void accept(final String call) {
RunnableTranslationUnit.this.srcAppend((("\t" + call) + ";\n"));
}
};
calls.forEach(_function);
srcAppend("}\n\n");
}
public String getBasePath() {
return "synthetic_gen";
}
public String getModulePath() {
return getBasePath() + "/" + getModuleName();
}
@Override
public String getSrcFile() {
return getModuleName() + ".cpp";
}
public String getIncPath() {
return getModulePath() + "/_inc/" + getIncFile();
}
public String getSrcPath() {
return getModulePath() + "/_src/" + getSrcFile();
}
public boolean isIncFileEmpty() {
return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
}
public boolean isSrcFileEmpty() {
return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
}
public void incAppend(final String str) {
outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
}
public void srcAppend(final String str) {
outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
}
}