Skip to content

Commit 7969925

Browse files
committed
Minor refactoring of NAPI sources generation.
1 parent 93dc4e9 commit 7969925

File tree

2 files changed

+273
-352
lines changed

2 files changed

+273
-352
lines changed

src/Generator/Generators/C/NAPI/NAPIHelpers.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,91 @@
11
using System.Collections.Generic;
22
using System.IO;
3+
using System.Linq;
34
using CppSharp.AST;
5+
using CppSharp.AST.Extensions;
46
using CppSharp.Generators.C;
7+
using CppSharp.Passes;
58

69
namespace CppSharp.Generators.Cpp
710
{
11+
public class NAPICodeGenerator : CCodeGenerator
12+
{
13+
public override string FileExtension => "cpp";
14+
15+
public NAPICodeGenerator(BindingContext context, IEnumerable<TranslationUnit> units)
16+
: base(context, units)
17+
{
18+
}
19+
20+
public override void VisitDeclContextFunctions(DeclarationContext context)
21+
{
22+
var functions = context.Functions.Where(f => !ASTUtils.CheckIgnoreFunction(f)).ToList();
23+
var unique = functions.GroupBy(m => m.Name);
24+
foreach (var group in unique)
25+
GenerateFunctionGroup(group.ToList());
26+
}
27+
28+
public virtual void GenerateFunctionGroup(List<Function> group)
29+
{
30+
foreach (var function in group)
31+
{
32+
function.Visit(this);
33+
return;
34+
}
35+
}
36+
37+
public override bool VisitClassDecl(Class @class)
38+
{
39+
return VisitClassDeclContext(@class);
40+
}
41+
42+
public override void VisitClassConstructors(Class @class)
43+
{
44+
var constructors = @class.Constructors.Where(c => c.IsGenerated && !c.IsCopyConstructor)
45+
.ToList();
46+
if (!constructors.Any())
47+
return;
48+
49+
GenerateMethodGroup(constructors);
50+
}
51+
52+
public static bool ShouldGenerate(Function function)
53+
{
54+
if (!function.IsGenerated)
55+
return false;
56+
57+
if (function is Method method)
58+
{
59+
if (method.IsConstructor || method.IsDestructor)
60+
return false;
61+
62+
if (method.IsOperator)
63+
if (method.OperatorKind == CXXOperatorKind.Conversion ||
64+
method.OperatorKind == CXXOperatorKind.Equal)
65+
return false;
66+
}
67+
68+
return true;
69+
}
70+
71+
public override void VisitClassMethods(Class @class)
72+
{
73+
var methods = @class.Methods.Where(ShouldGenerate);
74+
var uniqueMethods = methods.GroupBy(m => m.Name);
75+
foreach (var group in uniqueMethods)
76+
GenerateMethodGroup(group.ToList());
77+
}
78+
79+
public virtual void GenerateMethodGroup(List<Method> @group)
80+
{
81+
foreach (var method in @group)
82+
{
83+
method.Visit(this);
84+
return;
85+
}
86+
}
87+
}
88+
889
/// <summary>
990
/// Generates a common Node N-API C/C++ common files.
1091
/// N-API documentation: https://nodejs.org/api/n-api.html

0 commit comments

Comments
 (0)