summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGergo Mocsi <gmocsi91@gmail.com>2013-06-17 13:07:05 +0200
committerGergo Mocsi <gmocsi91@gmail.com>2013-06-17 13:07:05 +0200
commit809edacfabfbb5b6cc0bac335aa8f62367948b4b (patch)
tree68814c6cbf1cbd72306b669a7a2325a66daf2400
parent018c22d37878f1fc349085143ee4241165a4802a (diff)
GSOC work week 0-1, allowing BASIC to recognize UNO interfaces
Introduced a new function calles IsUnoInterface in SbiParser to determine, if a variable is a type of an UNO interface. It uses reflection.CoreReflection to do that, on success it returs true otherwise false. Change-Id: I18895127bcbd92dc7a25feb5d82a7d1343bde851
-rw-r--r--basic/source/comp/dim.cxx40
-rw-r--r--basic/source/inc/parser.hxx1
2 files changed, 39 insertions, 2 deletions
diff --git a/basic/source/comp/dim.cxx b/basic/source/comp/dim.cxx
index 81f6effee2bf..609436944b63 100644
--- a/basic/source/comp/dim.cxx
+++ b/basic/source/comp/dim.cxx
@@ -20,7 +20,17 @@
#include <basic/sbx.hxx>
#include "sbcomp.hxx"
#include "sbunoobj.hxx"
-
+#include <svtools/miscopt.hxx>
+#include "com/sun/star/reflection/XIdlReflection.hpp"
+#include <comphelper/namedvaluecollection.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/configurationhelper.hxx>
+#include "com/sun/star/reflection/XInterfaceMemberTypeDescription.hpp"
+#include "com/sun/star/reflection/XIdlMethod.hpp"
+#include "com/sun/star/uno/Exception.hpp"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
SbxObject* cloneTypeObjectImpl( const SbxObject& rTypeObj );
@@ -197,6 +207,7 @@ void SbiParser::DefVar( SbiOpcode eOp, bool bStatic )
bool bSwitchPool = false;
bool bPersistantGlobal = false;
SbiToken eFirstTok = eCurTok;
+ SvtMiscOptions aMiscOptions;
if( pProc && ( eCurTok == GLOBAL || eCurTok == PUBLIC || eCurTok == PRIVATE ) )
Error( SbERR_NOT_IN_SUBR, eCurTok );
if( eCurTok == PUBLIC || eCurTok == GLOBAL )
@@ -391,7 +402,7 @@ void SbiParser::DefVar( SbiOpcode eOp, bool bStatic )
if( !bCompatible && !pDef->IsNew() )
{
OUString aTypeName( aGblStrings.Find( pDef->GetTypeId() ) );
- if( rTypeArray->Find( aTypeName, SbxCLASS_OBJECT ) == NULL )
+ if( rTypeArray->Find( aTypeName, SbxCLASS_OBJECT ) == NULL && (aMiscOptions.IsExperimentalMode() && !IsUnoInterface(aTypeName)))
{
Error( SbERR_UNDEF_TYPE, aTypeName );
}
@@ -1311,4 +1322,29 @@ void SbiParser::DefStatic( bool bPrivate )
}
}
+bool SbiParser::IsUnoInterface(const OUString& sTypeName)
+{
+ try
+ {
+ Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), UNO_SET_THROW );
+ Reference< reflection::XIdlReflection > xRefl( xFactory->createInstance("com.sun.star.reflection.CoreReflection"), UNO_QUERY_THROW );
+ //DBG_ASSERT(xRefl.Is(), "No reflection class!"); ???
+ if( !xRefl.is() )
+ {
+ return false;
+ }
+ Reference< reflection::XIdlClass > xClass = xRefl->forName(sTypeName);
+ if( xClass != NULL )
+ {
+ return true;
+ }
+ return false;
+ }
+ catch(const Exception& ex)
+ {
+ OSL_FAIL("Could not create reflection.CoreReflection.");
+ }
+ return false;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basic/source/inc/parser.hxx b/basic/source/inc/parser.hxx
index d6c14a6b27ee..0ab6bcbb533b 100644
--- a/basic/source/inc/parser.hxx
+++ b/basic/source/inc/parser.hxx
@@ -57,6 +57,7 @@ class SbiParser : public SbiTokenizer
void DefEnum( bool bPrivate ); // Parse enum declaration
void DefDeclare( bool bPrivate );
void EnableCompatibility();
+ bool IsUnoInterface(const OUString& sTypeName);
public:
SbxArrayRef rTypeArray;
SbxArrayRef rEnumArray;