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);
        }
    }
Beispiel #2
0
    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);
        }
    }
}