/**
 * Copyright (c) 2011 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)
 * 		Thomas Schuetz (refactoring, adapted for other target languages)
 */
package org.eclipse.etrice.generator.generic;

import com.google.common.base.Objects;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.etrice.core.fsm.fSM.DetailCode;
import org.eclipse.etrice.core.genmodel.fsm.base.ILogger;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorContainerClass;
import org.eclipse.etrice.core.room.Attribute;
import org.eclipse.etrice.core.room.ClassStructor;
import org.eclipse.etrice.core.room.DataClass;
import org.eclipse.etrice.core.room.DataType;
import org.eclipse.etrice.core.room.Operation;
import org.eclipse.etrice.core.room.ProtocolClass;
import org.eclipse.etrice.core.room.RefableType;
import org.eclipse.etrice.core.room.RoomClass;
import org.eclipse.etrice.core.room.VarDecl;
import org.eclipse.etrice.core.room.util.RoomHelpers;
import org.eclipse.etrice.generator.base.AbstractGenerator;
import org.eclipse.etrice.generator.generic.ILanguageExtension;
import org.eclipse.etrice.generator.generic.TypeHelpers;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.StringExtensions;

/**
 * A collection of methods for generation of user code, attributes with getters and setters
 * and operations.
 */
@Singleton
@SuppressWarnings("all")
public class ProcedureHelpers {
  protected final String NEWLINE = System.getProperty("line.separator");
  
  @Inject
  @Extension
  protected RoomHelpers _roomHelpers;
  
  @Inject
  @Extension
  protected TypeHelpers _typeHelpers;
  
  @Inject
  protected ILanguageExtension languageExt;
  
  @Inject
  protected ILogger logger;
  
  /**
   * @param dc a {@link DataClass}
   * @param id 0, 1 or 2 for the corresponding user codes
   * @return the generated code
   */
  public CharSequence userCode(final DataClass dc, final int id) {
    CharSequence _switchResult = null;
    switch (id) {
      case 1:
        String _deepUserCode1 = this._roomHelpers.getDeepUserCode1(dc);
        _switchResult = this.userCode(_deepUserCode1);
        break;
      case 2:
        String _deepUserCode2 = this._roomHelpers.getDeepUserCode2(dc);
        _switchResult = this.userCode(_deepUserCode2);
        break;
      case 3:
        String _deepUserCode3 = this._roomHelpers.getDeepUserCode3(dc);
        _switchResult = this.userCode(_deepUserCode3);
        break;
    }
    return _switchResult;
  }
  
  /**
   * @param pc a {@link ProtocolClass}
   * @param id 0, 1 or 2 for the corresponding user codes
   * @return the generated code
   */
  public CharSequence userCode(final ProtocolClass pc, final int id) {
    CharSequence _switchResult = null;
    switch (id) {
      case 1:
        String _deepUserCode1 = this._roomHelpers.getDeepUserCode1(pc);
        _switchResult = this.userCode(_deepUserCode1);
        break;
      case 2:
        String _deepUserCode2 = this._roomHelpers.getDeepUserCode2(pc);
        _switchResult = this.userCode(_deepUserCode2);
        break;
      case 3:
        String _deepUserCode3 = this._roomHelpers.getDeepUserCode3(pc);
        _switchResult = this.userCode(_deepUserCode3);
        break;
    }
    return _switchResult;
  }
  
  /**
   * @param ac an {@link ActorContainerClass}
   * @param id 0, 1 or 2 for the corresponding user codes
   * @return the generated code
   */
  public CharSequence userCode(final ActorContainerClass ac, final int id, final boolean includeInherited) {
    CharSequence _xifexpression = null;
    if (includeInherited) {
      CharSequence _switchResult = null;
      switch (id) {
        case 1:
          String _deepUserCode1 = this._roomHelpers.getDeepUserCode1(ac);
          _switchResult = this.userCode(_deepUserCode1);
          break;
        case 2:
          String _deepUserCode2 = this._roomHelpers.getDeepUserCode2(ac);
          _switchResult = this.userCode(_deepUserCode2);
          break;
        case 3:
          String _deepUserCode3 = this._roomHelpers.getDeepUserCode3(ac);
          _switchResult = this.userCode(_deepUserCode3);
          break;
      }
      _xifexpression = _switchResult;
    } else {
      CharSequence _switchResult_1 = null;
      switch (id) {
        case 1:
          DetailCode _userCode1 = ac.getUserCode1();
          _switchResult_1 = this.userCode(_userCode1);
          break;
        case 2:
          DetailCode _userCode2 = ac.getUserCode2();
          _switchResult_1 = this.userCode(_userCode2);
          break;
        case 3:
          DetailCode _userCode3 = ac.getUserCode3();
          _switchResult_1 = this.userCode(_userCode3);
          break;
      }
      _xifexpression = _switchResult_1;
    }
    return _xifexpression;
  }
  
  /**
   * @param dc some {@link DetailCode}
   * @return a string containing the expanded code surrounded by
   * 		comments (no tag replacement will happen)
   */
  public CharSequence userCode(final DetailCode dc) {
    String _detailCode = this._roomHelpers.getDetailCode(dc);
    return this.userCode(_detailCode);
  }
  
  private CharSequence userCode(final String code) {
    StringConcatenation _builder = new StringConcatenation();
    {
      boolean _and = false;
      boolean _notEquals = (!Objects.equal(code, null));
      if (!_notEquals) {
        _and = false;
      } else {
        boolean _isEmpty = code.isEmpty();
        boolean _not = (!_isEmpty);
        _and = _not;
      }
      if (_and) {
        _builder.append("/*--------------------- begin user code ---------------------*/");
        _builder.newLine();
        _builder.append(code, "");
        _builder.newLineIfNotEmpty();
        _builder.append("/*--------------------- end user code ---------------------*/");
        _builder.newLine();
      }
    }
    return _builder;
  }
  
  /**
   * @param EnumTest a list of {@link Attribute}s
   * @return code declaring the attributes
   */
  public CharSequence attributes(final List<Attribute> attributes) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("/*--------------------- attributes ---------------------*/");
    _builder.newLine();
    {
      for(final Attribute it : attributes) {
        CharSequence _attributeDeclaration = this.attributeDeclaration(it);
        _builder.append(_attributeDeclaration, "");
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  /**
   * @param attribute an {@link Attribute}
   * @return the code declaring the attribute
   */
  public CharSequence attributeDeclaration(final Attribute attribute) {
    StringConcatenation _builder = new StringConcatenation();
    String _accessLevelPublic = this.languageExt.accessLevelPublic();
    _builder.append(_accessLevelPublic, "");
    _builder.append(" ");
    String _declarationString = this.declarationString(attribute);
    _builder.append(_declarationString, "");
    _builder.append(";");
    _builder.newLineIfNotEmpty();
    return _builder;
  }
  
  /**
   * @param attribute an {@link Attribute}
   * @return the code for an array initializer
   */
  public String arrayInitializer(final Attribute att) {
    String _xifexpression = null;
    String _defaultValueLiteral = att.getDefaultValueLiteral();
    boolean _notEquals = (!Objects.equal(_defaultValueLiteral, null));
    if (_notEquals) {
      _xifexpression = att.getDefaultValueLiteral();
    } else {
      RefableType _type = att.getType();
      DataType _type_1 = _type.getType();
      _xifexpression = this.languageExt.defaultValue(_type_1);
    }
    final String dflt = _xifexpression;
    boolean _startsWith = dflt.startsWith("{");
    if (_startsWith) {
      String[] _split = dflt.split(",");
      int _size = ((List<String>)Conversions.doWrapArray(_split)).size();
      int _size_1 = att.getSize();
      boolean _notEquals_1 = (_size != _size_1);
      if (_notEquals_1) {
        String _name = att.getName();
        String _plus = ("WARNING: array size determined by initializer differs from attribute size (" + _name);
        String _plus_1 = (_plus + "[");
        int _size_2 = att.getSize();
        String _plus_2 = (_plus_1 + Integer.valueOf(_size_2));
        String _plus_3 = (_plus_2 + "] <-> ");
        String _plus_4 = (_plus_3 + dflt);
        String _plus_5 = (_plus_4 + ")");
        this.logger.logInfo(_plus_5);
      }
      return dflt;
    }
    String result = "{";
    int i = 0;
    while ((i < att.getSize())) {
      {
        result = (result + dflt);
        i = (i + 1);
        int _size_3 = att.getSize();
        boolean _lessThan = (i < _size_3);
        if (_lessThan) {
          result = (result + ", ");
        }
      }
    }
    return (result + "}");
  }
  
  /**
   * @param EnumTest a list of {@link Attribute}s
   * @param classname the name of the defining class
   * @return code declaring setters and getters for the attributes
   */
  public CharSequence attributeSettersGettersDeclaration(final List<Attribute> attributes, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("/* --------------------- attribute setters and getters */");
    _builder.newLine();
    {
      for(final Attribute attribute : attributes) {
        CharSequence _setterHeader = this.setterHeader(attribute, classname);
        _builder.append(_setterHeader, "");
        _builder.append(";");
        _builder.newLineIfNotEmpty();
        CharSequence _terHeader = this.getterHeader(attribute, classname);
        _builder.append(_terHeader, "");
        _builder.append(";");
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  /**
   * @param EnumTest a list of {@link Attribute}s
   * @param classname the name of the defining class
   * @return code defining setters and getters for the attributes
   */
  public CharSequence attributeSettersGettersImplementation(final List<Attribute> attributes, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("/* --------------------- attribute setters and getters */");
    _builder.newLine();
    {
      for(final Attribute attribute : attributes) {
        CharSequence _setterHeader = this.setterHeader(attribute, classname);
        _builder.append(_setterHeader, "");
        _builder.append(" {");
        _builder.newLineIfNotEmpty();
        _builder.append("\t ");
        String _memberAccess = this.languageExt.memberAccess();
        _builder.append(_memberAccess, "\t ");
        String _name = attribute.getName();
        _builder.append(_name, "\t ");
        _builder.append(" = ");
        String _name_1 = attribute.getName();
        _builder.append(_name_1, "\t ");
        _builder.append(";");
        _builder.newLineIfNotEmpty();
        _builder.append("}");
        _builder.newLine();
        CharSequence _terHeader = this.getterHeader(attribute, classname);
        _builder.append(_terHeader, "");
        _builder.append(" {");
        _builder.newLineIfNotEmpty();
        _builder.append("\t");
        _builder.append("return ");
        String _memberAccess_1 = this.languageExt.memberAccess();
        _builder.append(_memberAccess_1, "\t");
        String _name_2 = attribute.getName();
        _builder.append(_name_2, "\t");
        _builder.append(";");
        _builder.newLineIfNotEmpty();
        _builder.append("}");
        _builder.newLine();
      }
    }
    return _builder;
  }
  
  /**
   * @param attribute an {@link Attribute}
   * @param classname the name of the defining class
   * @return code for the attribute setter declaration
   */
  protected CharSequence setterHeader(final Attribute attribute, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    String _accessLevelPublic = this.languageExt.accessLevelPublic();
    _builder.append(_accessLevelPublic, "");
    _builder.append("void set");
    String _name = attribute.getName();
    String _firstUpper = StringExtensions.toFirstUpper(_name);
    _builder.append(_firstUpper, "");
    _builder.append("(");
    String _selfPointer = this.languageExt.selfPointer(classname, true);
    _builder.append(_selfPointer, "");
    String _argList = this.argList(Collections.<Attribute>unmodifiableList(CollectionLiterals.<Attribute>newArrayList(attribute)));
    _builder.append(_argList, "");
    _builder.append(")");
    return _builder;
  }
  
  /**
   * @param attribute an {@link Attribute}
   * @param classname the name of the defining class
   * @return code for the attribute getter declaration
   */
  protected CharSequence getterHeader(final Attribute attribute, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    String _accessLevelPublic = this.languageExt.accessLevelPublic();
    _builder.append(_accessLevelPublic, "");
    String _signatureString = this.signatureString(attribute);
    _builder.append(_signatureString, "");
    _builder.append(" get");
    String _name = attribute.getName();
    String _firstUpper = StringExtensions.toFirstUpper(_name);
    _builder.append(_firstUpper, "");
    _builder.append("(");
    String _selfPointer = this.languageExt.selfPointer(classname, false);
    _builder.append(_selfPointer, "");
    _builder.append(")");
    return _builder;
  }
  
  /**
   * @param attributes a list of {@link Attribute}s
   * @return an argument list for the attributes
   */
  public String argList(final Iterable<Attribute> attributes) {
    final Function1<Attribute, String> _function = new Function1<Attribute, String>() {
      public String apply(final Attribute it) {
        String _signatureString = ProcedureHelpers.this.signatureString(it);
        String _plus = (_signatureString + " ");
        String _name = it.getName();
        return (_plus + _name);
      }
    };
    Iterable<String> _map = IterableExtensions.<Attribute, String>map(attributes, _function);
    return IterableExtensions.join(_map, ", ");
  }
  
  /**
   * @param EnumTest an iterable of {@link Attribute}s representing a path
   * @param classname the name of the defining class
   * @return the invocation code for the call of a setter
   */
  public CharSequence invokeGetters(final Iterable<Attribute> path, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    {
      boolean _hasElements = false;
      for(final Attribute a : path) {
        if (!_hasElements) {
          _hasElements = true;
        } else {
          _builder.appendImmediate(".", "");
        }
        String _name = a.getName();
        CharSequence _invokeGetter = this.invokeGetter(_name, classname);
        _builder.append(_invokeGetter, "");
      }
    }
    return _builder;
  }
  
  /**
   * @param typeName the type name of the attribute
   * @param name the name of the attribute
   * @param classname the name of the type defining the getter
   * @return code defining the attribute getter
   */
  public CharSequence getterImplementation(final String typeName, final String name, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    String _accessLevelPublic = this.languageExt.accessLevelPublic();
    _builder.append(_accessLevelPublic, "");
    _builder.append(typeName, "");
    _builder.append(" get");
    String _firstUpper = StringExtensions.toFirstUpper(name);
    _builder.append(_firstUpper, "");
    _builder.append(" (");
    String _selfPointer = this.languageExt.selfPointer(classname, false);
    _builder.append(_selfPointer, "");
    _builder.append("){");
    _builder.newLineIfNotEmpty();
    _builder.append("\t");
    _builder.append("return ");
    String _memberAccess = this.languageExt.memberAccess();
    _builder.append(_memberAccess, "\t");
    _builder.append(name, "\t");
    _builder.append(";");
    _builder.newLineIfNotEmpty();
    _builder.append("}");
    _builder.newLine();
    return _builder;
  }
  
  /**
   * @param name the name of the attribute
   * @param classname the name of the type defining the getter
   * @return code defining the getter call
   */
  public CharSequence invokeGetter(final String name, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("get");
    String _firstUpper = StringExtensions.toFirstUpper(name);
    _builder.append(_firstUpper, "");
    _builder.append("(");
    String _selfPointer = this.languageExt.selfPointer(classname, true);
    _builder.append(_selfPointer, "");
    _builder.append(")");
    return _builder;
  }
  
  /**
   * @param name the name of the attribute
   * @param classname the name of the type defining the getter
   * @param value the value to be assigned
   * @return code defining the setter call
   */
  public CharSequence invokeSetter(final String name, final String classname, final String value) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("set");
    String _firstUpper = StringExtensions.toFirstUpper(name);
    _builder.append(_firstUpper, "");
    _builder.append("(");
    String _selfPointer = this.languageExt.selfPointer(classname, true);
    _builder.append(_selfPointer, "");
    _builder.append(value, "");
    _builder.append(")");
    return _builder;
  }
  
  /**
   * @param operations a list of {@link Operation}s
   * @param classname the name of the type defining the getter
   * @return code declaring the operations
   */
  public CharSequence operationsDeclaration(final List<? extends Operation> operations, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("/*--------------------- operations ---------------------*/");
    _builder.newLine();
    {
      for(final Operation operation : operations) {
        CharSequence _operationSignature = this.operationSignature(operation, classname, true);
        _builder.append(_operationSignature, "");
        _builder.append(";");
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  /**
   * @param operations a list of {@link Operation}s
   * @param classname the name of the type defining the getter
   * @return code defining the operations
   */
  public CharSequence operationsImplementation(final List<? extends Operation> operations, final String classname) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("/*--------------------- operations ---------------------*/");
    _builder.newLine();
    {
      for(final Operation operation : operations) {
        CharSequence _operationSignature = this.operationSignature(operation, classname, false);
        _builder.append(_operationSignature, "");
        _builder.append(" {");
        _builder.newLineIfNotEmpty();
        _builder.append("\t");
        AbstractGenerator _instance = AbstractGenerator.getInstance();
        DetailCode _detailCode = operation.getDetailCode();
        String _translatedCode = _instance.getTranslatedCode(_detailCode);
        _builder.append(_translatedCode, "\t");
        _builder.newLineIfNotEmpty();
        _builder.append("}");
        _builder.newLine();
      }
    }
    return _builder;
  }
  
  public CharSequence asBlock(final CharSequence str) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("{");
    _builder.newLine();
    _builder.append("\t");
    _builder.append(str, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("}");
    _builder.newLine();
    return _builder;
  }
  
  /**
   * invoke user structor, if (inherited) present - <b>C only</b>
   * 
   * @param cls {@link ActorClass} or {@link DataClass}
   * @param args self pointer to instance
   */
  public String invokeUserStructor(final RoomClass cls, final String args, final boolean ctor) {
    boolean _usesInheritance = this.languageExt.usesInheritance();
    boolean _not = (!_usesInheritance);
    List<ClassStructor> _structors = this.getStructors(cls, _not);
    final Function1<ClassStructor, Boolean> _function = new Function1<ClassStructor, Boolean>() {
      public Boolean apply(final ClassStructor it) {
        boolean _isConstructor = it.isConstructor();
        return Boolean.valueOf((_isConstructor == ctor));
      }
    };
    boolean _exists = IterableExtensions.<ClassStructor>exists(_structors, _function);
    if (_exists) {
      StringConcatenation _builder = new StringConcatenation();
      String _name = cls.getName();
      String _xifexpression = null;
      if (ctor) {
        _xifexpression = "ctor";
      } else {
        _xifexpression = "dtor";
      }
      String _memberInDeclaration = this.languageExt.memberInDeclaration(_name, _xifexpression);
      _builder.append(_memberInDeclaration, "");
      _builder.append("(");
      _builder.append(args, "");
      _builder.append(");");
      return _builder.toString();
    }
    return "";
  }
  
  /**
   * declaration of user constructor + destructor, if (inherited) present - <b>C only</b>
   * 
   * @param cls {@link ActorClass} or {@link DataClass}
   */
  public String userStructorsDeclaration(final RoomClass cls) {
    String _xblockexpression = null;
    {
      String _name = cls.getName();
      final String namePrefix = this.languageExt.operationScope(_name, true);
      final ArrayList<String> declBlock = CollectionLiterals.<String>newArrayList();
      declBlock.add("/*--------------------- user constructor/destructor ---------------------*/");
      boolean _usesInheritance = this.languageExt.usesInheritance();
      boolean _not = (!_usesInheritance);
      List<ClassStructor> _structors = this.getStructors(cls, _not);
      final Function1<ClassStructor, Boolean> _function = new Function1<ClassStructor, Boolean>() {
        public Boolean apply(final ClassStructor it) {
          return Boolean.valueOf(it.isConstructor());
        }
      };
      boolean _exists = IterableExtensions.<ClassStructor>exists(_structors, _function);
      if (_exists) {
        String _name_1 = cls.getName();
        CharSequence _functionSignature = this.functionSignature(_name_1, (namePrefix + "ctor"), "void", "");
        String _plus = (_functionSignature + ";");
        declBlock.add(_plus);
      }
      boolean _usesInheritance_1 = this.languageExt.usesInheritance();
      boolean _not_1 = (!_usesInheritance_1);
      List<ClassStructor> _structors_1 = this.getStructors(cls, _not_1);
      final Function1<ClassStructor, Boolean> _function_1 = new Function1<ClassStructor, Boolean>() {
        public Boolean apply(final ClassStructor it) {
          boolean _isConstructor = it.isConstructor();
          return Boolean.valueOf((!_isConstructor));
        }
      };
      boolean _exists_1 = IterableExtensions.<ClassStructor>exists(_structors_1, _function_1);
      if (_exists_1) {
        String _name_2 = cls.getName();
        CharSequence _functionSignature_1 = this.functionSignature(_name_2, (namePrefix + "dtor"), "void", "");
        String _plus_1 = (_functionSignature_1 + ";");
        declBlock.add(_plus_1);
      }
      _xblockexpression = IterableExtensions.join(declBlock, this.NEWLINE);
    }
    return _xblockexpression;
  }
  
  /**
   * implementation of user constructor + destructor, if (inherited) present - <b>C only</b>
   * 
   * @param cls {@link ActorClass} or {@link DataClass}
   */
  public String userStructorsImplementation(final RoomClass cls) {
    String _xblockexpression = null;
    {
      final ArrayList<String> declBlock = CollectionLiterals.<String>newArrayList();
      declBlock.add("/*--------------------- user constructor/destructor ---------------------*/");
      String _userStuctorImplementation = this.userStuctorImplementation(cls, true);
      declBlock.add(_userStuctorImplementation);
      String _userStuctorImplementation_1 = this.userStuctorImplementation(cls, false);
      declBlock.add(_userStuctorImplementation_1);
      Iterable<String> _filterNull = IterableExtensions.<String>filterNull(declBlock);
      _xblockexpression = IterableExtensions.join(_filterNull, this.NEWLINE);
    }
    return _xblockexpression;
  }
  
  protected String userStuctorImplementation(final RoomClass cls, final boolean ctor) {
    String _xblockexpression = null;
    {
      String _name = cls.getName();
      final String namePrefix = this.languageExt.operationScope(_name, false);
      boolean _usesInheritance = this.languageExt.usesInheritance();
      boolean _not = (!_usesInheritance);
      List<ClassStructor> _structors = this.getStructors(cls, _not);
      final Function1<ClassStructor, Boolean> _function = new Function1<ClassStructor, Boolean>() {
        public Boolean apply(final ClassStructor it) {
          boolean _isConstructor = it.isConstructor();
          return Boolean.valueOf((_isConstructor == ctor));
        }
      };
      boolean _exists = IterableExtensions.<ClassStructor>exists(_structors, _function);
      boolean _not_1 = (!_exists);
      if (_not_1) {
        return null;
      }
      StringConcatenation _builder = new StringConcatenation();
      String _name_1 = cls.getName();
      String _xifexpression = null;
      if (ctor) {
        _xifexpression = "ctor";
      } else {
        _xifexpression = "dtor";
      }
      String _plus = (namePrefix + _xifexpression);
      CharSequence _functionSignature = this.functionSignature(_name_1, _plus, "void", "");
      _builder.append(_functionSignature, "");
      _builder.append("{");
      _builder.newLineIfNotEmpty();
      _builder.append("\t");
      String _userStructorBody = this.userStructorBody(cls, ctor);
      _builder.append(_userStructorBody, "\t");
      _builder.newLineIfNotEmpty();
      _builder.append("}");
      _builder.newLine();
      _xblockexpression = _builder.toString();
    }
    return _xblockexpression;
  }
  
  /**
   * implementation of user structor, if (inherited) present
   */
  public String userStructorBody(final RoomClass cls, final boolean ctor) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("/* user defined ");
    {
      if (ctor) {
        _builder.append("con");
      } else {
        _builder.append("de");
      }
    }
    _builder.append("structor body */");
    final String comment = _builder.toString();
    boolean _usesInheritance = this.languageExt.usesInheritance();
    boolean _not = (!_usesInheritance);
    List<ClassStructor> _structors = this.getStructors(cls, _not);
    final Function1<ClassStructor, Boolean> _function = new Function1<ClassStructor, Boolean>() {
      public Boolean apply(final ClassStructor it) {
        boolean _isConstructor = it.isConstructor();
        return Boolean.valueOf((_isConstructor == ctor));
      }
    };
    final Iterable<ClassStructor> implementedStructors = IterableExtensions.<ClassStructor>filter(_structors, _function);
    final Function1<ClassStructor, DetailCode> _function_1 = new Function1<ClassStructor, DetailCode>() {
      public DetailCode apply(final ClassStructor it) {
        return it.getDetailCode();
      }
    };
    Iterable<DetailCode> _map = IterableExtensions.<ClassStructor, DetailCode>map(implementedStructors, _function_1);
    final Function1<DetailCode, String> _function_2 = new Function1<DetailCode, String>() {
      public String apply(final DetailCode it) {
        AbstractGenerator _instance = AbstractGenerator.getInstance();
        return _instance.getTranslatedCode(it);
      }
    };
    final Iterable<String> translatedCodes = IterableExtensions.<DetailCode, String>map(_map, _function_2);
    final Function1<String, CharSequence> _function_3 = new Function1<String, CharSequence>() {
      public CharSequence apply(final String it) {
        CharSequence _xifexpression = null;
        int _size = IterableExtensions.size(translatedCodes);
        boolean _greaterThan = (_size > 1);
        if (_greaterThan) {
          _xifexpression = ProcedureHelpers.this.asBlock(it);
        } else {
          _xifexpression = it;
        }
        return _xifexpression;
      }
    };
    Iterable<CharSequence> _map_1 = IterableExtensions.<String, CharSequence>map(translatedCodes, _function_3);
    String _join = IterableExtensions.join(_map_1);
    return ((comment + this.NEWLINE) + _join);
  }
  
  protected List<ClassStructor> getStructors(final RoomClass cls, final boolean inherited) {
    List<ClassStructor> _switchResult = null;
    final RoomClass it = cls;
    boolean _matched = false;
    if (!_matched) {
      if (it instanceof ActorClass) {
        if ((!inherited)) {
          _matched=true;
          _switchResult = ((ActorClass)it).getStructors();
        }
      }
    }
    if (!_matched) {
      if (it instanceof DataClass) {
        if ((!inherited)) {
          _matched=true;
          _switchResult = ((DataClass)it).getStructors();
        }
      }
    }
    if (!_matched) {
      if (it instanceof ActorClass) {
        if (inherited) {
          _matched=true;
          _switchResult = this._roomHelpers.getAllStructors(((ActorClass)it));
        }
      }
    }
    if (!_matched) {
      if (it instanceof DataClass) {
        if (inherited) {
          _matched=true;
          _switchResult = this._roomHelpers.getAllStructors(((DataClass)it));
        }
      }
    }
    return _switchResult;
  }
  
  /**
   * @param operation an {@link Operation}
   * @return the operation signature (with special care for
   * 		constructor and destructor
   */
  protected CharSequence operationSignature(final Operation operation, final String classname, final boolean isDeclaration) {
    CharSequence _xblockexpression = null;
    {
      StringConcatenation _builder = new StringConcatenation();
      {
        EList<VarDecl> _arguments = operation.getArguments();
        boolean _hasElements = false;
        for(final VarDecl argument : _arguments) {
          if (!_hasElements) {
            _hasElements = true;
          } else {
            _builder.appendImmediate(", ", "");
          }
          RefableType _refType = argument.getRefType();
          String _signatureString = this.signatureString(_refType);
          _builder.append(_signatureString, "");
          _builder.append(" ");
          String _name = argument.getName();
          _builder.append(_name, "");
        }
      }
      final String arguments = _builder.toString();
      RefableType _returnType = operation.getReturnType();
      final String returnType = this.signatureString(_returnType);
      String _operationScope = this.languageExt.operationScope(classname, isDeclaration);
      String _name_1 = operation.getName();
      String _plus = (_operationScope + _name_1);
      _xblockexpression = this.functionSignature(classname, _plus, returnType, arguments);
    }
    return _xblockexpression;
  }
  
  /**
   * @param type a {@link RefableType}
   * @return a string for the type (also for pointers)
   */
  public String signatureString(final RefableType type) {
    String _switchResult = null;
    final RefableType it = type;
    boolean _matched = false;
    if (!_matched) {
      if (Objects.equal(it, null)) {
        _matched=true;
        _switchResult = "void";
      }
    }
    if (!_matched) {
      boolean _isRef = it.isRef();
      if (_isRef) {
        _matched=true;
        DataType _type = type.getType();
        String _typeName = this._typeHelpers.typeName(_type);
        String _pointerLiteral = this.languageExt.pointerLiteral();
        _switchResult = (_typeName + _pointerLiteral);
      }
    }
    if (!_matched) {
      DataType _type_1 = type.getType();
      _switchResult = this._typeHelpers.typeName(_type_1);
    }
    return _switchResult;
  }
  
  public String signatureString(final Attribute attribute) {
    String _switchResult = null;
    final Attribute it = attribute;
    boolean _matched = false;
    if (!_matched) {
      int _size = it.getSize();
      boolean _greaterThan = (_size > 0);
      if (_greaterThan) {
        _matched=true;
        RefableType _type = it.getType();
        DataType _type_1 = _type.getType();
        String _typeName = this._typeHelpers.typeName(_type_1);
        int _size_1 = it.getSize();
        RefableType _type_2 = it.getType();
        boolean _isRef = _type_2.isRef();
        _switchResult = this.languageExt.arrayType(_typeName, _size_1, _isRef);
      }
    }
    if (!_matched) {
      RefableType _type_3 = it.getType();
      _switchResult = this.signatureString(_type_3);
    }
    return _switchResult;
  }
  
  /**
   * @param attribute a {@link Attribute}
   * @return a string for <code>type name</code>
   */
  public String declarationString(final Attribute attribute) {
    String _switchResult = null;
    final Attribute it = attribute;
    boolean _matched = false;
    if (!_matched) {
      int _size = it.getSize();
      boolean _greaterThan = (_size > 0);
      if (_greaterThan) {
        _matched=true;
        RefableType _type = it.getType();
        DataType _type_1 = _type.getType();
        String _typeName = this._typeHelpers.typeName(_type_1);
        int _size_1 = it.getSize();
        RefableType _type_2 = it.getType();
        boolean _isRef = _type_2.isRef();
        String _name = it.getName();
        _switchResult = this.languageExt.arrayDeclaration(_typeName, _size_1, _isRef, _name);
      }
    }
    if (!_matched) {
      RefableType _type_3 = it.getType();
      String _signatureString = this.signatureString(_type_3);
      String _plus = (_signatureString + " ");
      String _name_1 = it.getName();
      _switchResult = (_plus + _name_1);
    }
    return _switchResult;
  }
  
  protected CharSequence functionSignature(final String className, final String fullFctName, final String returnType, final String arguments) {
    StringConcatenation _builder = new StringConcatenation();
    String _accessLevelPublic = this.languageExt.accessLevelPublic();
    _builder.append(_accessLevelPublic, "");
    _builder.append(" ");
    _builder.append(returnType, "");
    _builder.append(" ");
    _builder.append(fullFctName, "");
    _builder.append("(");
    boolean _isEmpty = arguments.isEmpty();
    boolean _not = (!_isEmpty);
    String _selfPointer = this.languageExt.selfPointer(className, _not);
    _builder.append(_selfPointer, "");
    _builder.append(arguments, "");
    _builder.append(")");
    return _builder;
  }
}
