public List <Type> ValidConceptsForParent(Type parentConceptInfoType)
        {
            var result = new List <Type>();

            foreach (var conceptType in rhetosAppContext.ConceptInfoTypes)
            {
                if (conceptType == parentConceptInfoType)
                {
                    continue;
                }

                var members            = ConceptMembers.Get(conceptType);
                var parentNestedMember = members.FirstOrDefault(member => member.IsParentNested);
                var firstMember        = members.FirstOrDefault();

                // is first member valid?
                if (firstMember == null || !firstMember.IsKey || !firstMember.IsConceptInfo)
                {
                    firstMember = null;
                }

                var parentMember = parentNestedMember ?? firstMember;
                if (parentMember == null)
                {
                    continue;
                }

                if (parentMember.ValueType.IsAssignableFrom(parentConceptInfoType))
                {
                    result.Add(conceptType);
                }
            }

            return(result);
        }
Beispiel #2
0
        public static ConceptSyntaxNode CreateConceptSyntaxNode(this DslSyntax dslSyntax, IConceptInfo ci)
        {
            var conceptInfoType = ci.GetType();
            var node            = new ConceptSyntaxNode(dslSyntax.GetConceptType(conceptInfoType));
            var members         = ConceptMembers.Get(conceptInfoType);

            if (node.Parameters.Length != members.Length)
            {
                throw new InvalidOperationException(
                          $"{nameof(ConceptSyntaxNode)} parameters count ({node.Parameters.Length})" +
                          $" does not match {nameof(ConceptMembers)} count ({members.Length}).");
            }

            for (int m = 0; m < members.Length; m++)
            {
                object value = members[m].GetValue(ci);

                node.Parameters[m] = value;

                if (value == null)
                {
                    node.Parameters[m] = null;
                }
                else if (value is string)
                {
                    node.Parameters[m] = value;
                }
                else if (value is IConceptInfo referencedConceptInfo)
                {
                    var referencedNode = CreateConceptSyntaxNode(dslSyntax, referencedConceptInfo);
                    node.Parameters[m] = referencedNode;
                }
                else
                {
                    var valueType = value?.GetType().Name ?? "null";
                    throw new ArgumentException($"Value type {valueType} is not expected in '{ci.GetUserDescription()}', parameter {members[m].Name}.");
                }
            }

            return(node);
        }
Beispiel #3
0
        public static IEnumerable <Type> GetAllRelatedConceptInfoTypes(params Type[] conceptInfoTypes)
        {
            var types = new HashSet <Type>(conceptInfoTypes);
            var addReferencedTypes = new HashSet <Type>(conceptInfoTypes);

            while (addReferencedTypes.Any())
            {
                var newTypes = new HashSet <Type>();

                foreach (Type type in addReferencedTypes)
                {
                    foreach (var member in ConceptMembers.Get(type))
                    {
                        if (member.IsConceptInfo && !member.IsConceptInfoInterface)
                        {
                            if (!types.Contains(member.ValueType))
                            {
                                types.Add(member.ValueType);
                                newTypes.Add(member.ValueType);
                            }
                        }
                    }
                }

                addReferencedTypes = newTypes;
            }

            foreach (var type in types.ToList()) // Creating a copy to allow modification within the loop.
            {
                foreach (var baseType in DslSyntaxFromPlugins.GetBaseConceptInfoTypes(type))
                {
                    types.Add(baseType);
                }
            }

            return(types.ToArray());
        }
 public static List <ConceptMember> GetParameters(Type conceptInfoType)
 {
     return(ConceptMembers.Get(conceptInfoType)
            .Where(member => member.IsParsable)
            .ToList());
 }