Skip to content

Commit

Permalink
Implement support for properties in Emscripten generator.
Browse files Browse the repository at this point in the history
  • Loading branch information
tritao committed Feb 5, 2023
1 parent 732bfd7 commit 64ea65f
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 7 deletions.
7 changes: 6 additions & 1 deletion src/Generator/Driver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,12 @@ public void SetupPasses(ILibrary library)

passes.AddPass(new CleanInvalidDeclNamesPass());
passes.AddPass(new FastDelegateToDelegatesPass());
passes.AddPass(new FieldToPropertyPass());

if (Options.GeneratorKind != GeneratorKind.Emscripten)
{
passes.AddPass(new FieldToPropertyPass());
}

passes.AddPass(new CheckIgnoredDeclsPass());
passes.AddPass(new CheckFlagEnumsPass());
passes.AddPass(new MakeProtectedNestedTypesPublicPass());
Expand Down
26 changes: 25 additions & 1 deletion src/Generator/Generators/Emscripten/EmscriptenSources.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,33 @@ public override bool VisitMethodDecl(Method method)
return ret;
}

public override bool VisitProperty(Property property)
{
if (property.Field != null)
return property.Field.Visit(this);

if (!property.GetMethod.IsConst)
{
Console.WriteLine($"Cannot bind non-const property getter method: {property.GetMethod.QualifiedOriginalName}");
return false;
}

var @class = property.Namespace as Class;
Indent();
Write($".property(\"{property.Name}\", &{@class.QualifiedOriginalName}::{property.GetMethod.OriginalName}");

if (property.HasSetter)
Write($", &{@class.QualifiedOriginalName}::{property.SetMethod.OriginalName}");

WriteLine(")");
Unindent();

return true;
}

public override bool VisitFieldDecl(Field field)
{
WriteLineIndent($".field(\"{field.Name}\", &{field.Class.QualifiedOriginalName}::{field.OriginalName})");
WriteLineIndent($".property(\"{field.Name}\", &{field.Class.QualifiedOriginalName}::{field.OriginalName})");
return true;
}

Expand Down
18 changes: 14 additions & 4 deletions tests/Classes.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,29 @@ class Class
{
public:
void ReturnsVoid() {}
int ReturnsInt() { return 0; }
Class* PassAndReturnsClassPtr(Class* obj) { return obj; }
int ReturnsInt() const { return 0; }
Class *PassAndReturnsClassPtr(Class *obj) { return obj; }
};

class ClassWithField
{
public:
ClassWithField() : Field(10) {}
int Field;
int ReturnsField() { return Field; }
int ReturnsField() const { return Field; }
};

class ClassWithProperty
{
public:
ClassWithProperty() : Field(10) {}
int GetField() const { return Field; }
void SetField(int value) { Field = value; }
private:
int Field;
};


class ClassWithOverloads
{
public:
Expand All @@ -33,7 +44,6 @@ class ClassWithSingleInheritance : public Class

class ClassWithExternalInheritance : public ClassFromAnotherUnit
{

};

void FunctionPassClassByRef(Class* klass) { }
Expand Down
5 changes: 5 additions & 0 deletions tests/emscripten/test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ function classes() {
var classWithField = new test.ClassWithField();
eq(classWithField.ReturnsField(), 10);
eq(classWithField.Field, 10);

var classWithProperty = new test.ClassWithProperty();
eq(classWithProperty.Field, 10);
classWithProperty.Field = 20;
eq(classWithProperty.Field, 20);
}


Expand Down
2 changes: 1 addition & 1 deletion tests/emscripten/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ generate=true
if [ $generate = true ]; then
echo "${green}Generating bindings${reset}"
dotnet $rootdir/bin/${dotnet_configuration}_${platform}/CppSharp.CLI.dll \
--gen=emscripten --platform=emscripten --arch=wasm32 \
--gen=emscripten --platform=emscripten --arch=wasm32 --property=keywords \
-I$dir/.. -I$rootdir/include -o $dir/gen -m tests $dir/../*.h
fi

Expand Down

0 comments on commit 64ea65f

Please sign in to comment.