Trouver toutes les classes n’héritant pas de classes C # avec Roslyn et passer à l’inheritance d’un object de base (de type java)

Je travaille sur un petit projet Roslyn qui inclut la modification de l’arborescence d’parsing syntaxique et l’écriture de modifications dans le fichier. J’ai commencé avec l’parsingur de code autonome et je souhaite le construire en tant qu’application en ligne de commande. J’ai cependant rencontré un défi. Utilisation de: Rechercher des classes qui dérivent partiellement d’une classe de base spécifique avec Roslyn et principalement avec: https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Analysis J’ai créé ce petit projet:

class Program { static void Main(ssortingng[] args) { try { if (args.Length < 1) throw new ArgumentException(); SyntaxTree tree = CSharpSyntaxTree.ParseText(File.ReadAllText(args[0])); var root = (CompilationUnitSyntax) tree.GetRoot(); var classes = from ClassDeclarationSyntax in root.DescendantNodesAndSelf() select ClassDeclarationSyntax; foreach (var c in classes) { if (/*Not inheriting*/) { /*Add inherition*/ } } /*Write changes to file*/ } catch (Exception e) { Console.WriteLine("Fatal error ocured."); Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } } } 

En tant que commentaires dans les états de code, je dois vérifier si la classe hérite de quelque chose ou non (et choisir la deuxième option), puis modifier l’arbre d’parsing et enfin l’écrire dans un fichier. Pour l’instant, je serais heureux de savoir comment cocher “non “inheritance” seulement, bien que toutes les instructions pour les étapes deux et trois soient également les bienvenues. Le fichier à parsingr et à modifier est fourni par chemin comme paramètre de programme ici:

 if (args.Length < 1) throw new ArgumentException(); SyntaxTree tree = CSharpSyntaxTree.ParseText(File.ReadAllText(args[0])); 

SOLUTION
Avec le soutien des réponses reçues, je suis venu avec l’application de travail. Voici mon code, peut-être pas parfait mais fonctionnel

 class Program { static void Main(ssortingng[] args) { try { if (args.Length < 1) throw new ArgumentException(); SyntaxTree tree = CSharpSyntaxTree.ParseText(File.ReadAllText(args[0])); var root = (CompilationUnitSyntax) tree.GetRoot(); IdentifierNameSyntax iname = SyntaxFactory.IdentifierName("Object"); BaseTypeSyntax bts = SyntaxFactory.SimpleBaseType(iname); SeparatedSyntaxList ssl = new SeparatedSyntaxList(); ssl = ssl.Add(bts); BaseListSyntax bls = SyntaxFactory.BaseList(ssl); bool x = true; while(x) //Way to handle all nodes due to impossibility to handle more than one in foreach { foreach (var c in root.DescendantNodesAndSelf()) { x = false; var classDeclaration = c as ClassDeclarationSyntax; if (classDeclaration == null) continue; if (classDeclaration.BaseList != null) //Inherits continue; else //Not inherits { root = root.ReplaceNode(classDeclaration, classDeclaration.WithBaseList(bls)); x = true; break; } } } if (args.Length > 1) //Write to given file using (var sw = new StreamWriter(File.Open(args[1], FileMode.Open))) { root.WriteTo(sw); } else //Overwrite source using (var sw = new StreamWriter(File.Open(args[0], FileMode.Open))) { root.WriteTo(sw); } } catch (Exception e) { Console.WriteLine("Fatal error ocured."); Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } } } 

ClassDeclarationSyntax a BaseList qui contient Types . Pour que vous puissiez récupérer des informations sur les classes de base, utilisez ces champs:

  foreach (var c in correctRoot.DescendantNodesAndSelf()) { var classDeclaration = c as ClassDeclarationSyntax; if (classDeclaration == null) { continue; } if (classDeclaration.BaseList?.Types.Count > 0) { Console.WriteLine("This class has base class or it implements interfaces"); } else { /*Add inherition*/ } } 

Malheureusement, vous avez besoin de davantage de logique pour distinguer le fait que votre classe a une classe de base ou qu’elle implémente simplement des interfaces. Si vous souhaitez résoudre ce problème, vous devez parsingr l’ object de base (classe / interface) à l’aide d’un semantical model pour obtenir des informations sur ISymbol correspondant ou essayer de trouver la déclaration de ces nœuds dans l’ syntax tree la syntax tree , si cette déclaration est définie dans vos projets / solutions.

De même, si vous souhaitez append une inheritance à une classe, vous devez définir dans BaseList un nouveau nœud créé à l’aide de SyntaxFactory.SimpleBaseType(...) et de SyntaxFactory.BaseList(...)