Browse Source

Reworked CLI type references to only filter namespaces only filter (effective) namespaces when generating forward references and not includes.

pull/71/head
triton 13 years ago
parent
commit
c0c212928d
  1. 4
      src/Generator/Generators/CLI/CLIHeadersTemplate.cs
  2. 2
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  3. 29
      src/Generator/Generators/CLI/CLITypeReferences.cs

4
src/Generator/Generators/CLI/CLIHeadersTemplate.cs

@ -46,7 +46,7 @@ namespace CppSharp.Generators.CLI
public void GenerateIncludeForwardRefs() public void GenerateIncludeForwardRefs()
{ {
var typeReferenceCollector = new CLITypeReferenceCollector(Driver.TypeDatabase); var typeReferenceCollector = new CLITypeReferenceCollector(Driver.TypeDatabase);
typeReferenceCollector.Process(TranslationUnit); typeReferenceCollector.Process(TranslationUnit, filterNamespaces: false);
var includes = new SortedSet<string>(StringComparer.InvariantCulture); var includes = new SortedSet<string>(StringComparer.InvariantCulture);
@ -75,7 +75,7 @@ namespace CppSharp.Generators.CLI
public void GenerateForwardRefs(Namespace @namespace) public void GenerateForwardRefs(Namespace @namespace)
{ {
var typeReferenceCollector = new CLITypeReferenceCollector(Driver.TypeDatabase); var typeReferenceCollector = new CLITypeReferenceCollector(Driver.TypeDatabase);
typeReferenceCollector.Process(@namespace); typeReferenceCollector.Process(@namespace, filterNamespaces: true);
// Use a set to remove duplicate entries. // Use a set to remove duplicate entries.
var forwardRefs = new SortedSet<string>(StringComparer.InvariantCulture); var forwardRefs = new SortedSet<string>(StringComparer.InvariantCulture);

2
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -55,7 +55,7 @@ namespace CppSharp.Generators.CLI
PushBlock(CLIBlockKind.IncludesForwardReferences); PushBlock(CLIBlockKind.IncludesForwardReferences);
var typeReferenceCollector = new CLITypeReferenceCollector(Driver.TypeDatabase); var typeReferenceCollector = new CLITypeReferenceCollector(Driver.TypeDatabase);
typeReferenceCollector.Process(TranslationUnit); typeReferenceCollector.Process(TranslationUnit, filterNamespaces: false);
var includes = new SortedSet<string>(StringComparer.InvariantCulture); var includes = new SortedSet<string>(StringComparer.InvariantCulture);

29
src/Generator/Generators/CLI/CLITypeReferences.cs

@ -43,7 +43,19 @@ namespace CppSharp.Generators.CLI
return @ref; return @ref;
} }
public void Process(Namespace @namespace) static Namespace GetEffectiveNamespace(Declaration decl)
{
if (decl == null || decl.Namespace == null)
return null;
var @namespace = decl.Namespace as Namespace;
if (@namespace != null)
return @namespace;
return GetEffectiveNamespace(@namespace);
}
public void Process(Namespace @namespace, bool filterNamespaces)
{ {
var collector = new RecordCollector(@namespace.TranslationUnit); var collector = new RecordCollector(@namespace.TranslationUnit);
@namespace.Visit(collector); @namespace.Visit(collector);
@ -55,14 +67,17 @@ namespace CppSharp.Generators.CLI
if (record.Value is Namespace) if (record.Value is Namespace)
continue; continue;
var declNamespace = record.Value.Namespace; if (filterNamespaces)
{
var declNamespace = GetEffectiveNamespace(record.Value.Namespace);
var isSameNamespace = declNamespace == @namespace; var isSameNamespace = declNamespace == @namespace;
if (declNamespace != null) if (declNamespace != null)
isSameNamespace |= declNamespace.QualifiedName == @namespace.QualifiedName; isSameNamespace |= declNamespace.QualifiedName == @namespace.QualifiedName;
if (!isSameNamespace) if (!isSameNamespace)
continue; continue;
}
record.Value.Visit(this); record.Value.Visit(this);
GenerateInclude(record); GenerateInclude(record);

Loading…
Cancel
Save