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