/*******************************************************************************
 * Copyright (c) 2018 Willink Transformations 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
 *
 * Contributors:
 *     Adolfo Sanchez-Barbudo Herrera - initial API and implementation
 *******************************************************************************/
/**
 * generated by Xtext 2.10.0
 */
package org.eclipse.qvtd.doc.minioclcs;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.qvtd.doc.minioclcs.MinioclcsPackage
 * @generated
 */
public interface MinioclcsFactory extends EFactory
{
  /**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  MinioclcsFactory eINSTANCE = org.eclipse.qvtd.doc.minioclcs.impl.MinioclcsFactoryImpl.init();

  /**
	 * Returns a new object of class '<em>Root CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Root CS</em>'.
	 * @generated
	 */
  RootCS createRootCS();

  /**
	 * Returns a new object of class '<em>Import CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Import CS</em>'.
	 * @generated
	 */
  ImportCS createImportCS();

  /**
	 * Returns a new object of class '<em>Package CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Package CS</em>'.
	 * @generated
	 */
  PackageCS createPackageCS();

  /**
	 * Returns a new object of class '<em>Class CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Class CS</em>'.
	 * @generated
	 */
  ClassCS createClassCS();

  /**
	 * Returns a new object of class '<em>Property CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property CS</em>'.
	 * @generated
	 */
  PropertyCS createPropertyCS();

  /**
	 * Returns a new object of class '<em>Multiplicity CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Multiplicity CS</em>'.
	 * @generated
	 */
  MultiplicityCS createMultiplicityCS();

  /**
	 * Returns a new object of class '<em>Operation CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Operation CS</em>'.
	 * @generated
	 */
  OperationCS createOperationCS();

  /**
	 * Returns a new object of class '<em>Parameter CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Parameter CS</em>'.
	 * @generated
	 */
  ParameterCS createParameterCS();

  /**
	 * Returns a new object of class '<em>Constraints Def CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Constraints Def CS</em>'.
	 * @generated
	 */
  ConstraintsDefCS createConstraintsDefCS();

  /**
	 * Returns a new object of class '<em>Invariant CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Invariant CS</em>'.
	 * @generated
	 */
  InvariantCS createInvariantCS();

  /**
	 * Returns a new object of class '<em>Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Exp CS</em>'.
	 * @generated
	 */
  ExpCS createExpCS();

  /**
	 * Returns a new object of class '<em>Equality Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Equality Exp CS</em>'.
	 * @generated
	 */
  EqualityExpCS createEqualityExpCS();

  /**
	 * Returns a new object of class '<em>Call Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Call Exp CS</em>'.
	 * @generated
	 */
  CallExpCS createCallExpCS();

  /**
	 * Returns a new object of class '<em>Primary Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Primary Exp CS</em>'.
	 * @generated
	 */
  PrimaryExpCS createPrimaryExpCS();

  /**
	 * Returns a new object of class '<em>Self Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Self Exp CS</em>'.
	 * @generated
	 */
  SelfExpCS createSelfExpCS();

  /**
	 * Returns a new object of class '<em>Navigation Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Navigation Exp CS</em>'.
	 * @generated
	 */
  NavigationExpCS createNavigationExpCS();

  /**
	 * Returns a new object of class '<em>Loop Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Loop Exp CS</em>'.
	 * @generated
	 */
  LoopExpCS createLoopExpCS();

  /**
	 * Returns a new object of class '<em>Collect Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Collect Exp CS</em>'.
	 * @generated
	 */
  CollectExpCS createCollectExpCS();

  /**
	 * Returns a new object of class '<em>Iterator Var CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Iterator Var CS</em>'.
	 * @generated
	 */
  IteratorVarCS createIteratorVarCS();

  /**
	 * Returns a new object of class '<em>Iterate Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Iterate Exp CS</em>'.
	 * @generated
	 */
  IterateExpCS createIterateExpCS();

  /**
	 * Returns a new object of class '<em>Acc Var CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Acc Var CS</em>'.
	 * @generated
	 */
  AccVarCS createAccVarCS();

  /**
	 * Returns a new object of class '<em>Name Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Name Exp CS</em>'.
	 * @generated
	 */
  NameExpCS createNameExpCS();

  /**
	 * Returns a new object of class '<em>Rounded Bracket Clause CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Rounded Bracket Clause CS</em>'.
	 * @generated
	 */
  RoundedBracketClauseCS createRoundedBracketClauseCS();

  /**
	 * Returns a new object of class '<em>Literal Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Literal Exp CS</em>'.
	 * @generated
	 */
  LiteralExpCS createLiteralExpCS();

  /**
	 * Returns a new object of class '<em>Int Literal Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Int Literal Exp CS</em>'.
	 * @generated
	 */
  IntLiteralExpCS createIntLiteralExpCS();

  /**
	 * Returns a new object of class '<em>Boolean Literal Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Boolean Literal Exp CS</em>'.
	 * @generated
	 */
  BooleanLiteralExpCS createBooleanLiteralExpCS();

  /**
	 * Returns a new object of class '<em>Null Literal Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Null Literal Exp CS</em>'.
	 * @generated
	 */
  NullLiteralExpCS createNullLiteralExpCS();

  /**
	 * Returns a new object of class '<em>Collection Literal Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Collection Literal Exp CS</em>'.
	 * @generated
	 */
  CollectionLiteralExpCS createCollectionLiteralExpCS();

  /**
	 * Returns a new object of class '<em>Collection Literal Part CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Collection Literal Part CS</em>'.
	 * @generated
	 */
  CollectionLiteralPartCS createCollectionLiteralPartCS();

  /**
	 * Returns a new object of class '<em>Let Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Let Exp CS</em>'.
	 * @generated
	 */
  LetExpCS createLetExpCS();

  /**
	 * Returns a new object of class '<em>Let Var CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Let Var CS</em>'.
	 * @generated
	 */
  LetVarCS createLetVarCS();

  /**
	 * Returns a new object of class '<em>Path Name CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Path Name CS</em>'.
	 * @generated
	 */
  PathNameCS createPathNameCS();

  /**
	 * Returns a new object of class '<em>Path Element CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Path Element CS</em>'.
	 * @generated
	 */
  PathElementCS createPathElementCS();

  /**
	 * Returns a new object of class '<em>Boolean Exp CS</em>'.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return a new object of class '<em>Boolean Exp CS</em>'.
	 * @generated
	 */
  BooleanExpCS createBooleanExpCS();

  /**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
  MinioclcsPackage getMinioclcsPackage();

} //MinioclcsFactory
