public static void Build(OutputModel outputModel, ClassModel?classModel, AttributeData attributeData) { var model = new DbAttributeModel(); if (!attributeData.ConstructorArguments.IsDefaultOrEmpty) { model.Name = attributeData.ConstructorArguments[0].Value as string ?? ""; } foreach (var named in attributeData.NamedArguments) { switch (named.Key) { case "Namespace": model.Namespace = named.Value.Value as string; break; } } if (classModel is null) { outputModel.DbAttributes.Add(model); } else { classModel.DbAttributes.Add(model); } }
static void Initialize(OutputModel outputModel, ClassModel?classModel, OutputPlan outputPlan, DbAttributeModel dbAttribute) { var name = dbAttribute.Name ?? ""; var symbol = classModel?.ClassSymbol as ISymbol ?? outputModel.Compilation.Assembly; if (outputPlan.DatabasePlansByName.TryGetValue(name, out var plan)) { if (dbAttribute.Namespace.NullIfEmpty() is not null && dbAttribute.Namespace != plan.Namespace) { if (plan.IsDefaultNamespace) { plan.IsDefaultNamespace = false; plan.Namespace = dbAttribute.Namespace !; plan.ClassModel = classModel; } else { outputModel.Report(Diagnostics.Errors.DbMultipleNamespace, symbol); } } } else { plan = new DatabasePlan { Namespace = dbAttribute.Namespace.NullIfEmpty() !, Name = name, ClassModel = classModel, DbClassName = name.WithSuffix(Suffixes.Database), PartitionsClassName = name.WithSuffix(Suffixes.Partitions), QueryBuilderClassName = name.WithSuffix(Suffixes.QueryBuilder), QueryBuilderUnionsClassName = name.WithSuffix(Suffixes.QueryBuilderUnions), QueryClassName = name.WithSuffix(Suffixes.Query), QueryUnionsClassName = name.WithSuffix(Suffixes.QueryUnions), ReadClassName = name.WithSuffix(Suffixes.Read), SerializerClassName = name.WithSuffix(Suffixes.Serializer), ConverterClassName = name.WithSuffix(Suffixes.Converter), TypesClassName = name.WithSuffix(Suffixes.Types), BatchHandlersClassName = name.WithSuffix(Suffixes.BatchHandlers), ChangeFeedProcessorClassName = name.WithSuffix(Suffixes.ChangeFeedProcessor) }; plan.BatchHandlersArgumentName = plan.BatchHandlersClassName.ToArgumentName(); plan.IsDefaultNamespace = plan.Namespace is null; plan.Namespace ??= classModel?.ClassSymbol.ContainingNamespace?.ToDisplayString() ?? outputModel.Compilation.Assembly.Name.NullIfEmpty() ?? "Cosmogenesis.Generated"; plan.DbClassNameArgument = plan.DbClassName.ToArgumentName(); plan.QueryBuilderClassNameArgument = plan.QueryBuilderClassName.ToArgumentName(); outputModel.ValidateNames( symbol, plan.Name, plan.DbClassName, plan.PartitionsClassName, plan.QueryBuilderClassName, plan.QueryClassName, plan.ReadClassName, plan.SerializerClassName, plan.ConverterClassName, plan.TypesClassName, plan.BatchHandlersClassName, plan.ChangeFeedProcessorClassName, plan.QueryBuilderUnionsClassName, plan.QueryUnionsClassName); outputModel.ValidateIdentifiers( symbol, plan.BatchHandlersArgumentName, plan.DbClassNameArgument, plan.QueryBuilderClassNameArgument); plan.Namespace.ValidateNamespace(outputModel, symbol); outputPlan.DatabasePlansByName[name] = plan; } if (classModel is not null) { outputPlan.DatabasePlansByClass[classModel].Add(plan); } } }