docs: @SuppressWarnings({"checkstyle:cyclomaticcomplexity", "checkstyle:npathcomplexity"})
  	public static String getActionSignatureString(SarlAction signature, ISerializer serializer,
  			SARLGrammarKeywordAccess grammarAccess, ImportManager importManager) {
  		// Try the serializer
  		try {
  			return serializer.serialize(signature);
  		} catch (Throwable exception) {
  			// No working, perhaps the context's of the signature is unknown
  		}
  		final StringBuilder textRepresentation = new StringBuilder();
  		// Annotations
  		for (final XAnnotation annotation : signature.getAnnotations()) {
  			addAnnotationToSignature(textRepresentation, grammarAccess, serializer, importManager, annotation);
  		}
  		// Modifiers
  		for (final String modifier : signature.getModifiers()) {
  			textRepresentation.append(modifier);
  			textRepresentation.append(' ');
  		}
  		// Generic type
  		if (!signature.getTypeParameters().isEmpty()) {
  			boolean addComa = false;
  			textRepresentation.append(grammarAccess.getLessThanSignKeyword());
  			for (final JvmTypeParameter typeParameter : signature.getTypeParameters()) {
  				if (addComa) {
  					textRepresentation.append(grammarAccess.getCommaKeyword());
  					textRepresentation.append(' ');
  				} else {
  					addComa = true;
  				}
  				textRepresentation.append(getSignatureType(typeParameter, importManager));
  			}
  			textRepresentation.append(grammarAccess.getLessThanSignKeyword());
  			textRepresentation.append(' ');
  		}
  		// Name
  		textRepresentation.append(signature.getName());
  		// Parameters
  		if (!signature.getParameters().isEmpty()) {
  			textRepresentation.append(grammarAccess.getLeftParenthesisKeyword());
  			final int idx = signature.getParameters().size() - 1;
  			for (int i = 0; i < idx; ++i) {
  				addParamToSignature(textRepresentation, signature.getParameters().get(i), grammarAccess,
  						importManager, serializer);
  				textRepresentation.append(grammarAccess.getCommaKeyword());
  				textRepresentation.append(' ');
  			}
  			addParamToSignature(textRepresentation, signature.getParameters().get(idx), grammarAccess,
  					importManager, serializer);
  			textRepresentation.append(grammarAccess.getRightParenthesisKeyword());
  		}
  		// Return type
  		final JvmTypeReference returnType = signature.getReturnType();
  		if (returnType != null && !"void".equals(returnType.getIdentifier())) { //$NON-NLS-1$
  			textRepresentation.append(' ');
  			textRepresentation.append(grammarAccess.getColonKeyword());
  			textRepresentation.append(' ');
  			textRepresentation.append(getSignatureType(returnType.getType(), importManager));
  		}
  		// Throws
  		if (!signature.getExceptions().isEmpty()) {
  			textRepresentation.append(' ');
  			textRepresentation.append(grammarAccess.getThrowsKeyword());
  			textRepresentation.append(' ');
  			boolean addComa = false;
  			for (final JvmTypeReference eventType : signature.getExceptions()) {
  				if (addComa) {
  					textRepresentation.append(grammarAccess.getCommaKeyword());
  					textRepresentation.append(' ');
  				} else {
  					addComa = true;
  				}
  				textRepresentation.append(getSignatureType(eventType.getType(), importManager));
  			}
  		}
  		// Fires
  		if (!signature.getFiredEvents().isEmpty()) {
  			textRepresentation.append(' ');
  			textRepresentation.append(grammarAccess.getFiresKeyword());
  			textRepresentation.append(' ');
  			boolean addComa = false;
  			for (final JvmTypeReference eventType : signature.getFiredEvents()) {
  				if (addComa) {
  					textRepresentation.append(grammarAccess.getCommaKeyword());
  					textRepresentation.append(' ');
  				} else {
  					addComa = true;
  				}
  				textRepresentation.append(getSignatureType(eventType.getType(), importManager));
  			}
  		}
  		return textRepresentation.toString();
  	}