All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jnario.spec.jvmmodel.SpecJvmModelInferrer Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2012 BMW Car IT and others.
 * 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
 */
package org.jnario.spec.jvmmodel;

import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtend.core.jvmmodel.SyntheticNameClashResolver;
import org.eclipse.xtend.core.xtend.AnonymousClass;
import org.eclipse.xtend.core.xtend.XtendClass;
import org.eclipse.xtend.core.xtend.XtendConstructor;
import org.eclipse.xtend.core.xtend.XtendField;
import org.eclipse.xtend.core.xtend.XtendFile;
import org.eclipse.xtend.core.xtend.XtendFunction;
import org.eclipse.xtend.core.xtend.XtendMember;
import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmAnnotationReference;
import org.eclipse.xtext.common.types.JvmConstructor;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.common.types.TypesFactory;
import org.eclipse.xtext.common.types.util.TypeReferences;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.xbase.XBlockExpression;
import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.XNullLiteral;
import org.eclipse.xtext.xbase.XbaseFactory;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation;
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
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.ListExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure2;
import org.jnario.ExampleCell;
import org.jnario.ExampleColumn;
import org.jnario.ExampleRow;
import org.jnario.ExampleTable;
import org.jnario.jvmmodel.ExtendedJvmTypesBuilder;
import org.jnario.jvmmodel.JnarioJvmModelInferrer;
import org.jnario.jvmmodel.TestRuntimeSupport;
import org.jnario.lib.ExampleTableRow;
import org.jnario.runner.Named;
import org.jnario.runner.Order;
import org.jnario.spec.jvmmodel.ImplicitSubject;
import org.jnario.spec.jvmmodel.SpecIgnoringXtendJvmModelInferrer;
import org.jnario.spec.naming.ExampleNameProvider;
import org.jnario.spec.spec.After;
import org.jnario.spec.spec.Before;
import org.jnario.spec.spec.Example;
import org.jnario.spec.spec.ExampleGroup;
import org.jnario.spec.spec.TestFunction;

/**
 * @author Sebastian Benz - Initial contribution and API
 */
@SuppressWarnings("all")
public class SpecJvmModelInferrer extends JnarioJvmModelInferrer {
  private int exampleIndex = 0;
  
  @Inject
  @Extension
  private ExtendedJvmTypesBuilder _extendedJvmTypesBuilder;
  
  @Inject
  @Extension
  private TypeReferences _typeReferences;
  
  @Inject
  @Extension
  private ExampleNameProvider _exampleNameProvider;
  
  @Inject
  @Extension
  private ImplicitSubject _implicitSubject;
  
  @Inject
  @Extension
  private SyntheticNameClashResolver _syntheticNameClashResolver;
  
  @Inject
  private TypesFactory typesFactory;
  
  @Inject
  @Extension
  private IJvmModelAssociations _iJvmModelAssociations;
  
  @Inject
  private SpecIgnoringXtendJvmModelInferrer xtendJvmModelInferrer;
  
  private int index = 0;
  
  public void doInfer(final EObject object, final IJvmDeclaredTypeAcceptor acceptor, final boolean preIndexingPhase) {
    if ((!(object instanceof XtendFile))) {
      return;
    }
    final XtendFile xtendFile = ((XtendFile) object);
    this.xtendJvmModelInferrer.infer(object, acceptor, preIndexingPhase);
    final ArrayList doLater = CollectionLiterals.newArrayList();
    EList _xtendTypes = xtendFile.getXtendTypes();
    Iterable _filter = Iterables.filter(_xtendTypes, ExampleGroup.class);
    for (final ExampleGroup declaration : _filter) {
      this.infer(acceptor, declaration, null, doLater, preIndexingPhase);
    }
    this.exampleIndex = 0;
    if ((!preIndexingPhase)) {
      for (final Runnable runnable : doLater) {
        runnable.run();
      }
    }
  }
  
  public JvmGenericType infer(final IJvmDeclaredTypeAcceptor acceptor, final ExampleGroup exampleGroup, final JvmGenericType superType, final List doLater, final boolean preIndexingPhase) {
    boolean _notEquals = (!Objects.equal(superType, null));
    if (_notEquals) {
      JvmParameterizedTypeReference _createTypeRef = this._typeReferences.createTypeRef(superType);
      exampleGroup.setExtends(_createTypeRef);
    } else {
      this.addSuperClass(exampleGroup);
    }
    final JvmGenericType javaType = this.typesFactory.createJvmGenericType();
    XtendFile _xtendFile = this.xtendFile(exampleGroup);
    this.setNameAndAssociate(_xtendFile, exampleGroup, javaType);
    acceptor.accept(javaType);
    if ((!preIndexingPhase)) {
      final Runnable _function = new Runnable() {
        public void run() {
          SpecJvmModelInferrer.this.initialize(exampleGroup, javaType);
        }
      };
      doLater.add(_function);
    }
    final ArrayList children = CollectionLiterals.newArrayList();
    EList _members = exampleGroup.getMembers();
    Iterable _filter = Iterables.filter(_members, ExampleGroup.class);
    final Procedure1 _function_1 = new Procedure1() {
      public void apply(final ExampleGroup child) {
        JvmGenericType _infer = SpecJvmModelInferrer.this.infer(acceptor, child, javaType, doLater, preIndexingPhase);
        children.add(_infer);
      }
    };
    IterableExtensions.forEach(_filter, _function_1);
    boolean _isEmpty = children.isEmpty();
    boolean _not = (!_isEmpty);
    if (_not) {
      TestRuntimeSupport _testRuntime = this.getTestRuntime();
      final Function1 _function_2 = new Function1() {
        public JvmTypeReference apply(final JvmGenericType it) {
          return SpecJvmModelInferrer.this._typeReferences.createTypeRef(it);
        }
      };
      List _map = ListExtensions.map(children, _function_2);
      _testRuntime.addChildren(exampleGroup, javaType, _map);
    }
    return javaType;
  }
  
  public void initialize(final XtendClass source, final JvmGenericType inferredJvmType) {
    inferredJvmType.setVisibility(JvmVisibility.PUBLIC);
    EList _annotations = source.getAnnotations();
    this.translateAnnotationsTo(_annotations, inferredJvmType);
    EList _annotations_1 = inferredJvmType.getAnnotations();
    String _describe = this._exampleNameProvider.describe(source);
    JvmAnnotationReference _annotation = this._extendedJvmTypesBuilder.toAnnotation(source, Named.class, _describe);
    this._extendedJvmTypesBuilder.operator_add(_annotations_1, _annotation);
    this.addDefaultConstructor(source, inferredJvmType);
    JvmTypeReference _extends = source.getExtends();
    boolean _equals = Objects.equal(_extends, null);
    if (_equals) {
      final JvmTypeReference typeRefToObject = this._typeReferences.getTypeForName(Object.class, source);
      boolean _notEquals = (!Objects.equal(typeRefToObject, null));
      if (_notEquals) {
        EList _superTypes = inferredJvmType.getSuperTypes();
        _superTypes.add(typeRefToObject);
      }
    } else {
      EList _superTypes_1 = inferredJvmType.getSuperTypes();
      JvmTypeReference _extends_1 = source.getExtends();
      JvmTypeReference _cloneWithProxies = this._extendedJvmTypesBuilder.cloneWithProxies(_extends_1);
      _superTypes_1.add(_cloneWithProxies);
    }
    TestRuntimeSupport _testRuntime = this.getTestRuntime();
    _testRuntime.updateExampleGroup(source, inferredJvmType);
    EList _implements = source.getImplements();
    for (final JvmTypeReference intf : _implements) {
      EList _superTypes_2 = inferredJvmType.getSuperTypes();
      JvmTypeReference _cloneWithProxies_1 = this._extendedJvmTypesBuilder.cloneWithProxies(intf);
      _superTypes_2.add(_cloneWithProxies_1);
    }
    this.fixTypeParameters(inferredJvmType);
    this.exampleIndex = 0;
    EList _members = source.getMembers();
    for (final XtendMember member : _members) {
      this.transformExamples(member, inferredJvmType);
    }
    this._implicitSubject.addImplicitSubject(inferredJvmType, ((ExampleGroup) source));
    this.appendSyntheticDispatchMethods(source, inferredJvmType);
    this._extendedJvmTypesBuilder.copyDocumentationTo(source, inferredJvmType);
    this._syntheticNameClashResolver.resolveNameClashes(inferredJvmType);
  }
  
  protected void transform(final XtendMember sourceMember, final JvmGenericType container, final boolean allowDispatch) {
    EObject _eContainer = sourceMember.eContainer();
    if ((_eContainer instanceof AnonymousClass)) {
      super.transform(sourceMember, container, allowDispatch);
    } else {
    }
  }
  
  public void transformExamples(final XtendMember sourceMember, final JvmGenericType container) {
    boolean _matched = false;
    if (!_matched) {
      if (sourceMember instanceof Example) {
        _matched=true;
        this.transform(((Example) sourceMember), container);
      }
    }
    if (!_matched) {
      if (sourceMember instanceof Before) {
        _matched=true;
        this.transform(((Before) sourceMember), container);
      }
    }
    if (!_matched) {
      if (sourceMember instanceof After) {
        _matched=true;
        this.transform(((After) sourceMember), container);
      }
    }
    if (!_matched) {
      if (sourceMember instanceof ExampleTable) {
        _matched=true;
        this.transform(((ExampleTable) sourceMember), container);
      }
    }
    if (!_matched) {
      if (sourceMember instanceof XtendFunction) {
        String _name = ((XtendFunction)sourceMember).getName();
        boolean _notEquals = (!Objects.equal(_name, null));
        if (_notEquals) {
          _matched=true;
          this.transform(((XtendFunction) sourceMember), container, false);
        }
      }
    }
    if (!_matched) {
      if (sourceMember instanceof XtendField) {
        _matched=true;
        this.transform(((XtendField) sourceMember), container);
      }
    }
    if (!_matched) {
      if (sourceMember instanceof XtendConstructor) {
        _matched=true;
        this.transform(((XtendConstructor) sourceMember), container);
      }
    }
  }
  
  public boolean transform(final Example element, final JvmGenericType container) {
    boolean _xblockexpression = false;
    {
      this.exampleIndex = (this.exampleIndex + 1);
      XExpression _expression = element.getExpression();
      boolean _equals = Objects.equal(_expression, null);
      if (_equals) {
        XBlockExpression _createXBlockExpression = XbaseFactory.eINSTANCE.createXBlockExpression();
        element.setExpression(_createXBlockExpression);
      }
      final JvmOperation method = this.toMethod(element, container);
      TestRuntimeSupport _testRuntime = this.getTestRuntime();
      _testRuntime.markAsTestMethod(element, method);
      boolean _isPending = element.isPending();
      if (_isPending) {
        TestRuntimeSupport _testRuntime_1 = this.getTestRuntime();
        _testRuntime_1.markAsPending(element, method);
      }
      EList _annotations = method.getAnnotations();
      String _describe = this._exampleNameProvider.describe(element);
      JvmAnnotationReference _annotation = this._extendedJvmTypesBuilder.toAnnotation(element, Named.class, _describe);
      this._extendedJvmTypesBuilder.operator_add(_annotations, _annotation);
      EList _annotations_1 = method.getAnnotations();
      JvmAnnotationReference _annotation_1 = this._extendedJvmTypesBuilder.toAnnotation(element, Order.class, Integer.valueOf(this.exampleIndex));
      this._extendedJvmTypesBuilder.operator_add(_annotations_1, _annotation_1);
      EList _members = container.getMembers();
      _xblockexpression = this._extendedJvmTypesBuilder.operator_add(_members, method);
    }
    return _xblockexpression;
  }
  
  public boolean transform(final Before element, final JvmGenericType container) {
    final Procedure2 _function = new Procedure2() {
      public void apply(final XtendMember e, final JvmOperation m) {
        TestRuntimeSupport _testRuntime = SpecJvmModelInferrer.this.getTestRuntime();
        _testRuntime.beforeMethod(e, m);
      }
    };
    final Procedure2 _function_1 = new Procedure2() {
      public void apply(final XtendMember e, final JvmOperation m) {
        TestRuntimeSupport _testRuntime = SpecJvmModelInferrer.this.getTestRuntime();
        _testRuntime.beforeAllMethod(e, m);
      }
    };
    return this.transformAround(element, container, _function, _function_1);
  }
  
  public boolean transform(final After element, final JvmGenericType container) {
    final Procedure2 _function = new Procedure2() {
      public void apply(final XtendMember e, final JvmOperation m) {
        TestRuntimeSupport _testRuntime = SpecJvmModelInferrer.this.getTestRuntime();
        _testRuntime.afterMethod(e, m);
      }
    };
    final Procedure2 _function_1 = new Procedure2() {
      public void apply(final XtendMember e, final JvmOperation m) {
        TestRuntimeSupport _testRuntime = SpecJvmModelInferrer.this.getTestRuntime();
        _testRuntime.afterAllMethod(e, m);
      }
    };
    return this.transformAround(element, container, _function, _function_1);
  }
  
  public boolean transformAround(final TestFunction element, final JvmGenericType container, final Procedure2 around, final Procedure2 aroundAll) {
    boolean _xblockexpression = false;
    {
      final JvmOperation afterMethod = this.toMethod(element, container);
      boolean _isStatic = element.isStatic();
      if (_isStatic) {
        aroundAll.apply(((XtendMember) element), afterMethod);
      } else {
        around.apply(element, afterMethod);
      }
      EList _members = container.getMembers();
      _xblockexpression = this._extendedJvmTypesBuilder.operator_add(_members, afterMethod);
    }
    return _xblockexpression;
  }
  
  public JvmOperation toMethod(final TestFunction element, final JvmGenericType container) {
    JvmOperation _xblockexpression = null;
    {
      JvmTypeReference _typeForName = this._typeReferences.getTypeForName(Void.TYPE, element);
      element.setReturnType(_typeForName);
      super.transform(element, container, true);
      Set _jvmElements = this._iJvmModelAssociations.getJvmElements(element);
      EObject _head = IterableExtensions.head(_jvmElements);
      final JvmOperation result = ((JvmOperation) _head);
      String _methodName = this._exampleNameProvider.toMethodName(element);
      result.setSimpleName(_methodName);
      EList _exceptions = result.getExceptions();
      JvmTypeReference _typeForName_1 = this._typeReferences.getTypeForName(Exception.class, element);
      this._extendedJvmTypesBuilder.operator_add(_exceptions, _typeForName_1);
      _xblockexpression = result;
    }
    return _xblockexpression;
  }
  
  public void configureWith(final JvmGenericType type, final EObject source, final XtendFile spec) {
    Resource _eResource = spec.eResource();
    EList _contents = _eResource.getContents();
    this._extendedJvmTypesBuilder.operator_add(_contents, type);
    String _package = spec.getPackage();
    type.setPackageName(_package);
    String _documentation = this._extendedJvmTypesBuilder.getDocumentation(source);
    this._extendedJvmTypesBuilder.setDocumentation(type, _documentation);
  }
  
  public JvmGenericType transform(final ExampleTable table, final JvmGenericType specType) {
    JvmGenericType _xblockexpression = null;
    {
      this.associateTableWithSpec(specType, table);
      XtendFile _xtendFile = this.xtendFile(table);
      String _javaClassName = this._exampleNameProvider.toJavaClassName(table);
      final Procedure1 _function = new Procedure1() {
        public void apply(final JvmGenericType exampleTableType) {
          EList _superTypes = exampleTableType.getSuperTypes();
          JvmTypeReference _typeForName = SpecJvmModelInferrer.this._typeReferences.getTypeForName(ExampleTableRow.class, table);
          SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_superTypes, _typeForName);
          XtendFile _xtendFile = SpecJvmModelInferrer.this.xtendFile(table);
          SpecJvmModelInferrer.this.configureWith(exampleTableType, table, _xtendFile);
          JvmParameterizedTypeReference _createTypeRef = SpecJvmModelInferrer.this._typeReferences.createTypeRef(exampleTableType);
          final JvmTypeReference type = SpecJvmModelInferrer.this._typeReferences.getTypeForName(org.jnario.lib.ExampleTable.class, table, _createTypeRef);
          String _javaClassName = SpecJvmModelInferrer.this._exampleNameProvider.toJavaClassName(table);
          final String initMethodName = ("_init" + _javaClassName);
          EList _members = specType.getMembers();
          final Procedure1 _function = new Procedure1() {
            public void apply(final JvmOperation it) {
              final Procedure1 _function = new Procedure1() {
                public void apply(final ITreeAppendable a) {
                  it.setDeclaringType(specType);
                  SpecJvmModelInferrer.this.generateInitializationMethod(table, a);
                }
              };
              SpecJvmModelInferrer.this._extendedJvmTypesBuilder.setBody(it, _function);
            }
          };
          JvmOperation _method = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.toMethod(table, initMethodName, type, _function);
          SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_members, _method);
          EList _members_1 = specType.getMembers();
          String _fieldName = SpecJvmModelInferrer.this._exampleNameProvider.toFieldName(table);
          final Procedure1 _function_1 = new Procedure1() {
            public void apply(final JvmField it) {
              it.setVisibility(JvmVisibility.PROTECTED);
              final Procedure1 _function = new Procedure1() {
                public void apply(final ITreeAppendable it) {
                  ITreeAppendable _append = it.append(initMethodName);
                  _append.append("()");
                }
              };
              SpecJvmModelInferrer.this._extendedJvmTypesBuilder.setInitializer(it, _function);
            }
          };
          JvmField _field = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.toField(table, _fieldName, type, _function_1);
          SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_members_1, _field);
          final Procedure1 _function_2 = new Procedure1() {
            public void apply(final JvmConstructor it) {
              String _simpleName = exampleTableType.getSimpleName();
              it.setSimpleName(_simpleName);
            }
          };
          final JvmConstructor constructor = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.toConstructor(table, _function_2);
          EList _members_2 = exampleTableType.getMembers();
          SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_members_2, constructor);
          final ArrayList assignments = CollectionLiterals.newArrayList();
          final JvmTypeReference stringType = SpecJvmModelInferrer.this._typeReferences.getTypeForName(String.class, table);
          final JvmTypeReference listType = SpecJvmModelInferrer.this._typeReferences.getTypeForName(List.class, table, stringType);
          final JvmFormalParameter cellNames = SpecJvmModelInferrer.this.typesFactory.createJvmFormalParameter();
          cellNames.setName("cellNames");
          cellNames.setParameterType(listType);
          EList _parameters = constructor.getParameters();
          SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_parameters, cellNames);
          assignments.add("super(cellNames);");
          SpecJvmModelInferrer.this.index = 0;
          EList _columns = table.getColumns();
          final Procedure1 _function_3 = new Procedure1() {
            public void apply(final ExampleColumn column) {
              JvmTypeReference _xifexpression = null;
              JvmTypeReference _type = column.getType();
              boolean _notEquals = (!Objects.equal(_type, null));
              if (_notEquals) {
                _xifexpression = column.getType();
              } else {
                _xifexpression = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.inferredType();
              }
              final JvmTypeReference columnType = _xifexpression;
              EList _members = exampleTableType.getMembers();
              String _name = column.getName();
              JvmTypeReference _cloneWithProxies = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.cloneWithProxies(columnType);
              JvmField _field = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.toField(column, _name, _cloneWithProxies);
              SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_members, _field);
              String _name_1 = column.getName();
              JvmTypeReference _cloneWithProxies_1 = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.cloneWithProxies(columnType);
              final JvmFormalParameter param = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.toParameter(column, _name_1, _cloneWithProxies_1);
              EList _parameters = constructor.getParameters();
              SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_parameters, param);
              String _name_2 = column.getName();
              JvmTypeReference _cloneWithProxies_2 = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.cloneWithProxies(columnType);
              final JvmOperation getter = SpecJvmModelInferrer.this._extendedJvmTypesBuilder.toGetter(column, _name_2, _cloneWithProxies_2);
              EList _members_1 = exampleTableType.getMembers();
              SpecJvmModelInferrer.this._extendedJvmTypesBuilder.operator_add(_members_1, getter);
              String _name_3 = column.getName();
              String _plus = ("this." + _name_3);
              String _plus_1 = (_plus + " = ");
              String _name_4 = column.getName();
              String _plus_2 = (_plus_1 + _name_4);
              String _plus_3 = (_plus_2 + ";");
              assignments.add(_plus_3);
            }
          };
          IterableExtensions.forEach(_columns, _function_3);
          EList _rows = table.getRows();
          final Procedure1 _function_4 = new Procedure1() {
            public void apply(final ExampleRow it) {
              EList _cells = it.getCells();
              final Procedure1 _function = new Procedure1() {
                public void apply(final ExampleCell it) {
                  String _initMethodName = SpecJvmModelInferrer.this.initMethodName(table, SpecJvmModelInferrer.this.index);
                  SpecJvmModelInferrer.this.generateCellInitializerMethod(specType, _initMethodName, it);
                  SpecJvmModelInferrer.this.index = (SpecJvmModelInferrer.this.index + 1);
                }
              };
              IterableExtensions.forEach(_cells, _function);
            }
          };
          IterableExtensions.forEach(_rows, _function_4);
          final Procedure1 _function_5 = new Procedure1() {
            public void apply(final ITreeAppendable a) {
              final Procedure1 _function = new Procedure1() {
                public void apply(final String it) {
                  ITreeAppendable _append = a.append(it);
                  _append.newLine();
                }
              };
              IterableExtensions.forEach(assignments, _function);
            }
          };
          SpecJvmModelInferrer.this._extendedJvmTypesBuilder.setBody(constructor, _function_5);
        }
      };
      _xblockexpression = this._extendedJvmTypesBuilder.toClass(_xtendFile, _javaClassName, _function);
    }
    return _xblockexpression;
  }
  
  public void generateInitializationMethod(final ExampleTable exampleTable, final ITreeAppendable appendable) {
    JvmTypeReference _typeForName = this._typeReferences.getTypeForName(Arrays.class, exampleTable);
    final JvmType arraysType = _typeForName.getType();
    String _fieldName = this._exampleNameProvider.toFieldName(exampleTable);
    String _plus = ("return ExampleTable.create(\"" + _fieldName);
    String _plus_1 = (_plus + "\", \n");
    appendable.append(_plus_1);
    ITreeAppendable _append = appendable.append("  ");
    ITreeAppendable _append_1 = _append.append(arraysType);
    ITreeAppendable _append_2 = _append_1.append(".asList(\"");
    List _columnNames = this.columnNames(exampleTable);
    String _join = IterableExtensions.join(_columnNames, "\", \"");
    String _plus_2 = (_join + "\"), ");
    _append_2.append(_plus_2);
    appendable.increaseIndentation();
    appendable.append("\n");
    this.index = 0;
    EList _rows = exampleTable.getRows();
    for (final ExampleRow row : _rows) {
      {
        ITreeAppendable _append_3 = appendable.append("new ");
        String _javaClassName = this._exampleNameProvider.toJavaClassName(exampleTable);
        ITreeAppendable _append_4 = _append_3.append(_javaClassName);
        _append_4.append("(");
        ITreeAppendable _append_5 = appendable.append("  ");
        ITreeAppendable _append_6 = _append_5.append(arraysType);
        EList _cells = row.getCells();
        final Function1 _function = new Function1() {
          public String apply(final ExampleCell it) {
            String _serialize = SpecJvmModelInferrer.this.serialize(it);
            String _trim = _serialize.trim();
            return Strings.convertToJavaString(_trim);
          }
        };
        List _map = ListExtensions.map(_cells, _function);
        String _join_1 = IterableExtensions.join(_map, "\", \"");
        String _plus_3 = (".asList(\"" + _join_1);
        String _plus_4 = (_plus_3 + "\"), ");
        _append_6.append(_plus_4);
        EList _cells_1 = row.getCells();
        for (final ExampleCell cell : _cells_1) {
          {
            XExpression _expression = cell.getExpression();
            if ((_expression instanceof XNullLiteral)) {
              appendable.append("null");
            } else {
              String _initMethodName = this.initMethodName(exampleTable, this.index);
              String _plus_5 = (_initMethodName + "()");
              appendable.append(_plus_5);
            }
            this.index = (this.index + 1);
            EList _cells_2 = row.getCells();
            ExampleCell _last = IterableExtensions.last(_cells_2);
            boolean _notEquals = (!Objects.equal(_last, cell));
            if (_notEquals) {
              appendable.append(", ");
            }
          }
        }
        appendable.append(")");
        EList _rows_1 = exampleTable.getRows();
        ExampleRow _last = IterableExtensions.last(_rows_1);
        boolean _notEquals = (!Objects.equal(_last, row));
        if (_notEquals) {
          appendable.append(",\n");
        }
      }
    }
    appendable.decreaseIndentation();
    appendable.append("\n);");
  }
  
  public void associateTableWithSpec(final JvmGenericType type, final ExampleTable table) {
    EList _rows = table.getRows();
    for (final ExampleRow row : _rows) {
      this._extendedJvmTypesBuilder.associate(row, type);
    }
  }
  
  public String initMethodName(final ExampleTable exampleTable, final int i) {
    String _javaClassName = this._exampleNameProvider.toJavaClassName(exampleTable);
    String _plus = ("_init" + _javaClassName);
    String _plus_1 = (_plus + "Cell");
    return (_plus_1 + Integer.valueOf(i));
  }
  
  public boolean generateCellInitializerMethod(final JvmGenericType specType, final String name, final ExampleCell cell) {
    EList _members = specType.getMembers();
    JvmTypeReference _inferredType = this._extendedJvmTypesBuilder.inferredType();
    final Procedure1 _function = new Procedure1() {
      public void apply(final JvmOperation it) {
        it.setDeclaringType(specType);
        XExpression _expression = cell.getExpression();
        SpecJvmModelInferrer.this.setBody(it, _expression);
      }
    };
    JvmOperation _method = this._extendedJvmTypesBuilder.toMethod(cell, name, _inferredType, _function);
    return this._extendedJvmTypesBuilder.operator_add(_members, _method);
  }
  
  public List columnNames(final ExampleTable exampleTable) {
    EList _columns = exampleTable.getColumns();
    final Function1 _function = new Function1() {
      public String apply(final ExampleColumn it) {
        String _name = null;
        if (it!=null) {
          _name=it.getName();
        }
        return _name;
      }
    };
    return ListExtensions.map(_columns, _function);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy