/**
   * Constructs new operation call for the given operation and execution context.
   *
   * @param operation a valid AST operation to be called. <code>Note:</code> This must be an
   *     operation owned by a valid QVT Library module
   * @param context non-QVT transformation context in which this operation will be called
   * @exception IllegalArgumentException If the passed <code>operation</code> or <code>context
   *     </code> are <code>null</code>; or the operation is not valid AST element for construction
   *     of the call
   */
  HelperOperationCall(Helper operation, NonTransformationExecutionContext context) {
    if (operation == null || context == null) {
      throw new IllegalArgumentException();
    }

    fOwningModule = QvtOperationalParserUtil.getOwningModule(operation);
    if (fOwningModule == null) {
      throw new IllegalArgumentException("Not a library query or helper"); // $NON-NLS-1$
    }

    fOperation = operation;
    fContextType = QvtOperationalParserUtil.getContextualType(fOperation);

    fArgumentTypes = new ArrayList<EClassifier>(fOperation.getEParameters().size());
    for (EParameter eParam : fOperation.getEParameters()) {
      EClassifier paramType = eParam.getEType();
      if (paramType == null) {
        throw new IllegalArgumentException("Parameter with no type"); // $NON-NLS-1$
      }

      fArgumentTypes.add(paramType);
    }

    fContext = context;
  }
  public void define(EcoreEnvironment env) {
    for (OperationProvider operation : getOperations()) {
      EOperation defOper = operation.define(env);
      if (operation.fIsStatic) {
        QvtOperationalParserUtil.markAsStaticOperation(defOper);
      }

      if (CallHandlerAdapter.getDispatcher(defOper) == UNSUPPORTED_OPER) {
        QvtOperationalParserUtil.markAsUnsupported(defOper);
      }
    }
  }
    public EOperation define(EcoreEnvironment env) {
      List<Variable<EClassifier, EParameter>> argList =
          new ArrayList<Variable<EClassifier, EParameter>>();
      int pos = 0;
      for (EClassifier cls : fParamTypes) {
        Variable<EClassifier, EParameter> stringVariable =
            ExpressionsFactory.eINSTANCE.createVariable();

        String paramName = cls.getName();
        if (fParamNames != null) {
          paramName = fParamNames[pos++];
        }
        stringVariable.setName(paramName);
        stringVariable.setType(cls);
        argList.add(stringVariable);
      }

      EOperation result =
          env.defineOperation(
              fContextType,
              fName,
              fReturnType,
              argList,
              org.eclipse.ocl.ecore.EcoreFactory.eINSTANCE.createConstraint());

      CallHandlerAdapter.attach(result, fDispatcher);

      if (fIsDeprecated) {
        if (fDeprecatedBy != null) {
          QvtOperationalParserUtil.markAsDeprecated(result, fDeprecatedBy);
        } else {
          QvtOperationalParserUtil.markAsDeprecated(result);
        }
      }
      return result;
    }