docs: @SuppressWarnings({
  		"checkstyle:cyclomaticcomplexity",
  		"checkstyle:npathcomplexity",
  		"checkstyle:nestedifdepth",
  		"checkstyle:parameternumber"})
  	public static void populateInheritanceContext(
  			JvmDeclaredType jvmElement,
  			JvmTypeReference extendedClass,
  			Iterable<JvmTypeReference> extendedInterfaces,
  			Map<ActionPrototype, JvmOperation> finalOperations,
  			Map<ActionPrototype, JvmOperation> overridableOperations,
  			Map<String, JvmField> inheritedFields,
  			Map<ActionPrototype, JvmOperation> operationsToImplement,
  			Map<ActionParameterTypes, JvmConstructor> superConstructors,
  			IActionPrototypeProvider sarlSignatureProvider) {
  		// Get the operations that must be implemented
  		if (operationsToImplement != null && extendedInterfaces != null) {
  			for (final JvmTypeReference interfaceReference : extendedInterfaces) {
  				for (final JvmFeature feature : ((JvmGenericType) interfaceReference.getType()).getAllFeatures()) {
  					if (!"java.lang.Object".equals(//$NON-NLS-1$
  							feature.getDeclaringType().getQualifiedName())) {
  						if (feature instanceof JvmOperation) {
  							final JvmOperation operation = (JvmOperation) feature;
  							final ActionParameterTypes sig = sarlSignatureProvider.createParameterTypesFromJvmModel(
  									operation.isVarArgs(), operation.getParameters());
  							final ActionPrototype actionKey = sarlSignatureProvider.createActionPrototype(
  									operation.getSimpleName(), sig);
  							if (operation.isDefault()) {
  								if (overridableOperations != null) {
  									overridableOperations.put(actionKey, operation);
  								}
  							} else {
  								if (operationsToImplement != null) {
  									operationsToImplement.put(actionKey, operation);
  								}
  							}
  						}
  					}
  				}
  			}
  		}
  
  		// Check on the implemented features, inherited from the super type
  		if (extendedClass != null) {
  			final JvmGenericType parentType = (JvmGenericType) extendedClass.getType();
  			for (final JvmFeature feature : parentType.getAllFeatures()) {
  				if (!"java.lang.Object".equals(feature.getDeclaringType().getQualifiedName()) //$NON-NLS-1$
  						&& isVisible(jvmElement, feature)
  						&& !isHiddenMember(feature.getSimpleName())) {
  					if (feature instanceof JvmOperation) {
  						if (!feature.isStatic()) {
  							final JvmOperation operation = (JvmOperation) feature;
  							final ActionParameterTypes sig = sarlSignatureProvider.createParameterTypesFromJvmModel(
  									operation.isVarArgs(), operation.getParameters());
  							final ActionPrototype actionKey = sarlSignatureProvider.createActionPrototype(
  									feature.getSimpleName(), sig);
  							if (operation.isAbstract() && !operation.isDefault()) {
  								if (operationsToImplement != null) {
  									operationsToImplement.put(actionKey, operation);
  								}
  							} else if (operation.isFinal()) {
  								if (finalOperations != null) {
  									finalOperations.put(actionKey, operation);
  								}
  								if (operationsToImplement != null) {
  									operationsToImplement.remove(actionKey);
  								}
  							} else {
  								if (overridableOperations != null) {
  									overridableOperations.put(actionKey, operation);
  								}
  								if (operationsToImplement != null) {
  									operationsToImplement.remove(actionKey);
  								}
  							}
  						}
  					} else if (feature instanceof JvmField && inheritedFields != null) {
  						inheritedFields.put(feature.getSimpleName(), (JvmField) feature);
  					}
  				}
  			}
  
  			if (superConstructors != null) {
  				for (final JvmConstructor cons : parentType.getDeclaredConstructors()) {
  					final ActionParameterTypes sig = sarlSignatureProvider.createParameterTypesFromJvmModel(
  							cons.isVarArgs(), cons.getParameters());
  					superConstructors.put(sig,  cons);
  				}
  			}
  		}
  	}