codemaker/source/netmaker/netproduce.cxx |   36 ++++++++++++++-------------
 net_ure/DotnetLibrary_net_basetypes.mk   |    2 -
 net_ure/qa/basetypes/AnyTests.cs         |   41 +++++++++++++++++--------------
 net_ure/source/basetypes/Any.cs          |    6 +++-
 net_ure/source/basetypes/UnoException.cs |   14 +++-------
 5 files changed, 52 insertions(+), 47 deletions(-)

New commits:
commit 641d082c44b189cc476200d9a4b2bb2d68b77627
Author:     RMZeroFour <ritobrot...@gmail.com>
AuthorDate: Fri Aug 9 21:57:34 2024 +0530
Commit:     Hossein <hoss...@libreoffice.org>
CommitDate: Wed Aug 14 13:14:01 2024 +0200

    .NET Bindings: Fix netmaker and net_basetypes
    
    This commit makes a few misc. fixes to netmaker and net_basetypes
    - Renamed css.uno.Exception to css.uno.UnoException to avoid name
      conflicts with System.Exception
    - Added a new css.uno.Any constructor and setValue function that
      deduces the type of the any from given object at runtime
    - Changed the AnyTests unit tests to match changes made to css.uno.Any
    - Removed the in keyword from UNO 'in' parameters. Was a premature
      optimisation that might have a negative effect for certain types.
    - Generated struct and exception field members were not marked public
      earlier by accident, fixed.
    - Generted struct and exception constructors had parameters in order
      opposite to expected, fixed.
    - Generated services tried to instantiate the interface, not the
      service earlier, fixed.
    
    Change-Id: Ia63f9db469db13a5d01617617095b8f568b39c72
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171706
    Tested-by: Jenkins
    Reviewed-by: Hossein <hoss...@libreoffice.org>

diff --git a/codemaker/source/netmaker/netproduce.cxx 
b/codemaker/source/netmaker/netproduce.cxx
index 5f3fec324a04..8f9ad8e007c5 100644
--- a/codemaker/source/netmaker/netproduce.cxx
+++ b/codemaker/source/netmaker/netproduce.cxx
@@ -55,7 +55,7 @@ const std::unordered_map<OString, OString> s_baseTypes{
     { "void"_ostr, "void"_ostr },
     { "type"_ostr, "System.Type"_ostr },
     { "any"_ostr, "com.sun.star.uno.Any"_ostr },
-    { "com.sun.star.uno.Exception"_ostr, "com.sun.star.uno.Exception"_ostr },
+    { "com.sun.star.uno.Exception"_ostr, "com.sun.star.uno.UnoException"_ostr 
},
     { "com.sun.star.uno.XInterface"_ostr, 
"com.sun.star.uno.IQueryInterface"_ostr },
 };
 
@@ -342,15 +342,15 @@ void NetProducer::producePlainStruct(std::string_view 
name,
 
             rtl::Reference<unoidl::PlainStructTypeEntity> ref(
                 
dynamic_cast<unoidl::PlainStructTypeEntity*>(baseEntity.get()));
-            for (const auto& member : ref->getDirectMembers())
-                baseFields.emplace_back(member);
+            baseFields.insert(baseFields.begin(), 
ref->getDirectMembers().begin(),
+                              ref->getDirectMembers().end());
 
             baseTypeName = ref->getDirectBase();
         }
     }
 
     std::vector<unoidl::PlainStructTypeEntity::Member> 
allFields(entity->getDirectMembers());
-    allFields.insert(allFields.end(), baseFields.begin(), baseFields.end());
+    allFields.insert(allFields.begin(), baseFields.begin(), baseFields.end());
 
     file.beginLine().append("public 
").append(getSafeIdentifier(typeName)).append("(");
     separatedForeach(
@@ -384,6 +384,7 @@ void NetProducer::producePlainStruct(std::string_view name,
             if (anno == "deprecated")
                 file.beginLine().append("[System.Obsolete]").endLine();
         file.beginLine()
+            .append("public ")
             .append(getNetName(member.type))
             .append(" ")
             .append(getSafeIdentifier(member.name))
@@ -475,6 +476,7 @@ void NetProducer::producePolyStruct(
             if (anno == "deprecated")
                 file.beginLine().append("[System.Obsolete]").endLine();
         file.beginLine()
+            .append("public ")
             .append(member.parameterized ? u2b(member.type) : 
getNetName(member.type))
             .append(" ")
             .append(getSafeIdentifier(member.name))
@@ -549,15 +551,15 @@ void NetProducer::produceException(std::string_view name,
 
             rtl::Reference<unoidl::ExceptionTypeEntity> ref(
                 dynamic_cast<unoidl::ExceptionTypeEntity*>(baseEntity.get()));
-            for (const auto& member : ref->getDirectMembers())
-                baseFields.emplace_back(member);
+            baseFields.insert(baseFields.begin(), 
ref->getDirectMembers().begin(),
+                              ref->getDirectMembers().end());
 
             baseTypeName = ref->getDirectBase();
         }
     }
 
     std::vector<unoidl::ExceptionTypeEntity::Member> 
allFields(entity->getDirectMembers());
-    allFields.insert(allFields.end(), baseFields.begin(), baseFields.end());
+    allFields.insert(allFields.begin(), baseFields.begin(), baseFields.end());
 
     file.beginLine().append("public 
").append(getSafeIdentifier(typeName)).append("(");
     separatedForeach(
@@ -591,6 +593,7 @@ void NetProducer::produceException(std::string_view name,
             if (anno == "deprecated")
                 file.beginLine().append("[System.Obsolete]").endLine();
         file.beginLine()
+            .append("public ")
             .append(getNetName(member.type))
             .append(" ")
             .append(getSafeIdentifier(member.name))
@@ -732,7 +735,6 @@ void NetProducer::produceInterface(std::string_view name,
                 switch (p.direction)
                 {
                     case Dir::DIRECTION_IN:
-                        file.append("in ");
                         break;
                     case Dir::DIRECTION_OUT:
                         file.append("out ");
@@ -903,7 +905,7 @@ void NetProducer::produceService(
             file.beginLine()
                 .append("public static ")
                 .append(returnType)
-                .append(" create(in com.sun.star.uno.XComponentContext ctx)")
+                .append(" create(com.sun.star.uno.XComponentContext ctx)")
                 .endLine()
                 .beginBlock();
 
@@ -920,7 +922,7 @@ void NetProducer::produceService(
                 .append(" srv = (")
                 .append(returnType)
                 .append(")mcf.createInstanceWithContext(\"")
-                .append(returnType)
+                .append(name)
                 .append("\", ctx);")
                 .endLine()
                 .beginLine()
@@ -949,7 +951,7 @@ void NetProducer::produceService(
                 .beginLine()
                 .append(
                     "throw new com.sun.star.uno.DeploymentException(\"Could 
not create service ")
-                .append(returnType)
+                .append(name)
                 .append(" from given XComponentContext\", ctx);")
                 .endLine()
                 .endBlock();
@@ -968,7 +970,7 @@ void NetProducer::produceService(
                 .append(returnType)
                 .append(" ")
                 .append(getSafeIdentifier(ctor.name))
-                .append("(in com.sun.star.uno.XComponentContext ctx");
+                .append("(com.sun.star.uno.XComponentContext ctx");
             if (!ctor.parameters.empty())
                 file.append(", ");
             separatedForeach(
@@ -991,7 +993,7 @@ void NetProducer::produceService(
                 .append(" srv = (")
                 .append(returnType)
                 .append(")mcf.createInstanceWithArgumentsAndContext(\"")
-                .append(returnType)
+                .append(name)
                 .append("\", ");
             if (restParam)
             {
@@ -1006,7 +1008,7 @@ void NetProducer::produceService(
                 file.append("new com.sun.star.uno.Any[] { ");
                 separatedForeach(ctor.parameters, [&file]() { file.append(", 
"); },
                                  [&file](const auto& p) {
-                                     file.append("com.sun.star.uno.Any.with(")
+                                     file.append("new com.sun.star.uno.Any(")
                                          .append(getSafeIdentifier(p.name))
                                          .append(")");
                                  });
@@ -1018,7 +1020,7 @@ void NetProducer::produceService(
             {
                 file.beginLine()
                     .append("catch (")
-                    .append(e)
+                    .append(getNetName(e))
                     .append(")")
                     .endLine()
                     .beginBlock()
@@ -1035,7 +1037,7 @@ void NetProducer::produceService(
                 .beginLine()
                 .append(
                     "throw new com.sun.star.uno.DeploymentException(\"Could 
not create service ")
-                .append(returnType)
+                .append(name)
                 .append(" from given XComponentContext\", ctx);")
                 .endLine()
                 .endBlock();
@@ -1082,7 +1084,7 @@ void NetProducer::produceSingleton(
     file.beginLine()
         .append("public static ")
         .append(getNetName(entity->getBase()))
-        .append(" get(in com.sun.star.uno.XComponentContext ctx)")
+        .append(" get(com.sun.star.uno.XComponentContext ctx)")
         .endLine()
         .beginBlock();
 
diff --git a/net_ure/DotnetLibrary_net_basetypes.mk 
b/net_ure/DotnetLibrary_net_basetypes.mk
index 77a8134bd180..ae49c2b78c4b 100644
--- a/net_ure/DotnetLibrary_net_basetypes.mk
+++ b/net_ure/DotnetLibrary_net_basetypes.mk
@@ -11,9 +11,9 @@ $(eval $(call 
gb_DotnetLibrary_DotnetLibrary,net_basetypes,$(gb_DotnetLibrary_CS
 $(eval $(call gb_DotnetLibrary_add_sources,net_basetypes,\
        net_ure/source/basetypes/Any \
        net_ure/source/basetypes/BoundAttribute \
-       net_ure/source/basetypes/Exception \
        net_ure/source/basetypes/IQueryInterface \
        net_ure/source/basetypes/RaisesAttribute \
+       net_ure/source/basetypes/UnoException \
        net_ure/source/basetypes/UnoGeneratedAttribute \
 ))
 
diff --git a/net_ure/qa/basetypes/AnyTests.cs b/net_ure/qa/basetypes/AnyTests.cs
index cee504a1744f..a66fc1639d56 100644
--- a/net_ure/qa/basetypes/AnyTests.cs
+++ b/net_ure/qa/basetypes/AnyTests.cs
@@ -15,7 +15,7 @@ public class AnyTests
     }
 
     [Test]
-    [Description("Tests if the Any(type, value) constructor throws on invalid 
args")]
+    [Description("Tests if the Any constructor throws on invalid args")]
     public void ctor_RejectsInvalidParams()
     {
         Assert.That(() => new Any(null, 10), Throws.ArgumentNullException);
@@ -24,37 +24,39 @@ public class AnyTests
     }
 
     [Test]
-    [Description("Tests if Any.with<T>(value) throws on invalid args")]
+    [Description("Tests if Any.with throws on invalid args")]
     public void with_RejectsInvalidParams()
     {
-        Assert.That(() => new Any(typeof(Any), Any.VOID), 
Throws.ArgumentException);
+        Assert.That(() => Any.with<Any>(Any.VOID), Throws.ArgumentException);
+        Assert.That(() => Any.with<int>(null), Throws.ArgumentException);
     }
 
     [Test]
-    [Description("Tests if Any.equals(other) and Any.operator== returns true 
for identical values")]
+    [Description("Tests if Any.equals and Any.operator== returns true for 
identical values")]
     public void equals_ReturnsTrueForSame()
     {
         Assert.That(Any.VOID == new Any(typeof(void), null), Is.True);
-        Assert.That(Any.with(10).equals(new Any(typeof(int), 10)), Is.True);
-        Assert.That(new Any(typeof(bool), false).Equals(Any.with(false)), 
Is.True);
+        Assert.That(Any.with<int>(10).equals(new Any(typeof(int), 10)), 
Is.True);
+        Assert.That(new Any(typeof(bool), false).Equals(new Any(false)), 
Is.True);
     }
 
     [Test]
-    [Description("Tests if Any.equals(other) and Any.operator== returns false 
for different values")]
+    [Description("Tests if Any.equals and Any.operator== returns false for 
different values")]
     public void equals_ReturnsTrueForDifferent()
     {
-        Assert.That(Any.VOID == Any.with(10), Is.False);
-        Assert.That(Any.VOID != Any.with(10), Is.True);
-        Assert.That(Any.with(10).equals(Any.with(20)), Is.False);
-        Assert.That(Any.with(true).Equals(Any.with(1)), Is.False);
+        Assert.That(Any.VOID == Any.with<int>(10), Is.False);
+        Assert.That(Any.VOID != new Any(10), Is.True);
+        Assert.That(Any.with<int>(10).equals(new Any(20)), Is.False);
+        Assert.That(new Any(typeof(bool), true).Equals(Any.with<int>(1)), 
Is.False);
     }
 
     [Test]
-    [Description("Tests if Any.hasValue() returns false for Any.VOID and true 
for all else")]
-    public void hasValue_ReturnsFalseOnlyForVOID()
+    [Description("Tests if Any.hasValue() returns false for Any.VOID and 
equivalent values")]
+    public void hasValue_ReturnsFalseForVOIDValues()
     {
         Assert.That(Any.VOID.hasValue, Is.False);
-        Assert.That(Any.with(10).hasValue, Is.True);
+        Assert.That(new Any(null).hasValue, Is.False);
+        Assert.That(Any.with<int>(10).hasValue, Is.True);
         Assert.That(new Any(typeof(string), "hello").hasValue, Is.True);
     }
 
@@ -68,7 +70,10 @@ public class AnyTests
         any.setValue(typeof(string), "hello");
         Assert.That(any.Type, Is.EqualTo(typeof(string)));
         Assert.That(any.Value, Is.EqualTo("hello"));
-        any.setValue(false);
+        any.setValue(3.14);
+        Assert.That(any.Type, Is.EqualTo(typeof(double)));
+        Assert.That(any.Value, Is.EqualTo(3.14));
+        any.setValue<bool>(false);
         Assert.That(any.Type, Is.EqualTo(typeof(bool)));
         Assert.That(any.Value, Is.EqualTo(false));
     }
@@ -77,7 +82,7 @@ public class AnyTests
     [Description("Tests if Any.setValue(type, value) method throws on invalid 
args")]
     public void setValue_RejectsInvalidParams()
     {
-        Any any = Any.with(10);
+        Any any = new Any(10);
         Assert.That(() => any.setValue(null, 10), 
Throws.ArgumentNullException);
         Assert.That(() => any.setValue(Any.VOID), Throws.ArgumentException);
         Assert.That(() => any.setValue(typeof(int), null), 
Throws.ArgumentException);
@@ -88,13 +93,13 @@ public class AnyTests
     public void GetHashCode_ReturnsTrueForSame()
     {
         Assert.That(Any.VOID.GetHashCode() == Any.VOID.GetHashCode(), Is.True);
-        Assert.That(Any.with(10).GetHashCode() == Any.with(10).GetHashCode(), 
Is.True);
+        Assert.That(new Any(10).GetHashCode() == 
Any.with<int>(10).GetHashCode(), Is.True);
     }
 
     [Test]
     [Description("Tests if Any.GetHashCode() returns different hash for 
different values")]
     public void GetHashCode_ReturnsTrueForDifferent()
     {
-        Assert.That(Any.VOID.GetHashCode() == Any.with(10).GetHashCode(), 
Is.False);
+        Assert.That(Any.VOID.GetHashCode() == Any.with<int>(10).GetHashCode(), 
Is.False);
     }
 }
diff --git a/net_ure/source/basetypes/Any.cs b/net_ure/source/basetypes/Any.cs
index 7f4a8580b019..03222a9f1f4f 100644
--- a/net_ure/source/basetypes/Any.cs
+++ b/net_ure/source/basetypes/Any.cs
@@ -18,7 +18,8 @@ namespace com.sun.star.uno
         public Object Value { get; private set; }
 
         public Any(Type type, object value) => setValue(type, value);
-        public static Any with<T>(T value) => new Any(typeof(T), value);
+        public Any(object value) : this(value?.GetType() ?? typeof(void), 
value) { }
+        public static Any with<T>(object value) => new Any(typeof(T), value);
 
         public bool hasValue() => Type != typeof(void);
 
@@ -37,7 +38,8 @@ namespace com.sun.star.uno
             Type = type;
             Value = value;
         }
-        public void setValue<T>(T value) => setValue(typeof(T), value);
+        public void setValue(object value) => setValue(value.GetType(), value);
+        public void setValue<T>(object value) => setValue(typeof(T), value);
 
         public bool equals(Any other)
         {
diff --git a/net_ure/source/basetypes/Exception.cs 
b/net_ure/source/basetypes/UnoException.cs
similarity index 56%
rename from net_ure/source/basetypes/Exception.cs
rename to net_ure/source/basetypes/UnoException.cs
index c4a485a7a855..a5ac43785ec8 100644
--- a/net_ure/source/basetypes/Exception.cs
+++ b/net_ure/source/basetypes/UnoException.cs
@@ -10,16 +10,12 @@ using System;
 
 namespace com.sun.star.uno
 {
-    public class Exception : System.Exception
+    public class UnoException : Exception
     {
-        public new string Message { get; set; }
         public IQueryInterface Context { get; set; }
-        
-        public Exception() { }
-        public Exception(string Message, IQueryInterface Context)
-        {
-            this.Message = Message;
-            this.Context = Context;
-        }
+
+        public UnoException() { }
+        public UnoException(string Message, IQueryInterface Context)
+            : base(Message) => this.Context = Context;
     }
 }

Reply via email to