docs: @SuppressWarnings({"checkstyle:npathcomplexity", "checkstyle:cyclomaticcomplexity"})
  	protected void copyVisibleJvmConstructors(JvmGenericType source, JvmGenericType target,
  			XtendTypeDeclaration sarlSource, Set<ActionParameterTypes> createdConstructors,
  			JvmVisibility minimalVisibility) {
  		final boolean samePackage = Objects.equal(source.getPackageName(), target.getPackageName());
  		final Iterable<JvmConstructor> constructors = Iterables.transform(Iterables.filter(source.getMembers(), it -> {
  			if (it instanceof JvmConstructor) {
  				final JvmConstructor op = (JvmConstructor) it;
  				return op.getVisibility() != JvmVisibility.PRIVATE
  						&& (op.getVisibility() != JvmVisibility.DEFAULT || samePackage);
  			}
  			return false;
  		}), it -> (JvmConstructor) it);
  
  		// Sort the constructor in order to always add them in the same order.
  		final SortedSet<Pair<JvmConstructor, ActionParameterTypes>> sortedConstructors = new TreeSet<>(
  				(elt1, elt2) -> elt1.getValue().compareTo(elt2.getValue()));
  		for (final JvmConstructor constructor : constructors) {
  			final ActionParameterTypes types = this.sarlSignatureProvider.createParameterTypesFromJvmModel(
  					constructor.isVarArgs(), constructor.getParameters());
  			sortedConstructors.add(new Pair<>(constructor, types));
  		}
  
  		for (final Pair<JvmConstructor, ActionParameterTypes> pair : sortedConstructors) {
  			if (createdConstructors.add(pair.getValue())) {
  				final JvmConstructor constructor = pair.getKey();
  				final JvmConstructor newCons = this.typesFactory.createJvmConstructor();
  				newCons.setDeprecated(constructor.isDeprecated());
  				newCons.setSimpleName(target.getSimpleName());
  				target.getMembers().add(newCons);
  
  				for (final JvmFormalParameter parameter : constructor.getParameters()) {
  					final JvmFormalParameter newParam = this.typesFactory.createJvmFormalParameter();
  					newParam.setName(parameter.getSimpleName());
  					newCons.getParameters().add(newParam);
  
  					final JvmTypeReference originalParamTypeReference = parameter.getParameterType();
  					final JvmTypeReference paramType = cloneWithTypeParametersAndProxies(originalParamTypeReference, newCons);
  					assert originalParamTypeReference != paramType;
  					newParam.setParameterType(paramType);
  
  					for (final JvmAnnotationReference annotationReference : parameter.getAnnotations()) {
  						if (this.annotationUtils.findAnnotation(newParam, annotationReference.getAnnotation().getQualifiedName()) == null) {
  							final JvmAnnotationReference annotation = EcoreUtil.copy(annotationReference);
  							if (annotation != null) {
  								newParam.getAnnotations().add(annotation);
  								this.associator.removeAllAssociation(annotation);
  							}
  						}
  					}
  
  					this.associator.removeAllAssociation(paramType);
  					this.associator.removeAllAssociation(newParam);
  				}
  
  				newCons.setVarArgs(constructor.isVarArgs());
  
  				JvmVisibility visibility = constructor.getVisibility();
  				if (visibility != null && minimalVisibility != null && minimalVisibility.compareTo(visibility) > 0) {
  					visibility = minimalVisibility;
  				}
  				newCons.setVisibility(visibility);
  
  				setBody(newCons, it -> {
  					it.append(this.grammarKeywordAccess.getSuperKeyword());
  					it.append("("); //$NON-NLS-1$
  					boolean first = true;
  					for (final JvmFormalParameter parameter : newCons.getParameters()) {
  						if (first) {
  							first = false;
  						} else {
  							it.append(", "); //$NON-NLS-1$
  						}
  						it.append(parameter.getSimpleName());
  					}
  					it.append(");"); //$NON-NLS-1$
  				});
  
  				copyAndCleanDocumentationTo(constructor, newCons);
  
  				appendGeneratedAnnotation(newCons, getContext(target));
  
  				for (final JvmAnnotationReference annotationReference : constructor.getAnnotations()) {
  					if (this.annotationUtils.findAnnotation(newCons, annotationReference.getAnnotation().getQualifiedName()) == null) {
  						final JvmAnnotationReference annotation = EcoreUtil.copy(annotationReference);
  						if (annotation != null) {
  							newCons.getAnnotations().add(annotation);
  						}
  					}
  				}
  
  				this.associator.removeAllAssociation(newCons);
  			}
  		}
  	}