private PropertyDeclarationSyntax CreateStringProperty(string propertyIdentifierName, string targetFieldName, string startType, SyntaxList<MemberDeclarationSyntax> syntaxList, DynamicPlugin dp) { List<string> path = dp.FindStringPath(targetFieldName, startType); string name = ""; if (path.Count == 1) { name = path.First(); } else if (path.Count > 1) { foreach (string obj in path.Skip(1).Take(path.Count - 1)) { string val = ""; foreach (ClassDeclarationSyntax classes in syntaxList.Where(m => m is ClassDeclarationSyntax)) { foreach (PropertyDeclarationSyntax prop in classes.Members.Where(m => m is PropertyDeclarationSyntax)) { if (prop.Type.ToString().Contains(obj + "[]")) { val = prop.Identifier.ToString(); break; } } if (val != "") break; } if (val != "") name += val + "[0]."; } name += path.Last(); } ExpressionSyntax expr; if (name != "") expr = Syntax.MemberAccessExpression(SyntaxKind.MemberAccessExpression, Syntax.ThisExpression(), Syntax.IdentifierName(name)); else expr = Syntax.BaseExpression(Syntax.Token(SyntaxKind.NullKeyword)); ReturnStatementSyntax rs = Syntax.ReturnStatement(expr); SyntaxList<ReturnStatementSyntax> list = Syntax.List(rs); BlockSyntax block = Syntax.Block(list); AccessorDeclarationSyntax acc = Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, block); PropertyDeclarationSyntax pd2 = Syntax.PropertyDeclaration(null, Syntax.TokenList(new SyntaxToken[] { Syntax.Token(SyntaxKind.PublicKeyword), Syntax.Token(SyntaxKind.OverrideKeyword) }), Syntax.ParseTypeName("string"), null, Syntax.Identifier(propertyIdentifierName), Syntax.AccessorList(Syntax.List(acc))); return pd2; }
private void RecurseStructure(ref StringBuilder sb, DynamicPlugin dp, string tabs) { //print current level if (dp.parent != null) sb.AppendLine(tabs + dp.name.Replace(dp.parent.name, "")); else sb.AppendLine(tabs + dp.name); //indent subfields tabs = tabs + "\t"; if (dp.stringFields.Count > 0) { foreach (string stringField in dp.stringFields) { sb.AppendLine(tabs + stringField); } } if (dp.nestedObjects.Count > 0) { foreach (DynamicPlugin dyn in dp.nestedObjects) { RecurseStructure(ref sb, dyn, tabs); } } }
private DynamicPlugin CreateDynamicPluginObject(string csFile) { bool debugging = true; SyntaxTree tr = SyntaxTree.ParseFile(csFile); StringBuilder sb = new StringBuilder(); DynamicPlugin plugin = new DynamicPlugin(((ClassDeclarationSyntax)tr.GetRoot().Members.First(m => m is ClassDeclarationSyntax)).Identifier.ToString()); int count = 0; foreach (ClassDeclarationSyntax classes in tr.GetRoot().Members.Where(m => m is ClassDeclarationSyntax)) { if (classes.Identifier.ToString() == "NewDataSet") continue; DynamicPlugin p = null; if (count != 0) { p = plugin.ObjectExists(classes.Identifier.ToString()); } else { p = plugin; count++; } if (debugging) sb.AppendLine(classes.Identifier.ToString()); foreach (FieldDeclarationSyntax field in classes.Members.Where(cl => cl is FieldDeclarationSyntax)) { if (field.ToString().Contains(" string ")) { //gets the semicolon token, then the actual identifier string fieldName = field.GetLastToken().GetPreviousToken().ToString().Replace("Field", ""); p.AddStringField(fieldName); if (debugging) sb.AppendLine(fieldName); } else { string typeName = field.Declaration.Type.ToString().Replace("[]", ""); p.AddObject(typeName); if (debugging) sb.AppendLine(typeName); } } } if (debugging) { sb.AppendLine(plugin.PrintStructure()); string text = sb.ToString(); //output here System.IO.FileStream output = System.IO.File.Create(Path.GetDirectoryName(csFile) + "\\test.txt"); byte[] bytes = UTF8Encoding.UTF8.GetBytes(text); output.Write(bytes, 0, bytes.Length); output.Close(); } return plugin; }