mirror of https://github.com/mono/CppSharp.git
1 changed files with 212 additions and 0 deletions
@ -0,0 +1,212 @@ |
|||||||
|
#if !OLD_PARSER
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Linq; |
||||||
|
using CppSharp.Parser.AST; |
||||||
|
|
||||||
|
namespace CppSharp |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// This class converts from the C++ parser AST bindings to the
|
||||||
|
/// AST defined in C#.
|
||||||
|
/// </summary>
|
||||||
|
public class ASTConverter |
||||||
|
{ |
||||||
|
ASTContext Context { get; set; } |
||||||
|
|
||||||
|
public ASTConverter(ASTContext context) |
||||||
|
{ |
||||||
|
Context = context; |
||||||
|
} |
||||||
|
|
||||||
|
public AST.ASTContext Convert() |
||||||
|
{ |
||||||
|
var _ctx = new AST.ASTContext(); |
||||||
|
|
||||||
|
for (uint i = 0; i < Context.TranslationUnitsCount; ++i) |
||||||
|
{ |
||||||
|
var unit = Context.getTranslationUnits(i); |
||||||
|
_ctx.TranslationUnits.Add(VisitTranslationUnit(unit)); |
||||||
|
} |
||||||
|
|
||||||
|
return _ctx; |
||||||
|
} |
||||||
|
|
||||||
|
#region Declarations
|
||||||
|
|
||||||
|
AST.TranslationUnit VisitTranslationUnit(TranslationUnit unit) |
||||||
|
{ |
||||||
|
var _unit = new AST.TranslationUnit { FilePath = unit.FileName }; |
||||||
|
VisitDeclaration(unit, _unit); |
||||||
|
VisitDeclContext(unit, _unit); |
||||||
|
|
||||||
|
return _unit; |
||||||
|
} |
||||||
|
|
||||||
|
AST.Namespace VisitNamespace(Namespace @namespace) |
||||||
|
{ |
||||||
|
var _namespace = new AST.Namespace(); |
||||||
|
VisitDeclaration(@namespace, _namespace); |
||||||
|
VisitDeclContext(@namespace, _namespace); |
||||||
|
|
||||||
|
return _namespace; |
||||||
|
} |
||||||
|
|
||||||
|
void VisitDeclContext(DeclarationContext ctx, AST.DeclarationContext _ctx) |
||||||
|
{ |
||||||
|
for (uint i = 0; i < ctx.NamespacesCount; ++i) |
||||||
|
{ |
||||||
|
var childNamespace = ctx.getNamespaces(i); |
||||||
|
var _childNamespace = VisitNamespace(childNamespace); |
||||||
|
_ctx.Namespaces.Add(_childNamespace); |
||||||
|
} |
||||||
|
|
||||||
|
for (uint i = 0; i < ctx.ClassesCount; ++i) |
||||||
|
{ |
||||||
|
var @class = ctx.getClasses(i); |
||||||
|
var _class = VisitClass(@class); |
||||||
|
_ctx.Classes.Add(_class); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
AST.Class VisitClass(Parser.AST.Class @class) |
||||||
|
{ |
||||||
|
var _class = new AST.Class(); |
||||||
|
VisitDeclaration(@class, _class); |
||||||
|
|
||||||
|
for (uint i = 0; i < @class.BasesCount; ++i) |
||||||
|
{ |
||||||
|
var @base = @class.getBases(i); |
||||||
|
var _base = VisitBaseClassSpecifier(@base); |
||||||
|
_class.Classes.Add(_class); |
||||||
|
} |
||||||
|
|
||||||
|
for (uint i = 0; i < @class.FieldsCount; ++i) |
||||||
|
{ |
||||||
|
var field = @class.getFields(i); |
||||||
|
var _field = VisitField(field); |
||||||
|
_class.Fields.Add(_field); |
||||||
|
} |
||||||
|
|
||||||
|
for (uint i = 0; i < @class.MethodsCount; ++i) |
||||||
|
{ |
||||||
|
var method = @class.getMethods(i); |
||||||
|
var _method = VisitMethod(method); |
||||||
|
_class.Methods.Add(_method); |
||||||
|
} |
||||||
|
|
||||||
|
for (uint i = 0; i < @class.SpecifiersCount; ++i) |
||||||
|
{ |
||||||
|
var spec = @class.getSpecifiers(i); |
||||||
|
var _spec = VisitAccessSpecifierDecl(spec); |
||||||
|
_class.Specifiers.Add(_spec); |
||||||
|
} |
||||||
|
|
||||||
|
_class.IsPOD = @class.IsPOD; |
||||||
|
_class.IsAbstract = @class.IsAbstract; |
||||||
|
_class.IsUnion = @class.IsUnion; |
||||||
|
_class.IsDynamic = @class.IsDynamic; |
||||||
|
_class.IsPolymorphic = @class.IsPolymorphic; |
||||||
|
_class.HasNonTrivialDefaultConstructor = @class.HasNonTrivialDefaultConstructor; |
||||||
|
_class.HasNonTrivialCopyConstructor = @class.HasNonTrivialCopyConstructor; |
||||||
|
|
||||||
|
_class.Layout = VisitClassLayout(@class.Layout); |
||||||
|
|
||||||
|
return _class; |
||||||
|
} |
||||||
|
|
||||||
|
AST.ClassLayout VisitClassLayout(Parser.AST.ClassLayout layout) |
||||||
|
{ |
||||||
|
var _layout = new AST.ClassLayout(); |
||||||
|
|
||||||
|
return _layout; |
||||||
|
} |
||||||
|
|
||||||
|
AST.Method VisitMethod(Parser.AST.Method method) |
||||||
|
{ |
||||||
|
var _method = new AST.Method(); |
||||||
|
VisitDeclaration(method, _method); |
||||||
|
|
||||||
|
return _method; |
||||||
|
} |
||||||
|
|
||||||
|
AST.Field VisitField(Parser.AST.Field field) |
||||||
|
{ |
||||||
|
var _field = new AST.Field(); |
||||||
|
VisitDeclaration(field, _field); |
||||||
|
|
||||||
|
return _field; |
||||||
|
} |
||||||
|
|
||||||
|
void VisitDeclaration(Declaration decl, AST.Declaration _decl) |
||||||
|
{ |
||||||
|
_decl.Access = VisitAccessSpecifier(decl.Access); |
||||||
|
_decl.Name = decl.Name; |
||||||
|
_decl.DebugText = decl.DebugText; |
||||||
|
_decl.IsIncomplete = decl.IsIncomplete; |
||||||
|
_decl.IsDependent = decl.IsDependent; |
||||||
|
_decl.DefinitionOrder = decl.DefinitionOrder; |
||||||
|
|
||||||
|
for (uint i = 0; i < decl.PreprocessedEntitiesCount; ++i) |
||||||
|
{ |
||||||
|
var entity = decl.getPreprocessedEntities(i); |
||||||
|
var _entity = VisitPreprocessedEntity(entity); |
||||||
|
_decl.PreprocessedEntities.Add(_entity); |
||||||
|
} |
||||||
|
|
||||||
|
_decl.OriginalPtr = decl.OriginalPtr; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
AST.PreprocessedEntity VisitPreprocessedEntity(Parser.AST.PreprocessedEntity entity) |
||||||
|
{ |
||||||
|
var _entity = new AST.MacroDefinition(); |
||||||
|
VisitDeclaration(entity, _entity); |
||||||
|
|
||||||
|
return _entity; |
||||||
|
} |
||||||
|
|
||||||
|
AST.BaseClassSpecifier VisitBaseClassSpecifier(BaseClassSpecifier @base) |
||||||
|
{ |
||||||
|
var _base = new AST.BaseClassSpecifier |
||||||
|
{ |
||||||
|
IsVirtual = @base.IsVirtual, |
||||||
|
Access = VisitAccessSpecifier(@base.Access) |
||||||
|
}; |
||||||
|
|
||||||
|
return _base; |
||||||
|
} |
||||||
|
|
||||||
|
AST.AccessSpecifierDecl VisitAccessSpecifierDecl(Parser.AST.AccessSpecifierDecl access) |
||||||
|
{ |
||||||
|
var _access = new AST.AccessSpecifierDecl(); |
||||||
|
VisitDeclaration(access, _access); |
||||||
|
|
||||||
|
return _access; |
||||||
|
} |
||||||
|
|
||||||
|
AST.AccessSpecifier VisitAccessSpecifier(Parser.AST.AccessSpecifier access) |
||||||
|
{ |
||||||
|
switch (access) |
||||||
|
{ |
||||||
|
case Parser.AST.AccessSpecifier.Private: |
||||||
|
return AST.AccessSpecifier.Private; |
||||||
|
case Parser.AST.AccessSpecifier.Protected: |
||||||
|
return AST.AccessSpecifier.Protected; |
||||||
|
case Parser.AST.AccessSpecifier.Public: |
||||||
|
return AST.AccessSpecifier.Public; |
||||||
|
} |
||||||
|
|
||||||
|
throw new ArgumentOutOfRangeException(); |
||||||
|
} |
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Types
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in new issue