summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGergo Mocsi <gmocsi91@gmail.com>2013-06-21 14:10:31 +0200
committerGergo Mocsi <gmocsi91@gmail.com>2013-09-02 18:16:42 +0200
commit025e7ff3e16650097097b6a17cd259170979ef3c (patch)
tree48dead1451a86797889d73a347048418faceb9a7
parentf97d794654cbf80afa0e4a60cda8147e94c11908 (diff)
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
-rw-r--r--basctl/source/basicide/baside2.hxx2
-rw-r--r--basctl/source/basicide/baside2b.cxx44
-rw-r--r--basic/source/classes/sb.cxx1
-rw-r--r--basic/source/classes/sbxmod.cxx47
-rw-r--r--basic/source/comp/dim.cxx2
-rw-r--r--basic/source/comp/parser.cxx1
-rw-r--r--basic/source/comp/sbcomp.cxx2
-rw-r--r--include/basic/sbmod.hxx9
8 files changed, 106 insertions, 2 deletions
diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx
index c02f502e7a58..fb48ae3202d4 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 2347616bdb48..b6ddc4d6dd4d 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
{
@@ -479,6 +486,7 @@ bool EditorWindow::ImpCanModify()
void EditorWindow::KeyInput( const KeyEvent& rKEvt )
{
+ SvtMiscOptions aMiscOptions;
if ( !pEditView ) // Happens in Win95
return;
@@ -492,7 +500,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() &&
@@ -752,14 +784,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 298712372ccd..3bd3fd60ce84 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 28d10e290b01..c5608a877fc7 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 609436944b63..8da4d1e13c3c 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 d61f33444a7b..018b2938ee84 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 32cdabc7067b..e4d95f1dfb85 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 f94e2c9e8a36..446397716dec 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)