CompleterResult GetImplementations() { Func <Func <string, string>, string, Func <CompleterError>, Either <CompleterError, string> > getImplementation = (getImpl, interfaceName, check) => { var interfaceType = model.Compilation.GetTypeByMetadataName(interfaceName); if (type.AllInterfaces.Contains(interfaceType)) { var error = check.With(x => x()); if (error != null) { return(error); } return(string.Empty); } return(getImpl(type.Name).AddTabs(1)); }; const string IDataErrorInfoName = "System.ComponentModel.IDataErrorInfo"; Func <string, string, string> getIDataErrorInfoPropertyImplementation = (implementation, name) => type.Properties().Any(m => (m.Name == IDataErrorInfoName + "." + name) || (m.DeclaredAccessibility == Microsoft.CodeAnalysis.Accessibility.Public && m.Name == name)) ? null : implementation; var iDataErrorInfoType = model.Compilation.GetTypeByMetadataName(IDataErrorInfoName); var dataErrorInfoImplementation = type.AllInterfaces.Contains(iDataErrorInfoType) ? ( getIDataErrorInfoPropertyImplementation(DataErrorInfoErrorImplementation, "Error") + getIDataErrorInfoPropertyImplementation(DataErrorInfoIndexerImplementation, "this[]") ) : null; Func <CompleterError> checkRaisePropertyChangedMethod = () => { Func <CompleterError> error = () => CompleterError.CreateForTypeName(type, Messages.POCO_RaisePropertyChangedMethodNotFound.Format(type.Name)); var raisePropertyChangedMethods = methods.GetValueOrDefault("RaisePropertyChanged", ImmutableArray <IMethodSymbol> .Empty); if (raisePropertyChangedMethods.IsEmpty) { return(error()); } var raisePropertyChangedMethod = raisePropertyChangedMethods.FirstOrDefault(method => { if (method.Parameters.Length != 1) { return(false); } var parameter = method.Parameters.Single(); return(parameter.RefKind == RefKind.None && parameter.Type.SpecialType == SpecialType.System_String); }); if (raisePropertyChangedMethod == null) { return(error()); } return(null); }; return(new[] { getImplementation(INPCImplemetation, "System.ComponentModel.INotifyPropertyChanged", checkRaisePropertyChangedMethod), getImplementation(ParentViewModelImplementation, "DevExpress.Mvvm.ISupportParentViewModel", null), getImplementation(SupportServicesImplementation, "DevExpress.Mvvm.ISupportServices", null), dataErrorInfoImplementation, } .AggregateEither(errors => errors.ToImmutableArray(), values => values.ConcatStringsWithNewLines())); }
IEnumerable <CompleterError> GetClassErrors() { if (type.IsSealed) { yield return(CompleterError.CreateForTypeName(type, Messages.POCO_SealedClass.Format(type.Name))); } var iPOCOViewModeType = model.Compilation.GetTypeByMetadataName("DevExpress.Mvvm.POCO.IPOCOViewModel"); if (type.AllInterfaces.Contains(iPOCOViewModeType)) { yield return(CompleterError.CreateForTypeName(type, Messages.POCO_TypeImplementsIPOCOViewModel.Format(type.Name))); } }