Skip to main content
summaryrefslogtreecommitdiffstats
blob: 1acb3d3a879e633626e0cf054716ae0a8d7417de (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/**
 * Copyright (c) 2017 protos software gmbh (http://www.protos.de).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * CONTRIBUTORS:
 * 		Henrik Rentz-Reichert (initial contribution)
 */
package org.eclipse.etrice.core.room.util;

import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.fsm.fSM.MessageFromIf;
import org.eclipse.etrice.core.fsm.fSM.RefinedTransition;
import org.eclipse.etrice.core.fsm.fSM.Transition;
import org.eclipse.etrice.core.fsm.fSM.TransitionBase;
import org.eclipse.etrice.core.fsm.fSM.Trigger;
import org.eclipse.etrice.core.fsm.fSM.TriggeredTransition;
import org.eclipse.etrice.core.genmodel.fsm.ICommonDataCalculator;
import org.eclipse.etrice.core.genmodel.fsm.fsmgen.Link;
import org.eclipse.etrice.core.room.DataType;
import org.eclipse.etrice.core.room.Message;
import org.eclipse.etrice.core.room.RefableType;
import org.eclipse.etrice.core.room.RoomFactory;
import org.eclipse.etrice.core.room.VarDecl;
import org.eclipse.etrice.core.room.util.RoomHelpers;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;

@SuppressWarnings("all")
public class CommonDataCalculator implements ICommonDataCalculator {
  private RoomHelpers roomHelpers = new RoomHelpers();
  
  @Override
  public EObject calculateCommonData(final Link l) {
    boolean _isIfitemTriggered = l.isIfitemTriggered();
    boolean _not = (!_isIfitemTriggered);
    if (_not) {
      return null;
    } else {
      EList<Link> _chainHeads = l.getChainHeads();
      final Function1<Link, TransitionBase> _function = (Link it) -> {
        TransitionBase _transition = it.getTransition();
        return CommonDataCalculator.realTransition(_transition);
      };
      List<TransitionBase> _map = ListExtensions.<Link, TransitionBase>map(_chainHeads, _function);
      Iterable<TriggeredTransition> transitions = Iterables.<TriggeredTransition>filter(_map, TriggeredTransition.class);
      final Function1<TriggeredTransition, EList<Trigger>> _function_1 = (TriggeredTransition it) -> {
        return it.getTriggers();
      };
      Iterable<EList<Trigger>> _map_1 = IterableExtensions.<TriggeredTransition, EList<Trigger>>map(transitions, _function_1);
      final Iterable<Trigger> triggers = Iterables.<Trigger>concat(_map_1);
      final Function1<Trigger, EList<MessageFromIf>> _function_2 = (Trigger it) -> {
        return it.getMsgFromIfPairs();
      };
      Iterable<EList<MessageFromIf>> _map_2 = IterableExtensions.<Trigger, EList<MessageFromIf>>map(triggers, _function_2);
      Iterable<MessageFromIf> _flatten = Iterables.<MessageFromIf>concat(_map_2);
      final Function1<MessageFromIf, VarDecl> _function_3 = (MessageFromIf it) -> {
        EObject _message = it.getMessage();
        return ((Message) _message).getData();
      };
      final Iterable<VarDecl> varDeclarations = IterableExtensions.<MessageFromIf, VarDecl>map(_flatten, _function_3);
      final Function1<VarDecl, DataType> _function_4 = (VarDecl it) -> {
        RefableType _refType = null;
        if (it!=null) {
          _refType=it.getRefType();
        }
        DataType _type = null;
        if (_refType!=null) {
          _type=_refType.getType();
        }
        return _type;
      };
      Iterable<DataType> _map_3 = IterableExtensions.<VarDecl, DataType>map(varDeclarations, _function_4);
      final Set<DataType> allData = IterableExtensions.<DataType>toSet(_map_3);
      int _size = allData.size();
      boolean _equals = (_size == 1);
      if (_equals) {
        return IterableExtensions.<VarDecl>head(varDeclarations);
      } else {
        final Function1<VarDecl, RefableType> _function_5 = (VarDecl it) -> {
          RefableType _refType = null;
          if (it!=null) {
            _refType=it.getRefType();
          }
          return _refType;
        };
        Iterable<RefableType> _map_4 = IterableExtensions.<VarDecl, RefableType>map(varDeclarations, _function_5);
        final List<RefableType> types = IterableExtensions.<RefableType>toList(_map_4);
        final RefableType rt = this.roomHelpers.getLastCommonSuperType(types);
        boolean _notEquals = (!Objects.equal(rt, null));
        if (_notEquals) {
          final VarDecl vd = RoomFactory.eINSTANCE.createVarDecl();
          vd.setName("data");
          vd.setRefType(rt);
          return vd;
        }
      }
    }
    return null;
  }
  
  private static TransitionBase realTransition(final TransitionBase t) {
    TransitionBase tr = t;
    while ((tr instanceof RefinedTransition)) {
      Transition _target = ((RefinedTransition)tr).getTarget();
      tr = _target;
    }
    return tr;
  }
}

Back to the top