diff options
author | Rüdiger Timm <rt@openoffice.org> | 2004-07-12 12:04:46 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2004-07-12 12:04:46 +0000 |
commit | dcb319441f74e74940317e6ba6cbe4bdcc9e1a5c (patch) | |
tree | e2ca88abc1fe550b38613f86843feed00c71dc3a /cli_ure/source | |
parent | 06dba08b7957c6aae23d082186ed5f4793058f7c (diff) |
INTEGRATION: CWS jl9 (1.9.24); FILE MERGED
2004/06/30 14:06:08 jl 1.9.24.1: #i29433# adapt to uno changes like multiinheritance and parameterized structs
Diffstat (limited to 'cli_ure/source')
-rw-r--r-- | cli_ure/source/climaker/climaker_emit.cxx | 168 |
1 files changed, 139 insertions, 29 deletions
diff --git a/cli_ure/source/climaker/climaker_emit.cxx b/cli_ure/source/climaker/climaker_emit.cxx index 75260d86abd4..d7aeb543c9a3 100644 --- a/cli_ure/source/climaker/climaker_emit.cxx +++ b/cli_ure/source/climaker/climaker_emit.cxx @@ -2,9 +2,9 @@ * * $RCSfile: climaker_emit.cxx,v $ * - * $Revision: 1.9 $ + * $Revision: 1.10 $ * - * last change: $Author: dbo $ $Date: 2003-07-28 12:37:24 $ + * last change: $Author: rt $ $Date: 2004-07-12 13:04:46 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -64,9 +64,11 @@ #include "rtl/string.hxx" #include "rtl/ustrbuf.hxx" #include "com/sun/star/reflection/XIndirectTypeDescription.hpp" +#include "com/sun/star/reflection/XStructTypeDescription.hpp" +#include "com/sun/star/reflection/XInterfaceTypeDescription2.hpp" #include "com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp" #include "com/sun/star/reflection/XInterfaceAttributeTypeDescription.hpp" - +#include <vector> using namespace ::System::Reflection; @@ -173,6 +175,15 @@ static inline void emit_ldarg( Emit::ILGenerator * code, ::System::Int32 index ) } } +void polymorphicStructNameToStructName(::System::String ** sPolyName) +{ + if ((*sPolyName)->EndsWith(S">") == false) + return; + + int index = (*sPolyName)->LastIndexOf('<'); + OSL_ASSERT(index != -1); + *sPolyName = (*sPolyName)->Substring(0, index); +} //______________________________________________________________________________ Assembly * TypeEmitter::type_resolve( ::System::Object * sender, ::System::ResolveEventArgs * args ) @@ -1032,6 +1043,19 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() } ::System::String * cts_name = to_cts_name( uno_name ); +//remove later +// System::Console::WriteLine(System::String::Concat(cts_name, new System::String( S"\n"))); +// if (cts_name->Equals(new System::String(S"unoidl.test.testtools.bridgetest.TestPolyStruct<[]any>"))) +// { +// int a = 3; +// } +//------------ + // if the struct is an instantiated polymorpic struct then we create the simple struct name + // For example: + // void func ([in] PolyStruct<boolean> arg); + //PolyStruct<boolean> will be converted to PolyStruct + polymorphicStructNameToStructName( & cts_name); + ::System::Type * ret_type = get_type( cts_name, false /* no exc */ ); if (0 == ret_type) { @@ -1065,8 +1089,15 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() sal_Int32 members_length = seq_members.getLength(); OSL_ASSERT( seq_member_names.getLength() == members_length ); + Sequence< OUString > seq_type_parameters; + Reference< reflection::XStructTypeDescription> xStructTypeDesc( + xType, UNO_QUERY); + if (xStructTypeDesc.is()) + seq_type_parameters = xStructTypeDesc->getTypeParameters(); + sal_Int32 all_members_length = 0; sal_Int32 member_pos; + sal_Int32 type_param_pos = 0; // collect base types; wrong order ::System::Collections::ArrayList * base_types_list = @@ -1166,8 +1197,27 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() { ::System::String * field_name = ustring_to_String( pseq_member_names[ member_pos ] ); - ::System::Type * field_type = + ::System::Type * field_type; + //Special handling of struct parameter types + if (pseq_members[ member_pos ]->getTypeClass() == TypeClass_UNKNOWN) + { + if (type_param_pos < seq_type_parameters.getLength()) + { + field_type = __typeof(::System::Object); + type_param_pos++; + } + else + { + throw RuntimeException( + OUSTR("unexpected member type in ") + xType->getName(), + Reference< XInterface >() ); + } + } + else + { + field_type = get_type( pseq_members[ member_pos ] ); + } members[ member_pos ] = type_builder->DefineField( field_name, field_type, FieldAttributes::Public ); @@ -1302,7 +1352,7 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() //______________________________________________________________________________ ::System::Type * TypeEmitter::get_type( - Reference< reflection::XInterfaceTypeDescription > const & xType ) + Reference< reflection::XInterfaceTypeDescription2 > const & xType ) { OUString uno_name( xType->getName() ); if (uno_name.equalsAsciiL( @@ -1322,27 +1372,59 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() TypeAttributes::Abstract | TypeAttributes::AnsiClass); - Reference< reflection::XInterfaceTypeDescription > xBaseType( - xType->getBaseType(), UNO_QUERY ); - if (xBaseType.is() && - !xBaseType->getName().equalsAsciiL( - RTL_CONSTASCII_STRINGPARAM("com.sun.star.uno.XInterface") )) + std::vector<Reference<reflection::XInterfaceTypeDescription2> > vecBaseTypes; + Sequence<Reference< reflection::XTypeDescription > > seqBaseTypes = + xType->getBaseTypes(); + if (seqBaseTypes.getLength() > 0) { + for (int i = 0; i < seqBaseTypes.getLength(); i++) + { + Reference<reflection::XTypeDescription>& aType = seqBaseTypes[i]; + Reference<reflection::XInterfaceTypeDescription2> xIfaceTd( + aType, UNO_QUERY); + if (xIfaceTd.is() == sal_False) + { + Reference<reflection::XIndirectTypeDescription> xIndTd( + aType, UNO_QUERY_THROW); + Reference<reflection::XTypeDescription> xRefTD; + while (1) + { + Reference<reflection::XTypeDescription> xRefTD = + xIndTd->getReferencedType(); + + Reference<reflection::XInterfaceTypeDescription2> xIfaceTd2( + xRefTD, UNO_QUERY); + if (xIfaceTd2.is()) + { + xIfaceTd = xIfaceTd2; + break; + } + } + } + if (xIfaceTd->getName().equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("com.sun.star.uno.XInterface") ) == sal_False) + { + vecBaseTypes.push_back(xIfaceTd); + } + } + ::System::Type * base_interfaces __gc [] = - new ::System::Type * __gc [ 1 ]; - base_interfaces[ 0 ] = get_type( xBaseType ); + new ::System::Type * __gc [ vecBaseTypes.size() ]; + + typedef std::vector<Reference<reflection::XInterfaceTypeDescription2> >::const_iterator it; + int index = 0; + for (it i = vecBaseTypes.begin(); i != vecBaseTypes.end(); i++, index++) + base_interfaces[ index ] = get_type( *i ); type_builder = m_module_builder->DefineType( cts_name, attr, 0, base_interfaces ); } else { - if (! xBaseType.is()) - { - ::System::Console::WriteLine( - "warning: IDL interface {0} is not derived from " - "com.sun.star.uno.XInterface!", - ustring_to_String( uno_name ) ); - } + ::System::Console::WriteLine( + "warning: IDL interface {0} is not derived from " + "com.sun.star.uno.XInterface!", + ustring_to_String( uno_name ) ); + type_builder = m_module_builder->DefineType( cts_name, attr ); } @@ -1363,18 +1445,46 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() ::System::Type * TypeEmitter::complete_iface_type( iface_entry * entry ) { Emit::TypeBuilder * type_builder = entry->m_type_builder; - reflection::XInterfaceTypeDescription * xType = entry->m_xType; + reflection::XInterfaceTypeDescription2 * xType = entry->m_xType; - Reference< reflection::XTypeDescription > xBaseType( xType->getBaseType() ); - if (xBaseType.is()) + Sequence<Reference< reflection::XTypeDescription > > seqBaseTypes( xType->getBaseTypes() ); + if (seqBaseTypes.getLength() > 0) { - ::System::String * basetype_name = to_cts_name( xBaseType->getName() ); - iface_entry * base_entry = dynamic_cast< iface_entry * >( - m_incomplete_ifaces->get_Item( basetype_name ) ); - if (0 != base_entry) + for (int i = 0; i < seqBaseTypes.getLength(); i++) { - // complete uncompleted base type first - complete_iface_type( base_entry ); + Reference< reflection::XTypeDescription > aBaseType = seqBaseTypes[i]; + //make sure we get the interface rather then a typedef + Reference<reflection::XIndirectTypeDescription> xIndTd( + aBaseType, UNO_QUERY); + if (xIndTd.is()) + { + Reference<reflection::XTypeDescription> xRefTD; + while (1) + { + Reference<reflection::XTypeDescription> xRefTD = + xIndTd->getReferencedType(); + + Reference<reflection::XInterfaceTypeDescription2> xIfaceTd2( + xRefTD, UNO_QUERY); + if (xIfaceTd2.is()) + { + aBaseType = Reference<reflection::XTypeDescription>::query(xIfaceTd2); + break; + } + } + } + if (aBaseType->getName().equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("com.sun.star.uno.XInterface") ) == sal_False) + { + ::System::String * basetype_name = to_cts_name( aBaseType->getName() ); + iface_entry * base_entry = dynamic_cast< iface_entry * >( + m_incomplete_ifaces->get_Item( basetype_name ) ); + if (0 != base_entry) + { + // complete uncompleted base type first + complete_iface_type( base_entry ); + } + } } } @@ -1620,7 +1730,7 @@ ConstructorInfo * TypeEmitter::get_ctor_uno_MethodAttribute() } case TypeClass_INTERFACE: return get_type( - Reference< reflection::XInterfaceTypeDescription >( + Reference< reflection::XInterfaceTypeDescription2 >( xType, UNO_QUERY_THROW ) ); case TypeClass_CONSTANT: return get_type( |