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