blob: 7219c1a247421fb684218445eba54a6f88ed07d8 [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.LinkedHashSet;
import java.util.function.Consumer;
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.emf.common.util.EList;
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 GroupHeaderTransformer extends ActivityGraphItemTransformer {
@Inject private OutputBuffer outputBuffer;
@Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
public static String getModuleName(final Group group) {
return "groups";
}
public static String getFunctionDef(final Group group) {
return "group_" + group.getName() + "()";
}
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 _translationUnit = new TranslationUnit();
_result = _translationUnit;
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 LinkedHashSet<String> groupItemIncludes = new LinkedHashSet<>();
final LinkedHashSet<String> groupItemCalls = new LinkedHashSet<>();
EList<ActivityGraphItem> _items = null;
if (group != null) {
_items = group.getItems();
}
final Consumer<ActivityGraphItem> _function = (ActivityGraphItem item) -> {
final TranslationUnit tmp = this.psCallGraphItemTransformer.transform(item);
if (((!StringExtensions.isNullOrEmpty(tmp.getExtendedIncPath()))
&& (!it.getExtendedIncPath().equals(tmp.getExtendedIncPath())))) {
groupItemIncludes.add(tmp.getExtendedIncPath());
}
if (!StringExtensions.isNullOrEmpty(tmp.getCall())) {
groupItemCalls.add(tmp.getCall());
}
};
_items.forEach(_function);
final int index = it.getExtendedIncPath().lastIndexOf(".");
final String trimmedIncPath = it.getExtendedIncPath().substring(0, index);
outputBuffer.appendTo("INC", trimmedIncPath, "\n//Group " + group.getName() + "----\n");
groupItemIncludes.forEach(include ->
outputBuffer.appendTo("INC", trimmedIncPath, "#include \"" + include + ".h\"\n"));
outputBuffer.appendTo("INC", trimmedIncPath, "void " + it.getCall() + ";\n");
}
}