@LoopProcessorAnnotations(loopProcessorAnnotations={@LoopProcessorAnnotation(processPath={IModelingElementDefinitions.CLASSES_PROCESSOR,IModelingElementDefinitions.OPERATIONS_PROCESSOR}),@LoopProcessorAnnotation(processPath={IModelingElementDefinitions.INTERFACES_PROCESSOR,IModelingElementDefinitions.OPERATIONS_PROCESSOR})},aspect=LoopAspectConstants.AFTER) public static void operationsProcessor(@GenerationRegistry GenerationPolicyRegistry generationValueGetter,@GenerationBaseElement Object element,@GenerationLoopElement Object modelPackage,@GenerationLoopElement(id={IModelingElementDefinitions.CLASSES_PROCESSOR,IModelingElementDefinitions.INTERFACES_PROCESSOR}) Object parent){
  List<Object> userAddedDependTypes=generationValueGetter.getValues(DEPEND_TYPES_TRACKER,parent);
  List<Object> parametersArgument=generationValueGetter.getValues(IModelingDecisions.OPERATION_PARAMETER_ARGUMENT,element,parent);
  for (  Object item : parametersArgument) {
    if (item instanceof SimpleEntry == false) {
      continue;
    }
    SimpleEntry<?,?> simpleEntry=(SimpleEntry<?,?>)item;
    Object type=simpleEntry.getKey();
    if (!userAddedDependTypes.contains(type)) {
      List<Object> types=generationValueGetter.getValues(IModelingConstants.TYPES_TRACKER,modelPackage,type);
      if (types.isEmpty()) {
        continue;
      }
      addDepend(generationValueGetter,parent,type);
    }
  }
}

@ LoopProcessorAnnotations ( loopProcessorAnnotations = { @ LoopProcessorAnnotation ( processPath = { IModelingElementDefinitions . CLASSES_PROCESSOR , IModelingElementDefinitions . OPERATIONS_PROCESSOR } ) , @ LoopProcessorAnnotation ( processPath = { IModelingElementDefinitions . INTERFACES_PROCESSOR , IModelingElementDefinitions . OPERATIONS_PROCESSOR } ) } , aspect = LoopAspectConstants . AFTER ) public static void operationsProcessor ( @ GenerationRegistry GenerationPolicyRegistry generationValueGetter , @ GenerationBaseElement Object element , @ GenerationLoopElement Object modelPackage , @ GenerationLoopElement ( id = { IModelingElementDefinitions . CLASSES_PROCESSOR , IModelingElementDefinitions . INTERFACES_PROCESSOR } ) Object parent ) { List < Object > userAddedDependTypes = generationValueGetter . getValues ( DEPEND_TYPES_TRACKER , parent ) ; List < Object > parametersArgument = generationValueGetter . getValues ( IModelingDecisions . OPERATION_PARAMETER_ARGUMENT , element , parent ) ; for ( Object item : parametersArgument ) { if ( item instanceof SimpleEntry == false ) { continue ; } SimpleEntry < ? , ? > simpleEntry = ( SimpleEntry < ? , ? > ) item ; Object type = simpleEntry . getKey ( ) ; if ( ! userAddedDependTypes . contains ( type ) ) { List < Object > types = generationValueGetter . getValues ( IModelingConstants . TYPES_TRACKER , modelPackage , type ) ; if ( types . isEmpty ( ) ) { continue ; } addDepend ( generationValueGetter , parent , type ) ; } } }
this is an important usability feature to have in our cpp transformation . asking the user to add " depend " statement for their code in each used parameter is some extra work . however , it is not that much , but the issue that in a language when the user forgets about adding the required depend , they can find a massive number of errors in the generated code due to that missing depends , and finding out that the missing depends is the reason can take sometime . in a language such as java , this is not a problem to realize that missing depend , but in cpp it can be even a nightmare in many cases .
