public static bool IsAsyncSuffixMissing(this IMethodDeclaration methodDeclaration) { if (methodDeclaration.IsOverride) { return(false); } var declaredElement = methodDeclaration.DeclaredElement; if (declaredElement != null) { var memberInstances = declaredElement.GetAllSuperMembers(); if (memberInstances.Count > 0) { return(false); } var settings = methodDeclaration.GetSettingsStore(); var excludeTestMethods = settings.GetValue(AsyncSuffixSettingsAccessor.ExcludeTestMethodsFromAnalysis); if (excludeTestMethods) { if (declaredElement.IsTestMethod() || methodDeclaration.IsAnnotatedWithKnownTestAttribute()) { return(false); } } if (declaredElement.ShortName.EndsWith("Async", StringComparison.Ordinal)) { return(false); } var returnType = declaredElement.ReturnType as IDeclaredType; if (returnType == null) { return(false); } var customAsyncTypeNames = settings.EnumEntryIndices(AsyncSuffixSettingsAccessor.CustomAsyncTypes) .ToArray(); var customAsyncTypes = new List <IDeclaredType>(); customAsyncTypeNames .ForEach(type => customAsyncTypes.Add(TypeFactory.CreateTypeByCLRName(type, declaredElement.Module))); var returnTypeElement = returnType.GetTypeElement(); var isCustomAsyncType = returnTypeElement != null && customAsyncTypes.Any(type => returnTypeElement.IsDescendantOf(type.GetTypeElement())); if (returnType.IsTaskType() || isCustomAsyncType) { return(true); } } return(false); }