Browse Source

Generated all internals of all (including ignored) classes and all of their fields in order to properly store objects in managed code.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/188/merge
Dimitar Dobrev 12 years ago committed by triton
parent
commit
11ef53df10
  1. 2
      src/AST/Namespace.cs
  2. 77
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 7
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  4. 2
      src/Generator/Passes/MultipleInheritancePass.cs
  5. 6
      tests/Basic/Basic.h

2
src/AST/Namespace.cs

@ -291,7 +291,7 @@ namespace CppSharp.AST
{ {
Predicate<Declaration> pred = (t => !t.Ignore); Predicate<Declaration> pred = (t => !t.Ignore);
return Enums.Exists(pred) || HasFunctions || Typedefs.Exists(pred) return Enums.Exists(pred) || HasFunctions || Typedefs.Exists(pred)
|| Classes.Exists(pred) || Namespaces.Exists(n => n.HasDeclarations); || Classes.Any() || Namespaces.Exists(n => n.HasDeclarations);
} }
} }

77
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -215,18 +215,13 @@ namespace CppSharp.Generators.CSharp
// Generate all the typedef declarations. // Generate all the typedef declarations.
foreach (var typedef in context.Typedefs) foreach (var typedef in context.Typedefs)
{ {
if (typedef.Ignore) continue;
GenerateTypedef(typedef); GenerateTypedef(typedef);
} }
// Generate all the struct/class declarations. // Generate all the struct/class declarations.
foreach (var @class in context.Classes) foreach (var @class in context.Classes)
{ {
if (@class.Ignore || @class.IsIncomplete) if (@class.IsIncomplete)
continue;
if (@class.IsDependent)
continue; continue;
if (@class.IsInterface) if (@class.IsInterface)
@ -341,7 +336,9 @@ namespace CppSharp.Generators.CSharp
public void GenerateClass(Class @class) public void GenerateClass(Class @class)
{ {
if (@class.Ignore || @class.IsIncomplete) TypeMap typeMap;
if (@class.IsIncomplete ||
(Driver.TypeDatabase.FindTypeMap(@class, out typeMap) && typeMap.DoesMarshalling))
return; return;
PushBlock(CSharpBlockKind.Class); PushBlock(CSharpBlockKind.Class);
@ -355,9 +352,11 @@ namespace CppSharp.Generators.CSharp
if (!@class.IsOpaque) if (!@class.IsOpaque)
{ {
GenerateClassInternals(@class); GenerateClassInternals(@class);
GenerateDeclContext(@class); GenerateDeclContext(@class);
if (@class.Ignore || @class.IsDependent)
goto exit;
if (ShouldGenerateClassNativeField(@class)) if (ShouldGenerateClassNativeField(@class))
{ {
PushBlock(CSharpBlockKind.Field); PushBlock(CSharpBlockKind.Field);
@ -383,7 +382,7 @@ namespace CppSharp.Generators.CSharp
if (Options.GenerateVirtualTables && @class.IsDynamic) if (Options.GenerateVirtualTables && @class.IsDynamic)
GenerateVTable(@class); GenerateVTable(@class);
} }
exit:
WriteCloseBraceIndent(); WriteCloseBraceIndent();
PopBlock(NewLineKind.BeforeNextBlock); PopBlock(NewLineKind.BeforeNextBlock);
} }
@ -466,24 +465,6 @@ namespace CppSharp.Generators.CSharp
} }
} }
public void GenerateClassInternalsFields(Class @class)
{
if (@class.IsValueType)
{
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore))
{
GenerateClassInternalsFields(@base.Class);
}
}
GenerateClassFields(@class, GenerateClassInternalsField);
foreach (var prop in @class.Properties.Where(p => !p.Ignore && p.Field != null))
{
GenerateClassInternalsField(prop.Field);
}
}
public void GenerateClassInternals(Class @class) public void GenerateClassInternals(Class @class)
{ {
PushBlock(CSharpBlockKind.InternalsClass); PushBlock(CSharpBlockKind.InternalsClass);
@ -496,8 +477,9 @@ namespace CppSharp.Generators.CSharp
var typePrinter = TypePrinter; var typePrinter = TypePrinter;
typePrinter.PushContext(CSharpTypePrinterContextKind.Native); typePrinter.PushContext(CSharpTypePrinterContextKind.Native);
GenerateClassInternalsFields(@class); GenerateClassFields(@class, GenerateClassInternalsField, true);
GenerateVTablePointers(@class); if (Options.GenerateVirtualTables && @class.IsDynamic)
GenerateVTablePointers(@class);
var functions = GatherClassInternalFunctions(@class); var functions = GatherClassInternalFunctions(@class);
@ -747,7 +729,7 @@ namespace CppSharp.Generators.CSharp
if (@class.IsUnion) if (@class.IsUnion)
WriteLine("[StructLayout(LayoutKind.Explicit)]"); WriteLine("[StructLayout(LayoutKind.Explicit)]");
Write(Helpers.GetAccess(@class.Access)); Write(@class.Ignore ? "internal " : Helpers.GetAccess(@class.Access));
Write("unsafe "); Write("unsafe ");
if (Driver.Options.GenerateAbstractImpls && @class.IsAbstract) if (Driver.Options.GenerateAbstractImpls && @class.IsAbstract)
@ -761,7 +743,7 @@ namespace CppSharp.Generators.CSharp
var bases = new List<string>(); var bases = new List<string>();
var needsBase = @class.HasBaseClass && !@class.IsValueType var needsBase = @class.HasBaseClass && !@class.IsValueType && !@class.Ignore
&& !@class.Bases[0].Class.IsValueType && !@class.Bases[0].Class.IsValueType
&& !@class.Bases[0].Class.Ignore; && !@class.Bases[0].Class.Ignore;
@ -773,38 +755,45 @@ namespace CppSharp.Generators.CSharp
select QualifiedIdentifier(@base.Class)); select QualifiedIdentifier(@base.Class));
} }
if (@class.IsRefType) if (!@class.Ignore)
bases.Add("IDisposable");
if (Options.GenerateClassMarshals)
{ {
bases.Add("CppSharp.Runtime.ICppMarshal"); if (@class.IsRefType)
bases.Add("IDisposable");
if (Options.GenerateClassMarshals)
{
bases.Add("CppSharp.Runtime.ICppMarshal");
}
} }
if (bases.Count > 0) if (bases.Count > 0)
Write(" : {0}", string.Join(", ", bases)); Write(" : {0}", string.Join(", ", bases));
} }
public void GenerateClassFields(Class @class, Action<Field> action) public void GenerateClassFields(Class @class, Action<Field> action, bool nativeFields = false)
{ {
foreach (var @base in @class.Bases) foreach (var @base in @class.Bases.Where(b => !(b.Type is DependentNameType)))
{ {
TypeMap typeMap; TypeMap typeMap;
if (!Driver.TypeDatabase.FindTypeMap(@base.Type, out typeMap) && @base.Class.Ignore) if ((!Driver.TypeDatabase.FindTypeMap(@base.Type, out typeMap) && @base.Class.Ignore) ||
@base.Class.OriginalClass == @class)
continue; continue;
GenerateClassFields(@base.Class, action); GenerateClassFields(@base.Class, action, nativeFields);
} }
foreach (var field in @class.Fields) foreach (var field in @class.Fields)
{ {
if (ASTUtils.CheckIgnoreField(field)) continue; if (!nativeFields && ASTUtils.CheckIgnoreField(field)) continue;
action(field); action(field);
} }
} }
private void GenerateClassInternalsField(Field field) private void GenerateClassInternalsField(Field field)
{ {
if (field.Type.IsDependent && !field.Type.IsPointer())
return;
var safeIdentifier = Helpers.SafeIdentifier(field.OriginalName); var safeIdentifier = Helpers.SafeIdentifier(field.OriginalName);
PushBlock(CSharpBlockKind.Field); PushBlock(CSharpBlockKind.Field);
@ -819,11 +808,13 @@ namespace CppSharp.Generators.CSharp
if (field.Expression != null) if (field.Expression != null)
{ {
var fieldValuePrinted = field.Expression.CSharpValue(ExpressionPrinter); var fieldValuePrinted = field.Expression.CSharpValue(ExpressionPrinter);
Write("public {0} {1} = {2};", fieldTypePrinted.Type, safeIdentifier, fieldValuePrinted); Write("{0} {1} {2} = {3};", field.Ignore ? "internal" : "public",
fieldTypePrinted.Type, safeIdentifier, fieldValuePrinted);
} }
else else
{ {
Write("public {0} {1};", fieldTypePrinted.Type, safeIdentifier); Write("{0} {1} {2};", field.Ignore ? "internal" : "public",
fieldTypePrinted.Type, safeIdentifier);
} }
PopBlock(NewLineKind.BeforeNextBlock); PopBlock(NewLineKind.BeforeNextBlock);

7
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -218,7 +218,7 @@ namespace CppSharp.Generators.CSharp
} }
Class @class; Class @class;
if (desugared.IsTagDecl(out @class) if ((desugared.IsDependent || desugared.IsTagDecl(out @class))
&& ContextKind == CSharpTypePrinterContextKind.Native) && ContextKind == CSharpTypePrinterContextKind.Native)
{ {
return "global::System.IntPtr"; return "global::System.IntPtr";
@ -268,7 +268,7 @@ namespace CppSharp.Generators.CSharp
} }
FunctionType func; FunctionType func;
if (decl.Type.IsPointerTo<FunctionType>(out func)) if (decl.Type.IsPointerTo(out func))
{ {
if (ContextKind == CSharpTypePrinterContextKind.Native) if (ContextKind == CSharpTypePrinterContextKind.Native)
return "global::System.IntPtr"; return "global::System.IntPtr";
@ -313,7 +313,8 @@ namespace CppSharp.Generators.CSharp
} }
} }
return decl.Name; return decl.Name + (ContextKind == CSharpTypePrinterContextKind.Native ?
".Internal" : string.Empty);
} }
private string GetCSharpSignature(TypeMap typeMap) private string GetCSharpSignature(TypeMap typeMap)

2
src/Generator/Passes/MultipleInheritancePass.cs

@ -76,6 +76,8 @@ namespace CppSharp.Passes
where !property.Ignore where !property.Ignore
select new Property(property) { Namespace = @interface }); select new Property(property) { Namespace = @interface });
@interface.Fields.AddRange(@base.Fields);
if (@interface.Bases.Count == 0) if (@interface.Bases.Count == 0)
{ {
Property instance = new Property(); Property instance = new Property();

6
tests/Basic/Basic.h

@ -261,3 +261,9 @@ struct DLL_API TestStaticClass
private: private:
TestStaticClass(); TestStaticClass();
}; };
class HasIgnoredField
{
Base<Derived> fieldOfIgnoredType;
};

Loading…
Cancel
Save