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); }
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); }
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()); }