[Libreoffice-commits] core.git: Branch 'feature/gsoc-basic-ide-completion-and-other-bits' - basctl/source basic/source include/basic

Gergo Mocsi gmocsi91 at gmail.com
Fri Jun 21 05:24:00 PDT 2013


 basctl/source/basicide/baside2.hxx  |    2 -
 basctl/source/basicide/baside2b.cxx |   53 ++++++++++++++++++++++++++++++++++++
 basic/source/classes/sb.cxx         |    1 
 basic/source/classes/sbxmod.cxx     |   47 +++++++++++++++++++++++++++++++
 basic/source/comp/dim.cxx           |    2 +
 basic/source/comp/parser.cxx        |    1 
 basic/source/comp/sbcomp.cxx        |    2 -
 include/basic/sbmod.hxx             |    9 ++++++
 8 files changed, 115 insertions(+), 2 deletions(-)

New commits:
commit 035be6eb0de0b02796ee73940817278f5007e112
Author: Gergo Mocsi <gmocsi91 at gmail.com>
Date:   Fri Jun 21 14:10:31 2013 +0200

    GSOC work week 2, getting infromation from variables and print on terminal
    
    This is an early version. I use the BASIC parser to parse the source,
    then the infromation is extracted from the symbol table built by parser.
    Error reporting is suppressed, beacuse it is not needed fro code completition.
    I placed my function inside SbModule, and created a struct called CodeCompletitionData, which holds the object's name, it's parent, and it's type name.
    This function, SbMethod::GetCodeCompleteDataFromParse() is called from Basic IDE's Notify function, which updates a cache(actually, reassigns a viariable :) ).
    Later, in the EditorWindow::KeyInput function there is a check wheteher dot key is pressed. After that, the actual variable (or word) is being looked up in the vector that holds code completition data. And finally, if it is found, it's methods are printed on the terminal.
    
    Change-Id: Idaf19baa8f720b8b117a76dc3cc2f90dd04fd155

diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx
index c02f502..fb48ae3 100644
--- a/basctl/source/basicide/baside2.hxx
+++ b/basctl/source/basicide/baside2.hxx
@@ -67,7 +67,6 @@ DBG_NAMEEX( ModulWindow )
 OUString getTextEngineText (ExtTextEngine&);
 void setTextEngineText (ExtTextEngine&, OUString const&);
 
-
 class EditorWindow : public Window, public SfxListener
 {
 private:
@@ -109,6 +108,7 @@ private:
     virtual
     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >
     GetComponentInterface(sal_Bool bCreate = true);
+    std::vector< CodeCompleteData > aCodeCompleteCache;
 
 protected:
     virtual void    Paint( const Rectangle& );
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index 7b7e3c7..afde040 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -48,6 +48,13 @@
 #include <vcl/help.hxx>
 
 #include <vector>
+#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"
 
 namespace basctl
 {
@@ -424,7 +431,11 @@ void EditorWindow::MouseButtonUp( const MouseEvent &rEvt )
     {
         pEditView->MouseButtonUp( rEvt );
         if (SfxBindings* pBindings = GetBindingsPtr())
+        {
+            pBindings->Invalidate( SID_COPY );
+            pBindings->Invalidate( SID_CUT );
             pBindings->Invalidate( SID_BASICIDE_STAT_POS );
+        }
     }
 }
 
@@ -469,6 +480,7 @@ bool EditorWindow::ImpCanModify()
 
 void EditorWindow::KeyInput( const KeyEvent& rKEvt )
 {
+    SvtMiscOptions aMiscOptions;
     if ( !pEditView )   // Happens in Win95
         return;
 
@@ -482,7 +494,31 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
     bool const bWasModified = pEditEngine->IsModified();
     // see if there is an accelerator to be processed first
     bool bDone = SfxViewShell::Current()->KeyInput( rKEvt );
+    if( rKEvt.GetKeyCode().GetCode() == KEY_POINT && aMiscOptions.IsExperimentalMode())
+    {
+        TextSelection aSel = GetEditView()->GetSelection();
+        sal_uLong nLine =  aSel.GetStart().GetPara();
+        OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
 
+        OUString aStr = (aLine.lastIndexOf(" ") == -1 ? aLine.replaceFirst(".","") : aLine.copy(aLine.lastIndexOf(" ")).replaceFirst(".",""));
+        for( unsigned int j = 0; j < aCodeCompleteCache.size(); ++j)
+        {
+            if( aCodeCompleteCache[j].sVarName == aStr )
+            {
+                Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), UNO_SET_THROW );
+                Reference< reflection::XIdlReflection > xRefl( xFactory->createInstance("com.sun.star.reflection.CoreReflection"), UNO_QUERY_THROW );
+                Reference< reflection::XIdlClass > xClass = xRefl->forName(aCodeCompleteCache[j].sVarType);
+                if( !xRefl.is() )
+                    break;
+                Sequence< Reference< reflection::XIdlMethod > > aMethods = xClass->getMethods();
+                for(sal_Int32 i = 0; i < aMethods.getLength(); ++i)
+                {
+                    SAL_WARN("method information",aMethods[i]->getName());
+                }
+                break;
+            }
+        }
+    }
     if ( !bDone && ( !TextEngine::DoesKeyChangeText( rKEvt ) || ImpCanModify()  ) )
     {
         if ( ( rKEvt.GetKeyCode().GetCode() == KEY_TAB ) && !rKEvt.GetKeyCode().IsMod1() &&
@@ -511,15 +547,20 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
     {
         if (SfxBindings* pBindings = GetBindingsPtr())
         {
+            pBindings->Invalidate( SID_CUT );
+            pBindings->Invalidate( SID_COPY );
             pBindings->Invalidate( SID_BASICIDE_STAT_POS );
+
             if ( rKEvt.GetKeyCode().GetGroup() == KEYGROUP_CURSOR )
                 pBindings->Update( SID_BASICIDE_STAT_POS );
+
             if ( !bWasModified && pEditEngine->IsModified() )
             {
                 pBindings->Invalidate( SID_SAVEDOC );
                 pBindings->Invalidate( SID_DOC_MODIFIED );
                 pBindings->Invalidate( SID_UNDO );
             }
+
             if ( rKEvt.GetKeyCode().GetCode() == KEY_INSERT )
                 pBindings->Invalidate( SID_ATTR_INSERT );
         }
@@ -737,14 +778,26 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
         {
             ParagraphInsertedDeleted( rTextHint.GetValue(), true );
             DoDelayedSyntaxHighlight( rTextHint.GetValue() );
+            OUString sMod = rModulWindow.GetSbModule()->GetSource();
+            OUString sActLine = pEditEngine->GetText( rTextHint.GetValue() );
+            std::vector< CodeCompleteData > aData = rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse();
+            aCodeCompleteCache = aData;
         }
         else if( rTextHint.GetId() == TEXT_HINT_PARAREMOVED )
         {
             ParagraphInsertedDeleted( rTextHint.GetValue(), false );
+            OUString sMod = rModulWindow.GetSbModule()->GetSource();
+            OUString sActLine = pEditEngine->GetText( rTextHint.GetValue() );
+            std::vector< CodeCompleteData > aData = rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse();
+            aCodeCompleteCache = aData;
         }
         else if( rTextHint.GetId() == TEXT_HINT_PARACONTENTCHANGED )
         {
             DoDelayedSyntaxHighlight( rTextHint.GetValue() );
+            OUString sMod = rModulWindow.GetSbModule()->GetSource();
+            OUString sActLine = pEditEngine->GetText( rTextHint.GetValue() );
+            std::vector< CodeCompleteData > aData = rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse();
+            aCodeCompleteCache = aData;
         }
         else if( rTextHint.GetId() == TEXT_HINT_VIEWSELECTIONCHANGED )
         {
diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 09746ad..c84e0e2 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -50,6 +50,7 @@
 
 #include <com/sun/star/script/ModuleType.hpp>
 #include <com/sun/star/script/ModuleInfo.hpp>
+#include <svtools/miscopt.hxx>
 using namespace ::com::sun::star::script;
 
 TYPEINIT1(StarBASIC,SbxObject)
diff --git a/basic/source/classes/sbxmod.cxx b/basic/source/classes/sbxmod.cxx
index 28d10e2..c5608a8 100644
--- a/basic/source/classes/sbxmod.cxx
+++ b/basic/source/classes/sbxmod.cxx
@@ -83,6 +83,7 @@ using namespace com::sun::star::uno;
 #include <com/sun/star/awt/XControl.hpp>
 #include <comphelper/anytostring.hxx>
 #include <ooo/vba/VbQueryClose.hpp>
+#include "sbcomp.hxx"
 
 typedef ::cppu::WeakImplHelper1< XInvocation > DocObjectWrapper_BASE;
 typedef ::std::map< sal_Int16, Any, ::std::less< sal_Int16 > > OutParamMap;
@@ -1776,6 +1777,52 @@ IMPL_LINK( ErrorHdlResetter, BasicErrorHdl, StarBASIC *, /*pBasic*/)
     return 0;
 }
 
+
+std::vector< CodeCompleteData > SbModule::GetCodeCompleteDataFromParse()
+{
+    ErrorHdlResetter aErrHdl;
+    StarBASIC* pBasic = PTR_CAST(StarBASIC,GetParent());
+    SbxBase::ResetError();
+    SbModule* pOld = GetSbData()->pCompMod;
+    GetSbData()->pCompMod = this;
+
+    SbiParser* pParser = new SbiParser( (StarBASIC*) GetParent(), this );
+
+    while( pParser->Parse() ) {}
+    SbiSymPool* pPool = pParser->pPool;
+    std::vector< CodeCompleteData > aRet;
+    for( sal_uInt16 i = 0; i < pPool->GetSize(); ++i )
+    {
+        SbiSymDef* pSymDef = pPool->Get(i);
+        if( pSymDef->GetType() == SbxOBJECT )
+        {
+            CodeCompleteData aCodeCompleteData;
+            aCodeCompleteData.sVarName = pSymDef->GetName();
+            aCodeCompleteData.sVarParent = OUString("");
+            aCodeCompleteData.sVarType = pParser->aGblStrings.Find( pSymDef->GetTypeId() );
+            if(!aCodeCompleteData.sVarType.isEmpty())
+                aRet.push_back(aCodeCompleteData);
+        }
+
+        SbiSymPool& pChildPool = pSymDef->GetPool();
+        for(sal_uInt16 j = 0; j < pChildPool.GetSize(); ++j )
+        {
+            CodeCompleteData aCodeCompleteData;
+            SbiSymDef* pChildSymDef = pChildPool.Get(j);
+            if( pChildSymDef->GetType() == SbxOBJECT )
+            {
+                aCodeCompleteData.sVarName = pChildSymDef->GetName();
+                aCodeCompleteData.sVarParent = pSymDef->GetName();
+                aCodeCompleteData.sVarType = pParser->aGblStrings.Find( pChildSymDef->GetTypeId() );
+                if(!aCodeCompleteData.sVarType.isEmpty())
+                    aRet.push_back(aCodeCompleteData);
+            }
+        }
+    }
+    delete pParser;
+    return aRet;
+}
+
 bool SbModule::HasExeCode()
 {
     // And empty Image always has the Global Chain set up
diff --git a/basic/source/comp/dim.cxx b/basic/source/comp/dim.cxx
index 6094369..8da4d1e 100644
--- a/basic/source/comp/dim.cxx
+++ b/basic/source/comp/dim.cxx
@@ -307,6 +307,8 @@ void SbiParser::DefVar( SbiOpcode eOp, bool bStatic )
     bool bDefined = false;
     while( ( pDef = VarDecl( &pDim, bStatic, bConst ) ) != NULL )
     {
+        /*fprintf(stderr, "Actual sub: \n");
+        fprintf(stderr, "Symbol name: %s\n",OUStringToOString(pDef->GetName(),RTL_TEXTENCODING_UTF8).getStr());*/
         EnableErrors();
         // search variable:
         if( bSwitchPool )
diff --git a/basic/source/comp/parser.cxx b/basic/source/comp/parser.cxx
index bb53d93..80d0523 100644
--- a/basic/source/comp/parser.cxx
+++ b/basic/source/comp/parser.cxx
@@ -20,6 +20,7 @@
 #include <basic/sbx.hxx>
 #include "sbcomp.hxx"
 #include <com/sun/star/script/ModuleType.hpp>
+#include <svtools/miscopt.hxx>
 
 struct SbiParseStack {              // "Stack" for statement-blocks
     SbiParseStack* pNext;           // Chain
diff --git a/basic/source/comp/sbcomp.cxx b/basic/source/comp/sbcomp.cxx
index 20d5262..99af0d3 100644
--- a/basic/source/comp/sbcomp.cxx
+++ b/basic/source/comp/sbcomp.cxx
@@ -22,6 +22,7 @@
 #include "sbcomp.hxx"
 #include "image.hxx"
 #include <basic/sbobjmod.hxx>
+#include <svtools/miscopt.hxx>
 #include <stdio.h>
 
 // To activate tracing enable in sbtrace.hxx
@@ -993,5 +994,4 @@ sal_Bool SbModule::Compile()
 
     return bRet;
 }
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/basic/sbmod.hxx b/include/basic/sbmod.hxx
index f94e2c9..4463977 100644
--- a/include/basic/sbmod.hxx
+++ b/include/basic/sbmod.hxx
@@ -39,10 +39,18 @@ class SbProcedureProperty;
 class SbIfaceMapperMethod;
 class SbClassModuleObject;
 
+
 class ModuleInitDependencyMap;
 struct ClassModuleRunInitItem;
 struct SbClassData;
 
+struct CodeCompleteData
+{
+    OUString sVarName;
+    OUString sVarParent;
+    OUString sVarType;
+};
+
 class BASIC_DLLPUBLIC SbModule : public SbxObject, private ::boost::noncopyable
 {
     friend class    SbiCodeGen;
@@ -132,6 +140,7 @@ public:
     void     RemoveVars();
     ::com::sun::star::uno::Reference< ::com::sun::star::script::XInvocation > GetUnoModule();
     bool createCOMWrapperForIface( ::com::sun::star::uno::Any& o_rRetAny, SbClassModuleObject* pProxyClassModuleObject );
+    std::vector< CodeCompleteData > GetCodeCompleteDataFromParse();
 };
 
 SV_DECL_IMPL_REF(SbModule)


More information about the Libreoffice-commits mailing list