Пример #1
0
        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()));
        }
Пример #2
0
        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)));
            }
        }