示例#1
0
        private string ProcessClass(INamedTypeSymbol classSymbol, string PK1, string PK2, string post)
        {
            if (!classSymbol.ContainingSymbol.Equals(classSymbol.ContainingNamespace, SymbolEqualityComparer.Default))
            {
                context.ReportDiagnostic(DoDiagnostic(DiagnosticSeverity.Warning, $"class {classSymbol.Name} is in other namespace; please put directly "));
                return(null);
            }
            var interfaces = classSymbol.Interfaces;

            string namespaceName = classSymbol.ContainingNamespace.ToDisplayString();
            var    cd            = new ClassRepositoryDefinition();

            //cd.POCOName = pocoName;
            foreach (var item in interfaces)
            {
                if (!item.IsGenericType)
                {
                    continue;
                }

                //very particular IRepository<dboDepartment,Int64>
                var ta         = item.TypeArguments;
                var argsLength = ta.Length;
                var poco       = ta.First();
                cd.POCOFullName = poco.Name;
                cd.POCOName     = poco.Name;
                if (!string.IsNullOrWhiteSpace(poco.ContainingNamespace?.Name))
                {
                    cd.POCOFullName = poco.ContainingNamespace.Name + "." + poco.Name;
                }

                cd.POCOProperties = FindProperties(poco);
                //work here for 0 or 2 PK
                if (!string.IsNullOrWhiteSpace(PK1) && argsLength > 1)
                {
                    var PKType = ta[1];
                    cd.PK1Type = PKType.Name;
                    if (!string.IsNullOrWhiteSpace(PK2) && argsLength > 2)
                    {
                        PKType     = ta[2];
                        cd.PK2Type = PKType.Name;
                    }
                }
            }
            //cd.POCOFullName = pocoName;
            //if (pocoName.Contains("."))
            //{
            //    cd.POCOName = cd.POCOName.Split('.').Last();
            //}
            cd.PK1 = PK1;
            cd.PK2 = PK2;

            cd.Original      = classSymbol;
            cd.NamespaceName = namespaceName;
            cd.ClassName     = classSymbol.Name;
            var m = FindMethods(classSymbol);

            cd.Methods = m;
            var p = FindProperties(classSymbol);

            cd.Properties = p;
            var template = Scriban.Template.Parse(post);
            var output   = template.Render(cd, member => member.Name);

            return(output);
        }