blob: 2fc792bc7fe7623675979ab3ca7cdba15a320294 [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2021 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.transformers.sw;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
import org.eclipse.app4mc.amalthea.model.Component;
import org.eclipse.app4mc.amalthea.model.Group;
import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.StringExtensions;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class GroupSourceTransformer extends ActivityGraphItemTransformer {
@Inject private OutputBuffer outputBuffer;
@Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
public TranslationUnit transform(final Group group, final Component component) {
final ArrayList<?> key = CollectionLiterals.newArrayList(group, component);
final TranslationUnit _result;
synchronized (cache) {
if (cache.containsKey(key)) {
return cache.get(key);
}
TranslationUnit tu = new TranslationUnit();
_result = tu;
cache.put(key, _result);
}
_init_transform(_result, group, component);
return _result;
}
private final HashMap<ArrayList<?>, TranslationUnit> cache = CollectionLiterals.newHashMap();
private void _init_transform(final TranslationUnit it, final Group group, final Component component) {
it.setPath(GroupHeaderTransformer.getModuleName(group));
it.setCall(GroupHeaderTransformer.getFunctionDef(group));
final LinkedList<String> groupItemIncludes = new LinkedList<>();
final LinkedList<String> groupItemCalls = new LinkedList<>();
if (group != null) {
for (ActivityGraphItem item : group.getItems()) {
final TranslationUnit tmp = psCallGraphItemTransformer.transform(item);
if (!StringExtensions.isNullOrEmpty(tmp.getPath())) {
groupItemIncludes.add(tmp.getPath());
}
if (!StringExtensions.isNullOrEmpty(tmp.getCall())) {
groupItemCalls.add(tmp.getCall());
}
}
}
final int index = it.getExtendedSrcPath().lastIndexOf(".");
final String trimmedSrcPath = it.getExtendedSrcPath().substring(0, index);
outputBuffer.appendTo("SRC", trimmedSrcPath, (("\n//Group " + group.getName()) + "----\n"));
groupItemIncludes.forEach(include ->
outputBuffer.appendTo("SRC", trimmedSrcPath, "#include \"" + include + ".h\"\n"));
outputBuffer.appendTo("SRC", trimmedSrcPath, "void " + it.getCall() + "{\n");
groupItemCalls.forEach(call ->
outputBuffer.appendTo("SRC", trimmedSrcPath, call + ";\n"));
outputBuffer.appendTo("SRC", trimmedSrcPath, "}");
}
}