using System; using System.Collections.Generic; using System.Linq; using CppSharp; using CppSharp.AST; using CppSharp.AST.Extensions; using CppSharp.Passes; namespace Test.Passes { /// /// All nested classses set unnested. /// public class SetNestedClassesNotNested : TranslationUnitPass { private List nestedClassesToMove; public SetNestedClassesNotNested() => VisitOptions.ResetFlags(VisitFlags.ClassProperties); public override bool VisitClassDecl(Class @class) { if (!(@class.Namespace is Namespace)) nestedClassesToMove.Add(@class); return base.VisitClassDecl(@class); } public override bool VisitTranslationUnit(TranslationUnit unit) { nestedClassesToMove = new List(); if (!base.VisitTranslationUnit(unit)) return false; foreach (var @class in nestedClassesToMove) { Diagnostics.Message($"Nested class moved to base location. {@class.GetType().Name}, {@class.TranslationUnit?.FileName}, {@class.QualifiedOriginalName}."); var parent = @class.Namespace; @class.Namespace = GetNamespace(@class); @class.Namespace.Declarations.Add(@class); parent.Declarations.Remove(@class); } return true; } private Namespace GetNamespace(Declaration declaration) { var @namespace = declaration.Namespace; while (!(@namespace is Namespace)) { @namespace = @namespace.Namespace; if (@namespace == null) return null; } return (Namespace)@namespace; } } }