Esempio n. 1
0
        private bool CheckSubsetNoOrderConstructor(
            ConstructorSetting constructorSetting,
            IMethodSymbol constructor
            )
        {
            if (constructorSetting.ConstructorArgumentsTypes.Count > constructor.Parameters.Length)
            {
                return(false);
            }

            var groups = (
                from cat in constructorSetting.ConstructorArgumentsTypes
                let catn = cat.ToDisplayString()
                           group cat by catn into catg
                           select catg).ToList();

            foreach (var group in groups)
            {
                var needType  = group.First();
                var needCount = group.Count();

                var existsCount = constructor.Parameters
                                  .Where(p => SymbolEqualityComparer.IncludeNullability.Equals(p.Type, needType))
                                  .Count()
                ;

                if (existsCount < needCount)
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 2
0
        private bool CheckSubsetAndOrderConstructor(
            ConstructorSetting constructorSetting,
            IMethodSymbol constructor
            )
        {
            if (constructorSetting.ConstructorArgumentsTypes.Count > constructor.Parameters.Length)
            {
                return(false);
            }

            var startIndex = 0;
            var ps         = constructor.Parameters.ToList();

            foreach (var cat in constructorSetting.ConstructorArgumentsTypes)
            {
                startIndex = ps.FindIndex(startIndex, p => SymbolEqualityComparer.IncludeNullability.Equals(cat, p.Type));
                if (startIndex < 0)
                {
                    return(false);
                }

                startIndex++;
            }

            return(true);
        }
Esempio n. 3
0
        private bool CheckAllAndOrderConstructor(
            ConstructorSetting constructorSetting,
            IMethodSymbol constructor
            )
        {
            if (constructorSetting.ConstructorArgumentsTypes.Count != constructor.Parameters.Length)
            {
                return(false);
            }

            for (var i = 0; i < constructorSetting.ConstructorArgumentsTypes.Count; i++)
            {
                var need   = constructorSetting.ConstructorArgumentsTypes[i];
                var exists = constructor.Parameters[i].Type;

                if (!SymbolEqualityComparer.IncludeNullability.Equals(exists, need))
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 4
0
        private bool CheckConstructor(
            ConstructorSetting constructorSetting,
            IMethodSymbol constructor
            )
        {
            switch (constructorSetting.CheckMode)
            {
            case ConstructorSettingsEnum.AllAndOrder:
                return(CheckAllAndOrderConstructor(constructorSetting, constructor));

            case ConstructorSettingsEnum.SubsetAndOrder:
                return(CheckSubsetAndOrderConstructor(constructorSetting, constructor));

            case ConstructorSettingsEnum.SubsetNoOrder:
                return(CheckSubsetNoOrderConstructor(constructorSetting, constructor));

            default:
                throw new DpdtException(
                          DpdtExceptionTypeEnum.ConstructorArgumentMiss,
                          $@"Unknown constructor settings for {constructor.ContainingType?.ToDisplayString() ?? "<no type>"})"
                          );
            }
        }
Esempio n. 5
0
        public BaseParsedBindExpression(
            BindScopeEnum scope,
            List <Tuple <InvocationExpressionSyntax, IMethodSymbol> > invocationSymbols
            )
        {
            if (invocationSymbols is null)
            {
                throw new ArgumentNullException(nameof(invocationSymbols));
            }

            _scope = scope;

            var settingScopes = new HashSet <string>();

            var setupInvocations = invocationSymbols.FindAll(p => p.Item2.Name == nameof(IConfigureAndConditionalBinding.Setup));

            foreach (var setupInvocation in setupInvocations)
            {
                var settingSymbol = (INamedTypeSymbol)setupInvocation.Item2.TypeArguments.First();

                IDefinedSetting setting;
                if (settingSymbol.BaseType != null && settingSymbol.BaseType.ToDisplayString() == typeof(AllAndOrderConstructorSetting).FullName)
                {
                    var constructorSetting = new ConstructorSetting(ConstructorSettingsEnum.AllAndOrder);
                    constructorSetting.AddRange(
                        settingSymbol.TypeArguments
                        );
                    setting = constructorSetting;
                }
                else if (settingSymbol.BaseType != null && settingSymbol.BaseType.ToDisplayString() == typeof(SubsetAndOrderConstructorSetting).FullName)
                {
                    var constructorSetting = new ConstructorSetting(ConstructorSettingsEnum.SubsetAndOrder);
                    constructorSetting.AddRange(
                        settingSymbol.TypeArguments
                        );
                    setting = constructorSetting;
                }
                else if (settingSymbol.BaseType != null && settingSymbol.BaseType.ToDisplayString() == typeof(SubsetNoOrderConstructorSetting).FullName)
                {
                    var constructorSetting = new ConstructorSetting(ConstructorSettingsEnum.SubsetNoOrder);
                    constructorSetting.AddRange(
                        settingSymbol.TypeArguments
                        );
                    setting = constructorSetting;
                }
                else if (settingSymbol.ToDisplayString() == typeof(PerformCircularCheck).FullName)
                {
                    setting = new CircularSetting(true);
                }
                else if (settingSymbol.ToDisplayString() == typeof(SuppressCircularCheck).FullName)
                {
                    setting = new CircularSetting(false);
                }
                else if (settingSymbol.ToDisplayString() == typeof(AllowedCrossCluster).FullName)
                {
                    setting = new CrossClusterSetting(CrossClusterSettingEnum.AllowedCrossCluster);
                }
                else if (settingSymbol.ToDisplayString() == typeof(MustBeCrossCluster).FullName)
                {
                    setting = new CrossClusterSetting(CrossClusterSettingEnum.MustBeCrossCluster);
                }
                else if (settingSymbol.ToDisplayString() == typeof(OnlyLocalCluster).FullName)
                {
                    setting = new CrossClusterSetting(CrossClusterSettingEnum.OnlyLocal);
                }
                else if (settingSymbol.ToDisplayString() == typeof(NoWrappers).FullName)
                {
                    setting = new WrapperSetting(false);
                }
                else if (settingSymbol.ToDisplayString() == typeof(ProduceWrappers).FullName)
                {
                    setting = new WrapperSetting(true);
                }
                else
                {
                    throw new DpdtException(
                              DpdtExceptionTypeEnum.IncorrectBinding_IncorrectSetting,
                              $"Incorrect setting used [{settingSymbol.ToGlobalDisplayString()}]",
                              settingSymbol.ToGlobalDisplayString()
                              );
                }

                if (settingScopes.Contains(setting.Scope))
                {
                    throw new DpdtException(
                              DpdtExceptionTypeEnum.IncorrectBinding_IncorrectSetting,
                              $"Only one settings of each scope is allowed [{setting.Scope}]",
                              settingSymbol.ToGlobalDisplayString()
                              );
                }
                settingScopes.Add(setting.Scope);


                if (!setting.IsAllowedFor(scope))
                {
                    throw new DpdtException(
                              DpdtExceptionTypeEnum.IncorrectBinding_IncorrectSetting,
                              $"Setting {setting.GetType().Name} is incompatible with scope {scope}"
                              );
                }

                _settings.Add(setting);
            }
        }