diff --git a/src/AST/Class.cs b/src/AST/Class.cs index 61b85219..f4812594 100644 --- a/src/AST/Class.cs +++ b/src/AST/Class.cs @@ -149,8 +149,8 @@ namespace CppSharp.AST { foreach (var @base in Bases) { - if (@base.IsClass && !@base.Class.ExplicityIgnored) - return @base.Class; + if (@base.IsClass && @base.Class.IsDeclared) + return @base.Class; } return null; diff --git a/src/AST/ClassExtensions.cs b/src/AST/ClassExtensions.cs index 88b2e779..259c97c6 100644 --- a/src/AST/ClassExtensions.cs +++ b/src/AST/ClassExtensions.cs @@ -85,7 +85,7 @@ namespace CppSharp.AST return property; Declaration decl; foreach (var baseClassSpecifier in c.Bases.Where( - b => b.Type.IsTagDecl(out decl) && !b.Class.Ignore)) + b => b.Type.IsTagDecl(out decl) && b.Class.IsDeclared)) { property = baseClassSpecifier.Class.GetPropertyByName(propertyName); if (property != null) diff --git a/src/AST/ClassLayout.cs b/src/AST/ClassLayout.cs index 7beae5ad..3ebbaac2 100644 --- a/src/AST/ClassLayout.cs +++ b/src/AST/ClassLayout.cs @@ -43,7 +43,7 @@ namespace CppSharp.AST get { return Method != null && - Method.Ignore && + !Method.IsDeclared && ((Class) Method.Namespace).GetPropertyByConstituentMethod(Method) == null; } } diff --git a/src/AST/Declaration.cs b/src/AST/Declaration.cs index 008fbcb1..92fa06b5 100644 --- a/src/AST/Declaration.cs +++ b/src/AST/Declaration.cs @@ -25,13 +25,27 @@ namespace CppSharp.AST string Mangled { get; set; } } - [Flags] - public enum IgnoreFlags + /// + /// Kind of the generated declaration + /// + public enum GenerationKind { - None = 0, - Generation = 1 << 0, - Processing = 1 << 1, - Explicit = 1 << 2 + /// + // Declaration is not generated. + /// + None, + /// + /// Declaration is generated. + /// + Generate, + /// + /// Declaration is generated to be used internally. + /// + Internal, + /// + /// Declaration was already generated in a linked assembly. + /// + Link, } /// @@ -172,65 +186,71 @@ namespace CppSharp.AST // Comment associated with declaration. public RawComment Comment; - // Keeps flags to know the type of ignore. - public IgnoreFlags IgnoreFlags { get; set; } + private GenerationKind? generationKind; - // Whether the declaration should be generated. - public virtual bool IsGenerated + public GenerationKind GenerationKind { get { - var isGenerated = !IgnoreFlags.HasFlag(IgnoreFlags.Generation); + if(ExplicityIgnored) + return GenerationKind.None; - if (Namespace == null) - return isGenerated; + if (generationKind.HasValue) + return generationKind.Value; - return isGenerated && Namespace.IsGenerated; - } + if (Namespace != null) + return Namespace.GenerationKind; - set - { - if (value) - IgnoreFlags &= ~IgnoreFlags.Generation; - else - IgnoreFlags |= IgnoreFlags.Generation; + return GenerationKind.Generate; } + set { generationKind = value; } } - // Whether the declaration was explicitly ignored. - public bool ExplicityIgnored + /// + /// Whether the declaration should be generated. + /// + public virtual bool IsGenerated { get { - var isExplicitlyIgnored = IgnoreFlags.HasFlag(IgnoreFlags.Explicit); - - if (Namespace == null) - return isExplicitlyIgnored; - - return isExplicitlyIgnored || Namespace.ExplicityIgnored; + return GenerationKind == GenerationKind.Generate; } + } - set + /// + /// Whether the declaration internal bindings should be generated. + /// + public bool IsInternal + { + get { - if (value) - IgnoreFlags |= IgnoreFlags.Explicit; - else - IgnoreFlags &= ~IgnoreFlags.Explicit; + var k = GenerationKind; + return k == GenerationKind.Generate + || k == GenerationKind.Internal; } } - // Whether the declaration should be ignored. - public virtual bool Ignore + /// + /// Whether a binded version of this declaration is available. + /// + public bool IsDeclared { get { - var isIgnored = IgnoreFlags != IgnoreFlags.None; + var k = GenerationKind; + return k == GenerationKind.Generate + || k == GenerationKind.Internal + || k == GenerationKind.Link; + } + } - if (Namespace != null) - isIgnored |= Namespace.Ignore; + public bool ExplicityIgnored { get; set; } - return isIgnored; - } + [Obsolete("Replace set by ExplicityIgnored. Replace get by IsGenerated, IsInternal or IsDeclared.")] + public virtual bool Ignore + { + get { return GenerationKind == GenerationKind.None; } + set { ExplicityIgnored = value; } } public AccessSpecifier Access { get; set; } @@ -264,7 +284,6 @@ namespace CppSharp.AST protected Declaration() { Access = AccessSpecifier.Public; - IgnoreFlags = IgnoreFlags.None; ExcludeFromPasses = new HashSet(); PreprocessedEntities = new List(); Attributes = new List(); @@ -283,7 +302,7 @@ namespace CppSharp.AST OriginalName = declaration.OriginalName; name = declaration.Name; Comment = declaration.Comment; - IgnoreFlags = declaration.IgnoreFlags; + generationKind = declaration.generationKind; Access = declaration.Access; DebugText = declaration.DebugText; IsIncomplete = declaration.IsIncomplete; diff --git a/src/AST/Namespace.cs b/src/AST/Namespace.cs index a343506d..6adaab95 100644 --- a/src/AST/Namespace.cs +++ b/src/AST/Namespace.cs @@ -335,8 +335,8 @@ namespace CppSharp.AST public bool HasDeclarations { get - { - Predicate pred = (t => !t.Ignore); + { + Predicate pred = (t => t.IsGenerated); return Enums.Exists(pred) || HasFunctions || Typedefs.Exists(pred) || Classes.Any() || Namespaces.Exists(n => n.HasDeclarations); } @@ -345,8 +345,8 @@ namespace CppSharp.AST public bool HasFunctions { get - { - Predicate pred = (t => !t.Ignore); + { + Predicate pred = (t => t.IsGenerated); return Functions.Exists(pred) || Namespaces.Exists(n => n.HasFunctions); } } diff --git a/src/AST/TranslationUnit.cs b/src/AST/TranslationUnit.cs index 1e1d36c0..9acff994 100644 --- a/src/AST/TranslationUnit.cs +++ b/src/AST/TranslationUnit.cs @@ -24,18 +24,6 @@ namespace CppSharp.AST /// Contains the macros present in the unit. public List Macros; - // Whether the unit should be generated. - public override bool IsGenerated - { - get { return !IgnoreFlags.HasFlag(IgnoreFlags.Generation); } - } - - // Whether the unit should be ignored. - public override bool Ignore - { - get { return IgnoreFlags != IgnoreFlags.None; } - } - public bool IsSystemHeader { get; set; } public bool IsValid { get { return FilePath != ""; } } diff --git a/src/CppParser/Bindings/ParserGen.cs b/src/CppParser/Bindings/ParserGen.cs index 173401a1..e84bdc4c 100644 --- a/src/CppParser/Bindings/ParserGen.cs +++ b/src/CppParser/Bindings/ParserGen.cs @@ -145,7 +145,7 @@ namespace CppSharp { public override bool VisitFieldDecl(Field field) { - if (field.Ignore) + if (!field.IsGenerated) return false; if (!IsStdType(field.QualifiedType)) return false; diff --git a/src/Generator/AST/Utils.cs b/src/Generator/AST/Utils.cs index c3944128..1e887257 100644 --- a/src/Generator/AST/Utils.cs +++ b/src/Generator/AST/Utils.cs @@ -9,7 +9,7 @@ namespace CppSharp.AST { public static bool CheckIgnoreFunction(Function function, DriverOptions options) { - if (function.Ignore) return true; + if (!function.IsGenerated) return true; if (function is Method) return CheckIgnoreMethod(function as Method, options); @@ -19,7 +19,7 @@ namespace CppSharp.AST public static bool CheckIgnoreMethod(Method method, DriverOptions options) { - if (method.Ignore) return true; + if (!method.IsGenerated) return true; var isEmptyCtor = method.IsConstructor && method.Parameters.Count == 0; @@ -52,7 +52,7 @@ namespace CppSharp.AST var copyConstructor = baseClass.Methods.FirstOrDefault(m => m.IsCopyConstructor); if (copyConstructor == null || copyConstructor.Access == AccessSpecifier.Private - || copyConstructor.Ignore) + || !copyConstructor.IsDeclared) return true; } } @@ -65,7 +65,7 @@ namespace CppSharp.AST if (field.Access == AccessSpecifier.Private) return true; - return field.Ignore; + return !field.IsGenerated; } } diff --git a/src/Generator/Generator.cs b/src/Generator/Generator.cs index 069437f9..1606cc2a 100644 --- a/src/Generator/Generator.cs +++ b/src/Generator/Generator.cs @@ -68,7 +68,7 @@ namespace CppSharp.Generators foreach (var unit in Driver.ASTContext.TranslationUnits) { - if (unit.Ignore || !unit.HasDeclarations) + if (!unit.IsGenerated || !unit.HasDeclarations) continue; if (unit.IsSystemHeader) diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 4b49a012..cf9555d2 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -68,8 +68,8 @@ namespace CppSharp.Generators.CLI var include = typeRef.Include; var unit = include.TranslationUnit; - - if (unit != null && unit.ExplicityIgnored) + + if (unit != null && !unit.IsDeclared) continue; if(!string.IsNullOrEmpty(include.File) && include.InHeader) @@ -151,7 +151,7 @@ namespace CppSharp.Generators.CLI // Generate all the enum declarations for the module. foreach (var @enum in decl.Enums) { - if (@enum.Ignore || @enum.IsIncomplete) + if (!@enum.IsGenerated || @enum.IsIncomplete) continue; PushBlock(CLIBlockKind.Enum, @enum); @@ -165,7 +165,7 @@ namespace CppSharp.Generators.CLI // Generate all the struct/class declarations for the module. foreach (var @class in decl.Classes) { - if (@class.Ignore || @class.IsIncomplete) + if (!@class.IsGenerated || @class.IsIncomplete) continue; if (@class.IsOpaque) @@ -210,7 +210,7 @@ namespace CppSharp.Generators.CLI { foreach (var typedef in decl.Typedefs) { - if (typedef.Ignore) + if (!typedef.IsGenerated) continue; GenerateTypedef(typedef); @@ -240,7 +240,7 @@ namespace CppSharp.Generators.CLI public void GenerateClass(Class @class) { - if (@class.Ignore || @class.IsIncomplete) + if (!@class.IsGenerated || @class.IsIncomplete) return; GenerateDeclarationCommon(@class); @@ -306,7 +306,7 @@ namespace CppSharp.Generators.CLI PushIndent(); foreach (var template in @class.Templates) { - if (template.Ignore) continue; + if (!template.IsGenerated) continue; var functionTemplate = template as FunctionTemplate; if (functionTemplate == null) continue; @@ -417,7 +417,7 @@ namespace CppSharp.Generators.CLI // properties to the managed value subtypes. if (@class.IsValueType) { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore)) + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsGenerated)) { GenerateClassFields(@base.Class); } @@ -426,7 +426,7 @@ namespace CppSharp.Generators.CLI PushIndent(); // check for value types because some of the ignored fields may back properties; // not the case for ref types because the NativePtr pattern is used there - foreach (var field in @class.Fields.Where(f => !f.Ignore || @class.IsValueType)) + foreach (var field in @class.Fields.Where(f => f.IsGenerated || @class.IsValueType)) { var property = @class.Properties.FirstOrDefault(p => p.Field == field); if (property != null && !property.IsInRefTypeAndBackedByValueClassField()) @@ -454,7 +454,7 @@ namespace CppSharp.Generators.CLI { foreach (var @event in @class.Events) { - if (@event.Ignore) continue; + if (!@event.IsGenerated) continue; var cppTypePrinter = new CppTypePrinter(Driver.TypeDatabase); var cppArgs = cppTypePrinter.VisitParameters(@event.Parameters, hasNames: true); @@ -522,7 +522,7 @@ namespace CppSharp.Generators.CLI foreach(var variable in @class.Variables) { - if (variable.Ignore) continue; + if (!variable.IsGenerated) continue; if (variable.Access != AccessSpecifier.Public) continue; @@ -592,14 +592,14 @@ namespace CppSharp.Generators.CLI // properties to the managed value subtypes. if (@class.IsValueType) { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore)) + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsGenerated)) { GenerateClassProperties(@base.Class); } } PushIndent(); - foreach (var prop in @class.Properties.Where(prop => !prop.Ignore)) + foreach (var prop in @class.Properties.Where(prop => prop.IsGenerated)) { if (prop.IsInRefTypeAndBackedByValueClassField()) { @@ -701,7 +701,7 @@ namespace CppSharp.Generators.CLI public bool GenerateTypedef(TypedefDecl typedef) { - if (typedef.Ignore) + if (!typedef.IsGenerated) return false; FunctionType function; @@ -726,7 +726,7 @@ namespace CppSharp.Generators.CLI public void GenerateFunction(Function function) { - if (function.Ignore) + if (!function.IsGenerated) return; PushBlock(CLIBlockKind.Function, function); @@ -745,7 +745,7 @@ namespace CppSharp.Generators.CLI public void GenerateEnum(Enumeration @enum) { - if (@enum.Ignore || @enum.IsIncomplete) + if (!@enum.IsGenerated || @enum.IsIncomplete) return; PushBlock(CLIBlockKind.Enum, @enum); diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index 4f840c2d..c7a6624a 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -618,14 +618,14 @@ namespace CppSharp.Generators.CLI public void MarshalValueClassProperties(Class @class, string marshalVar) { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore)) + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsGenerated)) { MarshalValueClassProperties(@base.Class, marshalVar); } foreach (var property in @class.Properties) { - if (property.Ignore || property.Field == null) + if (!property.IsGenerated || property.Field == null) continue; MarshalValueClassProperty(property, marshalVar); diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 6182d191..a75c57d0 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -86,7 +86,7 @@ namespace CppSharp.Generators.CLI PushBlock(CLIBlockKind.Namespace); foreach (var @class in @namespace.Classes) { - if (@class.Ignore) + if (!@class.IsGenerated) continue; if (@class.IsOpaque || @class.IsIncomplete) @@ -100,7 +100,7 @@ namespace CppSharp.Generators.CLI // Generate all the function declarations for the module. foreach (var function in @namespace.Functions) { - if (function.Ignore) + if (!function.IsGenerated) continue; GenerateFunction(function, @namespace); @@ -112,12 +112,12 @@ namespace CppSharp.Generators.CLI { foreach (var template in @namespace.Templates) { - if (template.Ignore) continue; + if (!template.IsGenerated) continue; var functionTemplate = template as FunctionTemplate; if (functionTemplate == null) continue; - if (functionTemplate.Ignore) + if (!functionTemplate.IsGenerated) continue; GenerateFunctionTemplate(functionTemplate); @@ -174,7 +174,7 @@ namespace CppSharp.Generators.CLI foreach (var @event in @class.Events) { - if (@event.Ignore) + if (!@event.IsGenerated) continue; GenerateDeclarationCommon(@event); @@ -183,7 +183,7 @@ namespace CppSharp.Generators.CLI foreach (var variable in @class.Variables) { - if (variable.Ignore) + if (!variable.IsGenerated) continue; if (variable.Access != AccessSpecifier.Public) @@ -216,14 +216,14 @@ namespace CppSharp.Generators.CLI { if (@class.IsValueType) { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore)) + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsGenerated)) { GenerateClassProperties(@base.Class, realOwner); } } foreach (var property in @class.Properties.Where( - p => !p.Ignore && !p.IsInRefTypeAndBackedByValueClassField())) + p => p.IsGenerated && !p.IsInRefTypeAndBackedByValueClassField())) GenerateProperty(property, realOwner); } @@ -309,7 +309,7 @@ namespace CppSharp.Generators.CLI private void GenerateProperty(Property property, Class realOwner) { - if (property.Ignore) return; + if (!property.IsGenerated) return; PushBlock(CLIBlockKind.Property); @@ -628,14 +628,14 @@ namespace CppSharp.Generators.CLI private void GenerateStructMarshaling(Class @class, string nativeVar) { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore)) + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsGenerated)) { GenerateStructMarshaling(@base.Class, nativeVar); } foreach (var property in @class.Properties) { - if (property.Ignore || property.Field == null) continue; + if (!property.IsGenerated || property.Field == null) continue; var nativeField = string.Format("{0}{1}", nativeVar, property.Field.OriginalName); @@ -659,7 +659,7 @@ namespace CppSharp.Generators.CLI private bool GenerateClassConstructorBase(Class @class, bool isIntPtr, Method method = null) { - var hasBase = @class.HasBase && @class.Bases[0].IsClass && !@class.Bases[0].Class.ExplicityIgnored; + var hasBase = @class.HasBase && @class.Bases[0].IsClass && @class.Bases[0].Class.IsDeclared; if (!hasBase) return false; @@ -777,14 +777,14 @@ namespace CppSharp.Generators.CLI private void GenerateValueTypeConstructorCallProperties(Class @class) { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.ExplicityIgnored)) + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsDeclared)) { GenerateValueTypeConstructorCallProperties(@base.Class); } foreach (var property in @class.Properties) { - if (property.ExplicityIgnored || property.Field == null) continue; + if (!property.IsDeclared || property.Field == null) continue; var varName = string.Format("_native.{0}", property.Field.OriginalName); @@ -806,7 +806,7 @@ namespace CppSharp.Generators.CLI public void GenerateFunction(Function function, DeclarationContext @namespace) { - if (function.Ignore) + if (!function.IsGenerated) return; GenerateDeclarationCommon(function); diff --git a/src/Generator/Generators/CLI/CLITypeReferences.cs b/src/Generator/Generators/CLI/CLITypeReferences.cs index 6340533d..337bded4 100644 --- a/src/Generator/Generators/CLI/CLITypeReferences.cs +++ b/src/Generator/Generators/CLI/CLITypeReferences.cs @@ -115,7 +115,7 @@ namespace CppSharp.Generators.CLI if (translationUnit.IsSystemHeader) return; - if(decl.ExplicityIgnored) + if(!decl.IsDeclared) return; if(IsBuiltinTypedef(decl)) @@ -181,7 +181,7 @@ namespace CppSharp.Generators.CLI if (decl.Namespace != null && decl.Namespace.TranslationUnit.IsSystemHeader) return false; - return !decl.ExplicityIgnored; + return decl.IsDeclared; } public override bool VisitClassDecl(Class @class) diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index c26a82a6..035114be 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -268,7 +268,7 @@ namespace CppSharp.Generators.CSharp // Call the copy constructor. TypeMap typeMap; - if (copyCtorMethod.Ignore && FindTypeMap(ctx.Driver.TypeDatabase, @class, out typeMap)) + if (!copyCtorMethod.IsGenerated && FindTypeMap(ctx.Driver.TypeDatabase, @class, out typeMap)) { typeMap.CSharpMarshalCopyCtorToManaged(Context); } diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index f65c5823..d95be772 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -203,8 +203,8 @@ namespace CppSharp.Generators.CSharp // Generate all the enum declarations. foreach (var @enum in context.Enums) - { - if (@enum.Ignore || @enum.IsIncomplete) + { + if (!@enum.IsGenerated || @enum.IsIncomplete) continue; GenerateEnum(@enum); @@ -241,8 +241,8 @@ namespace CppSharp.Generators.CSharp // Generate all the internal function declarations. foreach (var function in context.Functions) - { - if (function.Ignore) continue; + { + if (!function.IsInternal) continue; GenerateInternalFunction(function); } @@ -251,8 +251,8 @@ namespace CppSharp.Generators.CSharp PopBlock(NewLineKind.BeforeNextBlock); foreach (var function in context.Functions) - { - if (function.Ignore) continue; + { + if (!function.IsGenerated) continue; GenerateFunction(function); } @@ -262,8 +262,8 @@ namespace CppSharp.Generators.CSharp } foreach (var @event in context.Events) - { - if (@event.Ignore) continue; + { + if (!@event.IsGenerated) continue; GenerateEvent(@event); } @@ -350,9 +350,9 @@ namespace CppSharp.Generators.CSharp GenerateClassInternals(@class); GenerateDeclContext(@class); - if (@class.Ignore || @class.IsDependent) - goto exit; - + if (!@class.IsGenerated || @class.IsDependent) + goto exit; + if (ShouldGenerateClassNativeField(@class)) { PushBlock(CSharpBlockKind.Field); @@ -403,8 +403,8 @@ namespace CppSharp.Generators.CSharp } private void GenerateInterface(Class @class) - { - if (@class.Ignore || @class.IsIncomplete) + { + if (!@class.IsGenerated || @class.IsIncomplete) return; PushBlock(CSharpBlockKind.Interface); @@ -432,8 +432,8 @@ namespace CppSharp.Generators.CSharp WriteLine(");"); PopBlock(NewLineKind.BeforeNextBlock); - } - foreach (var prop in @class.Properties.Where(p => !p.Ignore)) + } + foreach (var prop in @class.Properties.Where(p => p.IsGenerated)) { PushBlock(CSharpBlockKind.Property); var type = prop.Type; @@ -595,8 +595,8 @@ namespace CppSharp.Generators.CSharp private void GenerateStructMarshalingProperties(Class @class) { foreach (var @base in @class.Bases) - { - if (!@base.IsClass || @base.Class.Ignore) + { + if (!@base.IsClass || !@base.Class.IsGenerated) continue; GenerateStructMarshalingProperties(@base.Class); @@ -604,8 +604,8 @@ namespace CppSharp.Generators.CSharp for (int i = 0; i < @class.Properties.Count; i++) { - var property = @class.Properties[i]; - if (property.Ignore || property.Field == null) continue; + var property = @class.Properties[i]; + if (!property.IsGenerated || property.Field == null) continue; var nativeField = string.Format("{0}->{1}", Generator.GeneratedIdentifier("ptr"), @@ -646,8 +646,8 @@ namespace CppSharp.Generators.CSharp private void GenerateStructInternalMarshalingProperties(Class @class, string marshalVar) { foreach (var @base in @class.Bases) - { - if (!@base.IsClass || @base.Class.Ignore) + { + if (!@base.IsClass || !@base.Class.IsGenerated) continue; var baseClass = @base.Class; @@ -655,8 +655,8 @@ namespace CppSharp.Generators.CSharp } foreach (var property in @class.Properties) - { - if (property.Ignore || property.Field == null) + { + if (!property.IsGenerated || property.Field == null) continue; GenerateStructInternalMarshalingProperty(property, marshalVar); @@ -710,7 +710,7 @@ namespace CppSharp.Generators.CSharp baseClass = @class.Bases[0].Class; var hasRefBase = baseClass != null && baseClass.IsRefType - && !baseClass.ExplicityIgnored; + && baseClass.IsDeclared; return hasRefBase; } @@ -723,9 +723,9 @@ namespace CppSharp.Generators.CSharp public void GenerateClassProlog(Class @class) { if (@class.IsUnion) - WriteLine("[StructLayout(LayoutKind.Explicit)]"); - - Write(@class.Ignore ? "internal " : Helpers.GetAccess(@class.Access)); + WriteLine("[StructLayout(LayoutKind.Explicit)]"); + + Write(!@class.IsGenerated ? "internal " : Helpers.GetAccess(@class.Access)); Write("unsafe "); if (Driver.Options.GenerateAbstractImpls && @class.IsAbstract) @@ -737,11 +737,11 @@ namespace CppSharp.Generators.CSharp Write(@class.IsInterface ? "interface " : (@class.IsValueType ? "struct " : "class ")); Write("{0}", @class.Name); - var bases = new List(); - - var needsBase = @class.HasBaseClass && !@class.IsValueType && !@class.Ignore - && !@class.Bases[0].Class.IsValueType - && !@class.Bases[0].Class.Ignore; + var bases = new List(); + + var needsBase = @class.HasBaseClass && !@class.IsValueType && @class.IsGenerated + && !@class.Bases[0].Class.IsValueType + && @class.Bases[0].Class.IsGenerated; if (needsBase) { @@ -749,9 +749,9 @@ namespace CppSharp.Generators.CSharp from @base in @class.Bases where @base.IsClass select QualifiedIdentifier(@base.Class)); - } - - if (!@class.Ignore) + } + + if (@class.IsGenerated) { if (@class.IsRefType) bases.Add("IDisposable"); @@ -770,8 +770,8 @@ namespace CppSharp.Generators.CSharp { foreach (var @base in @class.Bases.Where(b => !(b.Type is DependentNameType))) { - TypeMap typeMap; - if ((!Driver.TypeDatabase.FindTypeMap(@base.Type, out typeMap) && @base.Class.Ignore) || + TypeMap typeMap; + if ((!Driver.TypeDatabase.FindTypeMap(@base.Type, out typeMap) && !@base.Class.IsGenerated) || @base.Class.OriginalClass == @class) continue; @@ -806,13 +806,13 @@ namespace CppSharp.Generators.CSharp if (field.Expression != null) { - var fieldValuePrinted = field.Expression.CSharpValue(ExpressionPrinter); - Write("{0} {1} {2} = {3};", field.Ignore ? "internal" : "public", + var fieldValuePrinted = field.Expression.CSharpValue(ExpressionPrinter); + Write("{0} {1} {2} = {3};", !field.IsGenerated ? "internal" : "public", fieldTypePrinted.Type, safeIdentifier, fieldValuePrinted); } else - { - Write("{0} {1} {2};", field.Ignore ? "internal" : "public", + { + Write("{0} {1} {2};", !field.IsGenerated ? "internal" : "public", fieldTypePrinted.Type, safeIdentifier); } @@ -1167,8 +1167,8 @@ namespace CppSharp.Generators.CSharp public void GenerateClassVariables(Class @class) { foreach (var variable in @class.Variables) - { - if (variable.Ignore) continue; + { + if (!variable.IsGenerated) continue; if (variable.Access != AccessSpecifier.Public) continue; @@ -1182,8 +1182,8 @@ namespace CppSharp.Generators.CSharp private void GenerateClassProperties(Class @class) { if (@class.IsValueType) - { - foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore)) + { + foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsGenerated)) { GenerateClassProperties(@base.Class); } @@ -1193,8 +1193,8 @@ namespace CppSharp.Generators.CSharp } private void GenerateProperties(Class @class) - { - foreach (var prop in @class.Properties.Where(p => !p.Ignore)) + { + foreach (var prop in @class.Properties.Where(p => p.IsGenerated)) { if (prop.IsInRefTypeAndBackedByValueClassField()) { @@ -1513,8 +1513,8 @@ namespace CppSharp.Generators.CSharp var marshals = new List(); for (int i = 0; i < method.Parameters.Count; i++) { - var param = method.Parameters[i]; - if (param.Ignore) + var param = method.Parameters[i]; + if (!param.IsGenerated) continue; if (param.Kind == ParameterKind.IndirectReturnType) @@ -1957,7 +1957,7 @@ namespace CppSharp.Generators.CSharp private bool GenerateClassConstructorBase(Class @class, Method method) { - var hasBase = @class.HasBaseClass && !@class.Bases[0].Class.Ignore; + var hasBase = @class.HasBaseClass && @class.Bases[0].Class.IsGenerated; if (hasBase && !@class.IsValueType) { @@ -2528,8 +2528,8 @@ namespace CppSharp.Generators.CSharp #endregion public bool GenerateTypedef(TypedefDecl typedef) - { - if (typedef.Ignore) + { + if (!typedef.IsGenerated) return false; GenerateDeclarationCommon(typedef); @@ -2562,8 +2562,8 @@ namespace CppSharp.Generators.CSharp } public void GenerateEnum(Enumeration @enum) - { - if (@enum.Ignore) return; + { + if (!@enum.IsGenerated) return; PushBlock(CSharpBlockKind.Enum); GenerateDeclarationCommon(@enum); @@ -2654,7 +2654,7 @@ namespace CppSharp.Generators.CSharp public void GenerateInternalFunction(Function function) { - if (function.ExplicityIgnored || function.IsPure) + if (!function.IsInternal || function.IsPure) return; if (function.OriginalFunction != null) diff --git a/src/Generator/Library.cs b/src/Generator/Library.cs index 187855ab..d72002ae 100644 --- a/src/Generator/Library.cs +++ b/src/Generator/Library.cs @@ -334,7 +334,6 @@ namespace CppSharp foreach (var unit in units) { - unit.IsGenerated = false; unit.ExplicityIgnored = true; } } diff --git a/src/Generator/Passes/CheckAmbiguousFunctions.cs b/src/Generator/Passes/CheckAmbiguousFunctions.cs index e3726767..49c1e07b 100644 --- a/src/Generator/Passes/CheckAmbiguousFunctions.cs +++ b/src/Generator/Passes/CheckAmbiguousFunctions.cs @@ -40,7 +40,7 @@ namespace CppSharp.Passes if (overload == function) continue; - if (overload.Ignore) continue; + if (!overload.IsGenerated) continue; if (!CheckDefaultParameters(function, overload)) continue; diff --git a/src/Generator/Passes/CheckDuplicatedNamesPass.cs b/src/Generator/Passes/CheckDuplicatedNamesPass.cs index 20fa8bea..df64939f 100644 --- a/src/Generator/Passes/CheckDuplicatedNamesPass.cs +++ b/src/Generator/Passes/CheckDuplicatedNamesPass.cs @@ -180,7 +180,7 @@ namespace CppSharp.Passes void CheckDuplicate(Declaration decl) { - if (decl.IsDependent || decl.Ignore) + if (decl.IsDependent || !decl.IsGenerated) return; if (string.IsNullOrWhiteSpace(decl.Name)) diff --git a/src/Generator/Passes/CheckIgnoredDecls.cs b/src/Generator/Passes/CheckIgnoredDecls.cs index 1d200420..4a1b0274 100644 --- a/src/Generator/Passes/CheckIgnoredDecls.cs +++ b/src/Generator/Passes/CheckIgnoredDecls.cs @@ -168,7 +168,7 @@ namespace CppSharp.Passes if (method.IsOverride) { var baseOverride = @class.GetRootBaseMethod(method); - if (baseOverride != null && baseOverride.Ignore) + if (baseOverride != null && !baseOverride.IsDeclared) { Log.Debug( "Virtual method '{0}' was ignored due to ignored override '{1}'", @@ -199,7 +199,7 @@ namespace CppSharp.Passes continue; ignoredBase = @base; - isIgnored |= @base.Ignore + isIgnored |= !@base.IsDeclared || HasIgnoredBaseClass(@override, @base, out ignoredBase); if (isIgnored) diff --git a/src/Generator/Passes/CheckMacrosPass.cs b/src/Generator/Passes/CheckMacrosPass.cs index 35e678d2..77cfd758 100644 --- a/src/Generator/Passes/CheckMacrosPass.cs +++ b/src/Generator/Passes/CheckMacrosPass.cs @@ -74,22 +74,21 @@ namespace CppSharp.Passes e.Location != MacroLocation.ClassBody && e.Location != MacroLocation.FunctionBody && e.Location != MacroLocation.FunctionParameters)) - decl.IsGenerated = false; + decl.GenerationKind = GenerationKind.Link; + } + + public override bool VisitTranslationUnit(TranslationUnit unit) + { + var expansions = unit.PreprocessedEntities.OfType(); + + if (expansions.Any(e => e.Text == Prefix + "_IGNORE_FILE")) + { + unit.ExplicityIgnored = true; + } + + return base.VisitTranslationUnit(unit); } - public override bool VisitTranslationUnit(TranslationUnit unit) - { - var expansions = unit.PreprocessedEntities.OfType(); - - if (expansions.Any(e => e.Text == Prefix + "_IGNORE_FILE")) - { - unit.IsGenerated = false; - unit.ExplicityIgnored = true; - } - - return base.VisitTranslationUnit(unit); - } - public override bool VisitClassDecl(Class @class) { var expansions = @class.PreprocessedEntities.OfType(); diff --git a/src/Generator/Passes/CheckOperatorsOverloads.cs b/src/Generator/Passes/CheckOperatorsOverloads.cs index 22564dd6..9b2cca86 100644 --- a/src/Generator/Passes/CheckOperatorsOverloads.cs +++ b/src/Generator/Passes/CheckOperatorsOverloads.cs @@ -47,7 +47,7 @@ namespace CppSharp.Passes private void CheckInvalidOperators(Class @class) { - foreach (var @operator in @class.Operators.Where(o => !o.Ignore)) + foreach (var @operator in @class.Operators.Where(o => o.IsGenerated)) { if (!IsValidOperatorOverload(@operator)) { @@ -95,28 +95,29 @@ namespace CppSharp.Passes Access = @operator.Access, Namespace = @class, GetMethod = @operator - }; - - if (!@operator.ReturnType.Qualifiers.IsConst && @operator.ReturnType.Type.IsAddress()) + }; + + if (!@operator.ReturnType.Qualifiers.IsConst && @operator.ReturnType.Type.IsAddress()) property.SetMethod = @operator; - if (Driver.Options.IsCLIGenerator) - { - // If we've a setter use the pointee as the type of the property. - var pointerType = property.Type as PointerType; - if (pointerType != null && property.HasSetter) - { - property.QualifiedType = new QualifiedType(pointerType.Pointee, property.QualifiedType.Qualifiers); - property.GetMethod.ReturnType = property.QualifiedType; - } - // C++/CLI uses "default" as the indexer property name. - property.Name = "default"; + if (Driver.Options.IsCLIGenerator) + { + // If we've a setter use the pointee as the type of the property. + var pointerType = property.Type as PointerType; + if (pointerType != null && property.HasSetter) + { + property.QualifiedType = new QualifiedType(pointerType.Pointee, property.QualifiedType.Qualifiers); + property.GetMethod.ReturnType = property.QualifiedType; + } + // C++/CLI uses "default" as the indexer property name. + property.Name = "default"; } property.Parameters.AddRange(@operator.Parameters); - @class.Properties.Add(property); - @operator.IsGenerated = false; + @class.Properties.Add(property); + + @operator.GenerationKind = GenerationKind.Internal; } static void HandleMissingOperatorOverloadPair(Class @class, CXXOperatorKind op1, @@ -129,7 +130,7 @@ namespace CppSharp.Passes var missingKind = CheckMissingOperatorOverloadPair(@class, out index, op1, op2, op.Parameters.Last().Type); - if (missingKind == CXXOperatorKind.None || op.Ignore) + if (missingKind == CXXOperatorKind.None || !op.IsGenerated) continue; var method = new Method() @@ -158,13 +159,13 @@ namespace CppSharp.Passes var hasFirst = first != null; var hasSecond = second != null; - if (hasFirst && (!hasSecond || second.Ignore)) + if (hasFirst && (!hasSecond || !second.IsGenerated)) { index = @class.Methods.IndexOf(first); return op2; } - if (hasSecond && (!hasFirst || first.Ignore)) + if (hasSecond && (!hasFirst || !first.IsGenerated)) { index = @class.Methods.IndexOf(second); return op1; @@ -196,18 +197,18 @@ namespace CppSharp.Passes // The array indexing operator can be overloaded case CXXOperatorKind.Subscript: - // The conversion operator can be overloaded + // The conversion operator can be overloaded case CXXOperatorKind.Conversion: - return true; - - // The comparison operators can be overloaded if their return type is bool - case CXXOperatorKind.EqualEqual: - case CXXOperatorKind.ExclaimEqual: - case CXXOperatorKind.Less: - case CXXOperatorKind.Greater: - case CXXOperatorKind.LessEqual: - case CXXOperatorKind.GreaterEqual: - return @operator.ReturnType.Type.IsPrimitiveType(PrimitiveType.Bool); + return true; + + // The comparison operators can be overloaded if their return type is bool + case CXXOperatorKind.EqualEqual: + case CXXOperatorKind.ExclaimEqual: + case CXXOperatorKind.Less: + case CXXOperatorKind.Greater: + case CXXOperatorKind.LessEqual: + case CXXOperatorKind.GreaterEqual: + return @operator.ReturnType.Type.IsPrimitiveType(PrimitiveType.Bool); // Only prefix operators can be overloaded case CXXOperatorKind.PlusPlus: diff --git a/src/Generator/Passes/CheckStaticClass.cs b/src/Generator/Passes/CheckStaticClass.cs index 04a2c4cb..586520ac 100644 --- a/src/Generator/Passes/CheckStaticClass.cs +++ b/src/Generator/Passes/CheckStaticClass.cs @@ -63,10 +63,10 @@ namespace CppSharp.Passes // Ignore the special methods for static classes. foreach (var ctor in @class.Constructors) - ctor.IsGenerated = false; + ctor.GenerationKind = GenerationKind.Internal; foreach (var dtor in @class.Destructors) - dtor.IsGenerated = false; + dtor.GenerationKind = GenerationKind.Internal; return true; } diff --git a/src/Generator/Passes/CleanUnitPass.cs b/src/Generator/Passes/CleanUnitPass.cs index 63e4e43f..bc833e38 100644 --- a/src/Generator/Passes/CleanUnitPass.cs +++ b/src/Generator/Passes/CleanUnitPass.cs @@ -13,9 +13,9 @@ namespace CppSharp.Passes public override bool VisitTranslationUnit(TranslationUnit unit) { - if (IsTranslationGenerated(unit)) - unit.IsGenerated = false; - + if (IsExternalDeclaration(unit)) + unit.GenerationKind = GenerationKind.Link; + // Try to get an include path that works from the original include // directories paths. @@ -52,19 +52,20 @@ namespace CppSharp.Passes return includePath.Replace('\\', '/'); } - - bool IsTranslationGenerated(TranslationUnit translationUnit) - { - if (DriverOptions.NoGenIncludeDirs == null) - return false; - - foreach (var path in DriverOptions.NoGenIncludeDirs) - { - if (translationUnit.FilePath.StartsWith(path)) - return true; - } - - return false; - } + + + bool IsExternalDeclaration(TranslationUnit translationUnit) + { + if (DriverOptions.NoGenIncludeDirs == null) + return false; + + foreach (var path in DriverOptions.NoGenIncludeDirs) + { + if (translationUnit.FilePath.StartsWith(path)) + return true; + } + + return false; + } } } \ No newline at end of file diff --git a/src/Generator/Passes/FunctionToInstanceMethodPass.cs b/src/Generator/Passes/FunctionToInstanceMethodPass.cs index 6355c8c8..c5cc7bd9 100644 --- a/src/Generator/Passes/FunctionToInstanceMethodPass.cs +++ b/src/Generator/Passes/FunctionToInstanceMethodPass.cs @@ -18,7 +18,7 @@ namespace CppSharp.Passes public override bool VisitFunctionDecl(Function function) { - if (function.Ignore) + if (!function.IsGenerated) return false; // Check if this function can be converted. diff --git a/src/Generator/Passes/FunctionToStaticMethodPass.cs b/src/Generator/Passes/FunctionToStaticMethodPass.cs index 52f08b71..fc0ccfba 100644 --- a/src/Generator/Passes/FunctionToStaticMethodPass.cs +++ b/src/Generator/Passes/FunctionToStaticMethodPass.cs @@ -14,7 +14,7 @@ namespace CppSharp.Passes public override bool VisitFunctionDecl(Function function) { - if (function.Ignore) + if (!function.IsGenerated) return false; var types = StringHelpers.SplitCamelCase(function.Name); diff --git a/src/Generator/Passes/GenerateInlinesCodePass.cs b/src/Generator/Passes/GenerateInlinesCodePass.cs index 8b7bbed8..5bd22c1f 100644 --- a/src/Generator/Passes/GenerateInlinesCodePass.cs +++ b/src/Generator/Passes/GenerateInlinesCodePass.cs @@ -81,7 +81,7 @@ namespace CppSharp.Passes { string symbol = mangled.Mangled; var declaration = (Declaration) mangled; - if (!declaration.Ignore && AccessValid(declaration) && + if (declaration.IsGenerated && AccessValid(declaration) && !Driver.Symbols.FindSymbol(ref symbol) && !currentUnit.FilePath.EndsWith("_impl.h") && !currentUnit.FilePath.EndsWith("_p.h")) diff --git a/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs b/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs index d3c6072f..6ebe8484 100644 --- a/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs +++ b/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs @@ -70,7 +70,7 @@ namespace CppSharp.Passes public override bool VisitMethodDecl(Method method) { if (!method.IsConstructor && !method.IsDestructor && !method.IsOperator && - !method.Ignore) + method.IsGenerated) DistributeMethod(method); return base.VisitMethodDecl(method); } @@ -205,9 +205,9 @@ namespace CppSharp.Passes property.Comment = comment; } type.Properties.Add(property); - getter.IsGenerated = false; + getter.GenerationKind = GenerationKind.Internal; if (setter != null) - setter.IsGenerated = false; + setter.GenerationKind = GenerationKind.Internal; } } diff --git a/src/Generator/Passes/GetterSetterToPropertyPass.cs b/src/Generator/Passes/GetterSetterToPropertyPass.cs index d6bc25d8..d2d68013 100644 --- a/src/Generator/Passes/GetterSetterToPropertyPass.cs +++ b/src/Generator/Passes/GetterSetterToPropertyPass.cs @@ -95,7 +95,7 @@ namespace CppSharp.Passes prop.Access = method.Access; // Do not generate the original method now that we know it is a getter. - method.IsGenerated = false; + method.GenerationKind = GenerationKind.Internal; Driver.Diagnostics.Debug("Getter created: {0}::{1}", @class.Name, name); @@ -111,8 +111,8 @@ namespace CppSharp.Passes prop.SetMethod = method; prop.Access = method.Access; - // Ignore the original method now that we know it is a setter. - method.IsGenerated = false; + // Ignore the original method now that we know it is a setter. + method.GenerationKind = GenerationKind.Internal; Driver.Diagnostics.Debug("Setter created: {0}::{1}", @class.Name, name); diff --git a/src/Generator/Passes/MoveFunctionToClassPass.cs b/src/Generator/Passes/MoveFunctionToClassPass.cs index b3896c89..67fdf4e8 100644 --- a/src/Generator/Passes/MoveFunctionToClassPass.cs +++ b/src/Generator/Passes/MoveFunctionToClassPass.cs @@ -13,7 +13,7 @@ namespace CppSharp.Passes if (!VisitDeclaration(function)) return false; - if (function.Ignore || function.Namespace is Class) + if (!function.IsGenerated || function.Namespace is Class) return false; var @class = FindClassToMoveFunctionTo(function.Namespace); diff --git a/src/Generator/Passes/MoveOperatorToClassPass.cs b/src/Generator/Passes/MoveOperatorToClassPass.cs index eddeadf1..c4f9e283 100644 --- a/src/Generator/Passes/MoveOperatorToClassPass.cs +++ b/src/Generator/Passes/MoveOperatorToClassPass.cs @@ -12,7 +12,7 @@ namespace CppSharp.Passes public override bool VisitFunctionDecl(Function function) { - if (function.Ignore || !function.IsOperator) + if (!function.IsGenerated || !function.IsOperator) return false; Class @class = null; diff --git a/src/Generator/Passes/MultipleInheritancePass.cs b/src/Generator/Passes/MultipleInheritancePass.cs index 712bb5ef..716aa8fb 100644 --- a/src/Generator/Passes/MultipleInheritancePass.cs +++ b/src/Generator/Passes/MultipleInheritancePass.cs @@ -67,13 +67,13 @@ namespace CppSharp.Passes select new BaseClassSpecifier { Type = new TagType(i) }); @interface.Methods.AddRange( - from m in @base.Methods - where !m.IsConstructor && !m.IsDestructor && !m.IsStatic && !m.Ignore && !m.IsOperator + from m in @base.Methods + where !m.IsConstructor && !m.IsDestructor && !m.IsStatic && m.IsDeclared && !m.IsOperator select new Method(m) { Namespace = @interface }); @interface.Properties.AddRange( from property in @base.Properties - where !property.Ignore + where property.IsDeclared select new Property(property) { Namespace = @interface }); @interface.Fields.AddRange(@base.Fields); @@ -112,8 +112,8 @@ namespace CppSharp.Passes IsVirtual = false, IsOverride = false }; - var rootBaseMethod = @class.GetRootBaseMethod(method, true); - if (rootBaseMethod != null && !rootBaseMethod.Ignore) + var rootBaseMethod = @class.GetRootBaseMethod(method, true); + if (rootBaseMethod != null && rootBaseMethod.IsDeclared) impl.ExplicitInterfaceImpl = @interface; @class.Methods.Add(impl); } @@ -126,8 +126,8 @@ namespace CppSharp.Passes foreach (var property in @interface.Properties.Where(p => p.Name != Helpers.InstanceIdentifier)) { var impl = new Property(property) { Namespace = @class }; - var rootBaseProperty = @class.GetRootBaseProperty(property, true); - if (rootBaseProperty != null && !rootBaseProperty.Ignore) + var rootBaseProperty = @class.GetRootBaseProperty(property, true); + if (rootBaseProperty != null && rootBaseProperty.IsDeclared) impl.ExplicitInterfaceImpl = @interface; @class.Properties.Add(impl); } diff --git a/src/Generator/Passes/ResolveIncompleteDeclsPass.cs b/src/Generator/Passes/ResolveIncompleteDeclsPass.cs index 1f910c29..5f94a0e0 100644 --- a/src/Generator/Passes/ResolveIncompleteDeclsPass.cs +++ b/src/Generator/Passes/ResolveIncompleteDeclsPass.cs @@ -9,7 +9,7 @@ namespace CppSharp.Passes if (AlreadyVisited(decl)) return false; - return !decl.Ignore; + return decl.IsGenerated; } public override bool VisitClassDecl(Class @class) @@ -25,7 +25,7 @@ namespace CppSharp.Passes if (@class.CompleteDeclaration == null) { - @class.IsGenerated = false; + @class.GenerationKind = GenerationKind.Internal; Driver.Diagnostics.Debug("Unresolved declaration: {0}", @class.Name); } @@ -51,7 +51,7 @@ namespace CppSharp.Passes if (@enum.CompleteDeclaration == null) { - @enum.IsGenerated = false; + @enum.GenerationKind = GenerationKind.Internal; Driver.Diagnostics.EmitWarning(DiagnosticId.UnresolvedDeclaration, "Unresolved declaration: {0}", @enum.Name); }