private static IEnumerable <CdPath> ExploreTableDescriptors(this IEnumerable <SyntaxTree> fileNodes)
        {
            foreach (var nodePath in fileNodes)
            {
                var classes = nodePath.GetRoot()
                              .DescendantNodesAndSelf()
                              .OfType <ClassDeclarationSyntax>()
                              .Select(cd => (Class: cd, BaseTypeKind: SyntaxHelpers.GetTableClassKind(cd)))
                              .Where(p => p.BaseTypeKind != null);

                foreach (var tuple in classes)
                {
                    ConstructorInitializerSyntax?baseConstCall = tuple.Class
                                                                 .DescendantNodes()
                                                                 .OfType <ConstructorInitializerSyntax>()
                                                                 .FirstOrDefault(c =>
                                                                                 c.Kind() == SyntaxKind.BaseConstructorInitializer);

                    BaseTypeKindTag baseTypeKindTag = tuple.BaseTypeKind !.Value;

                    if (baseTypeKindTag == BaseTypeKindTag.DerivedTableBase)
                    {
                        yield return(new CdPath(tuple.Class, baseTypeKindTag, null));
                    }
                    else if (baseConstCall != null)
                    {
                        string schema;
                        string tableName;

                        if (baseTypeKindTag == BaseTypeKindTag.TableBase)
                        {
                            if (baseConstCall.ArgumentList.Arguments.Count != 3)
                            {
                                continue;
                            }

                            if (baseConstCall.ArgumentList.Arguments[0].Expression is LiteralExpressionSyntax slSh &&
                                slSh.Kind() == SyntaxKind.StringLiteralExpression)
                            {
                                schema = slSh.Token.ValueText;
                            }
                            else
                            {
                                continue;
                            }

                            if (baseConstCall.ArgumentList.Arguments[1].Expression is LiteralExpressionSyntax slDb &&
                                slDb.Kind() == SyntaxKind.StringLiteralExpression)
                            {
                                tableName = slDb.Token.ValueText;
                            }
                            else
                            {
                                continue;
                            }
                        }
Exemple #2
0
        public static IEnumerable <SqModelMetaRaw> ParseAttribute(this IEnumerable <AttributeSyntax> attributes, bool nullRefTypes)
        {
            foreach (var attribute in attributes)
            {
                var propertySyntax = attribute.FindParentOrDefault <PropertyDeclarationSyntax>() !;

                var classSyntax = propertySyntax.FindParentOrDefault <ClassDeclarationSyntax>() !;

                var baseTypeKindTag = SyntaxHelpers.GetTableClassKind(classSyntax)
                                      ?? throw new SqExpressCodeGenException($"Unknown base class in '{classSyntax.Identifier.ValueText}'");

                var namespaceSyntax = classSyntax.FindParentOrDefault <NamespaceDeclarationSyntax>() !;

                var tableNamespace = namespaceSyntax?.Name.ToString() ?? string.Empty;

                var tableName = classSyntax.Identifier.ValueText;

                var columnName = propertySyntax.Identifier.ValueText;

                var identity = AnalyzeColumnMetadata(classSyntax: classSyntax, columnName: columnName);

                var modelName = (attribute.ArgumentList?.Arguments.FirstOrDefault()?.Expression as LiteralExpressionSyntax)?.Token.ValueText
                                ?? throw new SqExpressCodeGenException($"Could not find {nameof(SqModelAttribute)} name parameter");

                var modelPropertyName =
                    GetAttributeProperty <LiteralExpressionSyntax>(attribute, nameof(SqModelAttribute.PropertyName))
                    ?.Token.ValueText ??
                    columnName;

                var castType =
                    GetAttributeProperty <TypeOfExpressionSyntax>(attribute, nameof(SqModelAttribute.CastType))
                    ?.Type.ToString();

                var clrType = ColumnPropertyTypeParser.Parse(
                    propertySyntax.Type.ToString(),
                    ModelColumnClrTypeGenerator.Instance,
                    nullRefTypes);

                yield return(new SqModelMetaRaw(
                                 modelName: modelName,
                                 fieldName: modelPropertyName,
                                 fieldTypeName: clrType,
                                 castTypeName: castType,
                                 tableNamespace: tableNamespace,
                                 tableName: tableName,
                                 columnName: columnName,
                                 isPrimaryKey: identity.Pk,
                                 isIdentity: identity.Idendity,
                                 baseTypeKindTag: baseTypeKindTag));
            }