static/source/embindmaker/embindmaker.cxx |   67 ++++++++++++------------------
 unotest/source/embindtest/embindtest.js   |   22 ++++-----
 2 files changed, 38 insertions(+), 51 deletions(-)

New commits:
commit f10d51709d08bdafdbd5c92f73ddb62cb217b6dd
Author:     Stephan Bergmann <stephan.bergm...@allotropia.de>
AuthorDate: Tue Jul 16 10:27:10 2024 +0200
Commit:     Stephan Bergmann <stephan.bergm...@allotropia.de>
CommitDate: Tue Jul 16 12:48:49 2024 +0200

    Embind: Implement UNO interface attributes as JS accessor properties
    
    Change-Id: I39b1f5676b2e5ba6071b39bf031c10d9c85f1ad1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170566
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <stephan.bergm...@allotropia.de>

diff --git a/static/source/embindmaker/embindmaker.cxx 
b/static/source/embindmaker/embindmaker.cxx
index 78bc94b9087d..9953512a8bf0 100644
--- a/static/source/embindmaker/embindmaker.cxx
+++ b/static/source/embindmaker/embindmaker.cxx
@@ -481,57 +481,44 @@ void dumpAttributes(std::ostream& out, 
rtl::Reference<TypeManager> const& manage
 {
     for (auto const& attr : entity->getDirectAttributes())
     {
-        out << "        .function(\"get" << attr.name << "\", ";
-        if (baseTrail.empty())
+        out << "        .property<";
+        dumpType(out, manager, attr.type);
+        out << ">(\"" << attr.name << "\", +[](" << cppName(name) << " const & 
the_self) { return ";
+        for (auto const& base : baseTrail)
         {
-            out << "&" << cppName(name) << "::get" << attr.name;
+            out << "static_cast<" << cppName(base) << " &>(";
         }
-        else
+        out << "const_cast<" << cppName(name) << " &>(the_self)";
+        for (std::size_t i = 0; i != baseTrail.size(); ++i)
         {
-            out << "+[](::com::sun::star::uno::Reference<" << cppName(name)
-                << "> const & the_self) { return ";
-            for (auto const& base : baseTrail)
-            {
-                out << "static_cast<" << cppName(base) << " *>(";
-            }
-            out << "the_self.get()";
-            for (std::size_t i = 0; i != baseTrail.size(); ++i)
-            {
-                out << ")";
-            }
-            out << "->get" << attr.name << "(); }";
+            out << ")";
         }
-        out << ", ::emscripten::pure_virtual())
";
+        out << ".get" << attr.name << "(); }";
         if (!attr.readOnly)
         {
-            out << "        .function(\"set" << attr.name << "\", ";
-            if (baseTrail.empty())
+            out << ", +[](" << cppName(name) << " & the_self, ";
+            dumpType(out, manager, attr.type);
+            if (passByReference(manager, attr.type))
             {
-                out << "&" << cppName(name) << "::set" << attr.name;
+                out << " const &";
             }
-            else
+            out << " the_value) { ";
+            for (auto const& base : baseTrail)
             {
-                out << "+[](::com::sun::star::uno::Reference<" << cppName(name)
-                    << "> const & the_self, ";
-                dumpType(out, manager, attr.type);
-                if (passByReference(manager, attr.type))
-                {
-                    out << " const &";
-                }
-                out << " the_value) { ";
-                for (auto const& base : baseTrail)
-                {
-                    out << "static_cast<" << cppName(base) << " *>(";
-                }
-                out << "the_self.get()";
-                for (std::size_t i = 0; i != baseTrail.size(); ++i)
-                {
-                    out << ")";
-                }
-                out << "->set" << attr.name << "(the_value); }";
+                out << "static_cast<" << cppName(base) << " &>(";
+            }
+            out << "the_self";
+            for (std::size_t i = 0; i != baseTrail.size(); ++i)
+            {
+                out << ")";
             }
-            out << ", ::emscripten::pure_virtual())
";
+            out << ".set" << attr.name << "(the_value); }";
         }
+        out << "/*only supported since "
+               "<https://github.com/emscripten-core/emscripten/commit/";
+               "09b765f76e052e6bfcf741ed6d2bae1788200734> \"[embind] Return 
value policy support "
+               "for properties. (#21935)\" towards emsdk 3.1.62: , "
+               "::emscripten::pure_virtual()*/)
";
     }
 }
 
diff --git a/unotest/source/embindtest/embindtest.js 
b/unotest/source/embindtest/embindtest.js
index e923a4f85d0a..bb4d2716ee5d 100644
--- a/unotest/source/embindtest/embindtest.js
+++ b/unotest/source/embindtest/embindtest.js
@@ -688,22 +688,22 @@ Module.addOnPostRun(function() {
     css.task.XJobExecutor.query(obj).trigger('from JS');
     {
         const attrs = 
Module.uno.org.libreoffice.embindtest.XAttributes.query(obj);
-        console.assert(attrs.getLongAttribute() === -123456);
-        attrs.setLongAttribute(789);
-        console.assert(attrs.getLongAttribute() === 789);
-        console.assert(attrs.getStringAttribute() === 'hä');
-        attrs.setStringAttribute('foo');
-        console.assert(attrs.getStringAttribute() === 'foo');
-        console.assert(attrs.getReadOnlyAttribute() === 1); //TODO: true
+        console.assert(attrs.LongAttribute === -123456);
+        attrs.LongAttribute = 789;
+        console.assert(attrs.LongAttribute === 789);
+        console.assert(attrs.StringAttribute === 'hä');
+        attrs.StringAttribute = 'foo';
+        console.assert(attrs.StringAttribute === 'foo');
+        console.assert(attrs.ReadOnlyAttribute === 1); //TODO: true
         try {
-            attrs.setReadOnlyAttribute(false);
+            attrs.ReadOnlyAttribute = false;
             console.assert(false);
         } catch (e) {}
         console.assert(test.checkAttributes(attrs));
     }
-    console.assert(test.getStringAttribute() === 'hä');
-    test.setStringAttribute('foo');
-    console.assert(test.getStringAttribute() === 'foo');
+    console.assert(test.StringAttribute === 'hä');
+    test.StringAttribute = 'foo';
+    console.assert(test.StringAttribute === 'foo');
 
     const args = new Module.uno_Sequence_any(
         [new 
Module.uno_Any(Module.uno_Type.Interface('com.sun.star.uno.XInterface'), 
test)]);

Reply via email to