docs: @Check
  	@Override
  	@SuppressWarnings("checkstyle:cyclomaticcomplexity")
  	public void checkAbstract(XtendFunction function) {
  		final XtendTypeDeclaration declarator = function.getDeclaringType();
  		if (function.getExpression() == null || function.isAbstract()) {
  			if (declarator instanceof XtendClass || declarator.isAnonymous()
  					|| declarator instanceof SarlAgent || declarator instanceof SarlBehavior
  					|| declarator instanceof SarlSkill) {
  				if (function.isDispatch()) {
  					error(MessageFormat.format(
  							Messages.SARLValidator_80,
  							function.getName(), this.localClassAwareTypeNames.getReadableName(declarator)),
  							XTEND_FUNCTION__NAME, -1, DISPATCH_FUNCTIONS_MUST_NOT_BE_ABSTRACT);
  					return;
  				}
  				if (function.getCreateExtensionInfo() != null) {
  					error(MessageFormat.format(
  							Messages.SARLValidator_81,
  							function.getName(), this.localClassAwareTypeNames.getReadableName(declarator)),
  							XTEND_FUNCTION__NAME, -1, CREATE_FUNCTIONS_MUST_NOT_BE_ABSTRACT);
  					return;
  				}
  				if (declarator.isAnonymous()) {
  					error(MessageFormat.format(
  							Messages.SARLValidator_82,
  							function.getName(), this.localClassAwareTypeNames.getReadableName(declarator)),
  							XTEND_FUNCTION__NAME, -1, MISSING_ABSTRACT_IN_ANONYMOUS);
  				} else {
  					final boolean isAbstract;
  					if (declarator instanceof XtendClass) {
  						isAbstract = ((XtendClass) declarator).isAbstract();
  					} else if (declarator instanceof SarlAgent) {
  						isAbstract = ((SarlAgent) declarator).isAbstract();
  					} else if (declarator instanceof SarlBehavior) {
  						isAbstract = ((SarlBehavior) declarator).isAbstract();
  					} else if (declarator instanceof SarlSkill) {
  						isAbstract = ((SarlSkill) declarator).isAbstract();
  					} else {
  						return;
  					}
  					if (!isAbstract && !function.isNative()) {
  						error(MessageFormat.format(
  								Messages.SARLValidator_82,
  								function.getName(), this.localClassAwareTypeNames.getReadableName(declarator)),
  								XTEND_FUNCTION__NAME, -1, MISSING_ABSTRACT);
  						return;
  					}
  				}
  
  				if (!function.getModifiers().contains("abstract")) { //$NON-NLS-1$
  					warning(MessageFormat.format(
  							Messages.SARLValidator_84,
  							function.getName(), this.localClassAwareTypeNames.getReadableName(declarator)),
  							XTEND_FUNCTION__NAME, -1, MISSING_ABSTRACT,
  							function.getName(),
  							this.localClassAwareTypeNames.getReadableName(declarator));
  				}
  
  			} else if (declarator instanceof XtendInterface || declarator instanceof SarlCapacity) {
  				if (function.getCreateExtensionInfo() != null) {
  					error(MessageFormat.format(
  							Messages.SARLValidator_85,
  							function.getName()),
  							XTEND_FUNCTION__NAME, -1, CREATE_FUNCTIONS_MUST_NOT_BE_ABSTRACT);
  					return;
  				}
  			}
  		} else if (declarator instanceof XtendInterface || declarator instanceof SarlCapacity) {
  			if (!getGeneratorConfig(function).getJavaSourceVersion().isAtLeast(JAVA8)) {
  				error(Messages.SARLValidator_86, XTEND_FUNCTION__NAME, -1, ABSTRACT_METHOD_WITH_BODY);
  				return;
  			}
  		}
  	}