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; } }