Browse Source

Added a new abstract class DeclarationContext that acts as a container for declarations and make Class and Namespace inherit from it.

pull/1/head
triton 12 years ago
parent
commit
e1ac13601c
  1. 42
      src/Bridge/ASTVisitor.cs
  2. 12
      src/Bridge/Class.cs
  3. 3
      src/Bridge/Declaration.cs
  4. 57
      src/Bridge/Namespace.cs
  5. 4
      src/Generator/Passes/CheckAmbiguousOverloads.cs

42
src/Bridge/ASTVisitor.cs

@ -21,12 +21,12 @@ namespace CppSharp
public bool VisitClassFields = true; public bool VisitClassFields = true;
public bool VisitClassProperties = true; public bool VisitClassProperties = true;
public bool VisitClassMethods = true; public bool VisitClassMethods = true;
public bool VisitClassEvents = true;
public bool VisitClassVariables = true;
public bool VisitNamespaceEnums = true; public bool VisitNamespaceEnums = true;
public bool VisitNamespaceTemplates = true; public bool VisitNamespaceTemplates = true;
public bool VisitNamespaceTypedefs = true; public bool VisitNamespaceTypedefs = true;
public bool VisitNamespaceEvents = true;
public bool VisitNamespaceVariables = true;
} }
/// <summary> /// <summary>
@ -211,6 +211,9 @@ namespace CppSharp
if (!VisitDeclaration(@class)) if (!VisitDeclaration(@class))
return false; return false;
if (!VisitDeclarationContext(@class))
return false;
if (Options.VisitClassBases) if (Options.VisitClassBases)
foreach (var baseClass in @class.Bases) foreach (var baseClass in @class.Bases)
if (baseClass.IsClass) if (baseClass.IsClass)
@ -231,14 +234,6 @@ namespace CppSharp
VisitMethodDecl(method); VisitMethodDecl(method);
} }
if (Options.VisitClassEvents)
foreach (var @event in @class.Events)
VisitEvent(@event);
if (Options.VisitClassVariables)
foreach (var variable in @class.Variables)
VisitVariableDecl(variable);
return true; return true;
} }
@ -341,28 +336,41 @@ namespace CppSharp
public virtual bool VisitNamespace(Namespace @namespace) public virtual bool VisitNamespace(Namespace @namespace)
{ {
if (!VisitDeclaration(@namespace)) return VisitDeclarationContext(@namespace);
}
public virtual bool VisitDeclarationContext(DeclarationContext context)
{
if (!VisitDeclaration(context))
return false; return false;
foreach (var decl in @namespace.Classes) foreach (var decl in context.Classes)
decl.Visit(this); decl.Visit(this);
foreach (var decl in @namespace.Functions) foreach (var decl in context.Functions)
decl.Visit(this); decl.Visit(this);
if (Options.VisitNamespaceEnums) if (Options.VisitNamespaceEnums)
foreach (var decl in @namespace.Enums) foreach (var decl in context.Enums)
decl.Visit(this); decl.Visit(this);
if (Options.VisitNamespaceTemplates) if (Options.VisitNamespaceTemplates)
foreach (var decl in @namespace.Templates) foreach (var decl in context.Templates)
decl.Visit(this); decl.Visit(this);
if (Options.VisitNamespaceTypedefs) if (Options.VisitNamespaceTypedefs)
foreach (var decl in @namespace.Typedefs) foreach (var decl in context.Typedefs)
decl.Visit(this);
if (Options.VisitNamespaceVariables)
foreach (var decl in context.Variables)
VisitVariableDecl(decl);
if (Options.VisitNamespaceEvents)
foreach (var decl in context.Events)
decl.Visit(this); decl.Visit(this);
foreach (var decl in @namespace.Namespaces) foreach (var decl in context.Namespaces)
decl.Visit(this); decl.Visit(this);
return true; return true;

12
src/Bridge/Class.cs

@ -80,17 +80,12 @@ namespace CppSharp
} }
// Represents a C++ record Decl. // Represents a C++ record Decl.
public class Class : Declaration public class Class : DeclarationContext
{ {
public List<BaseClassSpecifier> Bases; public List<BaseClassSpecifier> Bases;
public List<Class> NestedClasses;
public List<Enumeration> NestedEnums;
public List<Field> Fields; public List<Field> Fields;
public List<Property> Properties; public List<Property> Properties;
public List<Method> Methods; public List<Method> Methods;
public List<Variable> Variables;
public List<Event> Events;
public List<FunctionTemplate> FunctionTemplates;
// True if the record is a POD (Plain Old Data) type. // True if the record is a POD (Plain Old Data) type.
public bool IsPOD; public bool IsPOD;
@ -116,11 +111,6 @@ namespace CppSharp
Fields = new List<Field>(); Fields = new List<Field>();
Properties = new List<Property>(); Properties = new List<Property>();
Methods = new List<Method>(); Methods = new List<Method>();
Variables = new List<Variable>();
Events = new List<Event>();
NestedClasses = new List<Class>();
NestedEnums = new List<Enumeration>();
FunctionTemplates = new List<FunctionTemplate>();
IsAbstract = false; IsAbstract = false;
IsUnion = false; IsUnion = false;
IsOpaque = false; IsOpaque = false;

3
src/Bridge/Declaration.cs

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using CppSharp;
namespace CppSharp namespace CppSharp
{ {
@ -40,7 +39,7 @@ namespace CppSharp
public abstract class Declaration : INamedDecl public abstract class Declaration : INamedDecl
{ {
// Namespace the declaration is contained in. // Namespace the declaration is contained in.
public Namespace Namespace; public DeclarationContext Namespace;
private string name; private string name;

57
src/Bridge/Namespace.cs

@ -1,14 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
namespace CppSharp namespace CppSharp
{ {
/// <summary> /// <summary>
/// Represents a C++ namespace. /// Represents a declaration context.
/// </summary> /// </summary>
public class Namespace : Declaration public abstract class DeclarationContext : Declaration
{ {
public bool IsAnonymous { get; set; } public bool IsAnonymous { get; set; }
@ -19,6 +18,7 @@ namespace CppSharp
public List<Template> Templates; public List<Template> Templates;
public List<TypedefDecl> Typedefs; public List<TypedefDecl> Typedefs;
public List<Variable> Variables; public List<Variable> Variables;
public List<Event> Events;
public TranslationUnit TranslationUnit public TranslationUnit TranslationUnit
{ {
@ -31,41 +31,16 @@ namespace CppSharp
} }
} }
public override bool IsGenerated protected DeclarationContext()
{
get
{
return !IgnoreFlags.HasFlag(IgnoreFlags.Generation) ||
Namespace.IsGenerated;
}
}
public override bool IsProcessed
{
get
{
return !IgnoreFlags.HasFlag(IgnoreFlags.Processing) ||
Namespace.IsProcessed;
}
}
public Namespace()
: this(null, String.Empty)
{
}
public Namespace(Namespace parent, string name, bool isAnonymous = false)
{ {
Name = name;
Namespace = parent;
IsAnonymous = isAnonymous;
Namespaces = new List<Namespace>(); Namespaces = new List<Namespace>();
Enums = new List<Enumeration>(); Enums = new List<Enumeration>();
Functions = new List<Function>(); Functions = new List<Function>();
Classes = new List<Class>(); Classes = new List<Class>();
Templates = new List<Template>(); Templates = new List<Template>();
Typedefs = new List<TypedefDecl>(); Typedefs = new List<TypedefDecl>();
Variables = new List<Variable>();
Events = new List<Event>();
} }
public Namespace FindNamespace(string name) public Namespace FindNamespace(string name)
@ -78,7 +53,7 @@ namespace CppSharp
public Namespace FindNamespace(string[] namespaces) public Namespace FindNamespace(string[] namespaces)
{ {
Namespace currentNamespace = this; DeclarationContext currentNamespace = this;
foreach (var @namespace in namespaces) foreach (var @namespace in namespaces)
{ {
@ -91,17 +66,21 @@ namespace CppSharp
currentNamespace = childNamespace; currentNamespace = childNamespace;
} }
return currentNamespace; return currentNamespace as Namespace;
} }
public Namespace FindCreateNamespace(string name)
public Namespace FindCreateNamespace(string name, Namespace parent)
{ {
var @namespace = FindNamespace(name); var @namespace = FindNamespace(name);
if (@namespace == null) if (@namespace == null)
{ {
@namespace = new Namespace(parent, name); @namespace = new Namespace
{
Name = name,
Namespace = this,
};
Namespaces.Add(@namespace); Namespaces.Add(@namespace);
} }
@ -249,7 +228,13 @@ namespace CppSharp
} }
public bool IsRoot { get { return Namespace == null; } } public bool IsRoot { get { return Namespace == null; } }
}
/// <summary>
/// Represents a C++ namespace.
/// </summary>
public class Namespace : DeclarationContext
{
public override T Visit<T>(IDeclVisitor<T> visitor) public override T Visit<T>(IDeclVisitor<T> visitor)
{ {
return visitor.VisitNamespace(this); return visitor.VisitNamespace(this);

4
src/Generator/Passes/CheckAmbiguousOverloads.cs

@ -65,12 +65,12 @@ namespace CppSharp.Passes
Options.VisitNamespaceEnums = false; Options.VisitNamespaceEnums = false;
Options.VisitNamespaceTemplates = false; Options.VisitNamespaceTemplates = false;
Options.VisitNamespaceTypedefs = false; Options.VisitNamespaceTypedefs = false;
Options.VisitNamespaceEvents = false;
Options.VisitNamespaceVariables = false;
Options.VisitClassBases = false; Options.VisitClassBases = false;
Options.VisitClassFields = false; Options.VisitClassFields = false;
Options.VisitClassProperties = false; Options.VisitClassProperties = false;
Options.VisitClassEvents = false;
Options.VisitClassVariables = false;
} }
public override bool VisitClassDecl(Class @class) public override bool VisitClassDecl(Class @class)

Loading…
Cancel
Save