[Libreoffice-commits] core.git: Branch 'feature/gsoc-basic-ide-completion-and-other-bits' - basic/source
Gergo Mocsi
gmocsi91 at gmail.com
Mon Jun 17 04:20:47 PDT 2013
basic/source/comp/dim.cxx | 40 ++++++++++++++++++++++++++++++++++++++--
basic/source/inc/parser.hxx | 1 +
2 files changed, 39 insertions(+), 2 deletions(-)
New commits:
commit 809edacfabfbb5b6cc0bac335aa8f62367948b4b
Author: Gergo Mocsi <gmocsi91 at gmail.com>
Date: Mon Jun 17 13:07:05 2013 +0200
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
diff --git a/basic/source/comp/dim.cxx b/basic/source/comp/dim.cxx
index 81f6eff..6094369 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 d6c14a6..0ab6bcb 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;
More information about the Libreoffice-commits
mailing list