[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