[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
Wed Jul 24 08:35:13 PDT 2013
basctl/source/basicide/baside2b.cxx | 36 ++---------
basctl/source/basicide/codecompleteoptionsdlg.cxx | 5 -
basic/source/classes/codecompletecache.cxx | 68 ++++++++++++++++------
basic/source/classes/sbxmod.cxx | 41 ++++++++-----
include/basic/codecompletecache.hxx | 11 +--
include/basic/sbmod.hxx | 3
6 files changed, 95 insertions(+), 69 deletions(-)
New commits:
commit fd35319cbf96e215cf52db70d947ff0b5cf96948
Author: Gergo Mocsi <gmocsi91 at gmail.com>
Date: Wed Jul 24 17:27:02 2013 +0200
GSOC work, cache implementation fix, code fixes
The CodeCompleteDataCache got a new implementation: global variables are stored separately.
The "static const" OUString-s were removed from the class.
Data extraction is only done when pressing the dot key.
Change-Id: I3ff94c0c6eabe328761336d4c74744eb7efc6056
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index 8c5f6212..d561997 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -502,10 +502,11 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
if( rKEvt.GetKeyCode().GetCode() == KEY_POINT && CodeCompleteOptions::IsCodeCompleteOn() )
{
rModulWindow.UpdateModule();
+ rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse(aCodeCompleteCache);
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
- OUString sActSub = GetActualSubName( nLine );
+ //OUString sActSub = GetActualSubName( nLine );
std::vector< OUString > aVect;
HighlightPortions aPortions;
@@ -517,9 +518,7 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
aVect.push_back( aLine.copy(r.nBegin, r.nEnd - r.nBegin) );
}
OUString sBaseName = aVect[0];//variable name
- OUString sVarType = aCodeCompleteCache.GetVariableType(sBaseName, CodeCompleteDataCache::GLOB_KEY);
- if( sVarType == CodeCompleteDataCache::NOT_FOUND )
- sVarType = aCodeCompleteCache.GetVariableType(sBaseName, sActSub);
+ OUString sVarType = aCodeCompleteCache.GetVarType( sBaseName );
Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), UNO_SET_THROW );
Reference< reflection::XIdlReflection > xRefl( xFactory->createInstance("com.sun.star.reflection.CoreReflection"), UNO_QUERY_THROW );
@@ -827,20 +826,10 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
{
ParagraphInsertedDeleted( rTextHint.GetValue(), true );
DoDelayedSyntaxHighlight( rTextHint.GetValue() );
- if( CodeCompleteOptions::IsCodeCompleteOn() )
- {
- rModulWindow.UpdateModule();
- aCodeCompleteCache.SetVars(rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse().GetVars());
- }
}
else if( rTextHint.GetId() == TEXT_HINT_PARAREMOVED )
{
ParagraphInsertedDeleted( rTextHint.GetValue(), false );
- if( CodeCompleteOptions::IsCodeCompleteOn() )
- {
- rModulWindow.UpdateModule();
- aCodeCompleteCache.SetVars(rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse().GetVars());
- }
}
else if( rTextHint.GetId() == TEXT_HINT_PARACONTENTCHANGED )
{
@@ -854,11 +843,6 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
pBindings->Invalidate( SID_COPY );
}
}
- else if( rTextHint.GetId() == TEXT_HINT_MODIFIED && CodeCompleteOptions::IsCodeCompleteOn() )
- {
- rModulWindow.UpdateModule();
- aCodeCompleteCache.SetVars(rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse().GetVars());
- }
}
}
@@ -876,12 +860,11 @@ OUString EditorWindow::GetActualSubName( sal_uLong nLine )
pMeth->GetLineRange(l1,l2);
if( (l1 <= nLine+1) && (nLine+1 <= l2) )
{
- //std::cerr << "sName: " << sName << std::endl;
return sName;
}
}
}
- return CodeCompleteDataCache::GLOB_KEY;
+ return OUString("");
}
void EditorWindow::SetScrollBarRanges()
@@ -2374,7 +2357,7 @@ IMPL_LINK_NOARG(CodeCompleteListBox, ImplDoubleClickHdl)
void CodeCompleteListBox::InsertSelectedEntry()
{
- if( aFuncBuffer.toString() != OUString("") )
+ if( !aFuncBuffer.toString().isEmpty() )
{
// if the user typed in something: remove, and insert
TextPaM aEnd(pCodeCompleteWindow->aTextSelection.GetEnd().GetPara(), pCodeCompleteWindow->GetTextSelection().GetEnd().GetIndex() + aFuncBuffer.getLength());
@@ -2382,7 +2365,7 @@ void CodeCompleteListBox::InsertSelectedEntry()
pCodeCompleteWindow->pParent->GetEditView()->SetSelection(TextSelection(aStart, aEnd));
pCodeCompleteWindow->pParent->GetEditView()->DeleteSelected();
- if( GetEntry( GetSelectEntryPos() ) != OUString("") )
+ if( !((OUString) GetEntry( GetSelectEntryPos() )).isEmpty() )
{//if the user selected something
pCodeCompleteWindow->pParent->GetEditView()->InsertText( (OUString) GetEntry(GetSelectEntryPos()), sal_True );
pCodeCompleteWindow->Hide();
@@ -2398,7 +2381,7 @@ void CodeCompleteListBox::InsertSelectedEntry()
}
else
{
- if( GetEntry( GetSelectEntryPos() ) != OUString("") )
+ if( !((OUString) GetEntry( GetSelectEntryPos() )).isEmpty() )
{//if the user selected something
pCodeCompleteWindow->pParent->GetEditView()->InsertText( (OUString) GetEntry(GetSelectEntryPos()), sal_True );
pCodeCompleteWindow->Hide();
@@ -2427,9 +2410,6 @@ long CodeCompleteListBox::PreNotify( NotifyEvent& rNEvt )
{
case KEY_ESCAPE: // hide, do nothing
pCodeCompleteWindow->ClearAndHide();
- /*pCodeCompleteWindow->Hide();
- pCodeCompleteWindow->pParent->GetEditView()->SetSelection( pCodeCompleteWindow->pParent->GetEditView()->CursorEndOfLine(pCodeCompleteWindow->GetTextSelection().GetStart()) );
- //pCodeCompleteWindow->pParent->GrabFocus();*/
return 0;
case KEY_TAB: case KEY_SPACE:
/* space, tab the user probably have typed in the whole
@@ -2522,7 +2502,7 @@ void CodeCompleteWindow::ResizeListBox()
aLongestEntry = pListBox->GetEntry( i );
}
- Size aSize = pListBox->GetOptimalSize();
+ Size aSize = pListBox->CalcSize( aLongestEntry.getLength(), std::min( (sal_uInt16) 4, pListBox->GetEntryCount()) );
const Font& aFont = pListBox->GetUnzoomedControlPointFont();
aSize.setHeight( aFont.GetSize().getHeight() * 16 );
diff --git a/basctl/source/basicide/codecompleteoptionsdlg.cxx b/basctl/source/basicide/codecompleteoptionsdlg.cxx
index a948ab6..96d1ca7 100644
--- a/basctl/source/basicide/codecompleteoptionsdlg.cxx
+++ b/basctl/source/basicide/codecompleteoptionsdlg.cxx
@@ -40,9 +40,9 @@ CodeCompleteOptionsDlg::CodeCompleteOptionsDlg( Window* pWindow )
pOkBtn->SetClickHdl( LINK( this, CodeCompleteOptionsDlg, OkHdl ) );
pCancelBtn->SetClickHdl( LINK( this, CodeCompleteOptionsDlg, CancelHdl ) );
- pCodeCompleteChk->Check(CodeCompleteOptions::IsCodeCompleteOn()); //set it on, if needed
+ pCodeCompleteChk->Check( CodeCompleteOptions::IsCodeCompleteOn() );
+ pAutocloseProcChk->Check( CodeCompleteOptions::IsProcedureAutoCompleteOn() );
- pAutocloseProcChk->Enable( false );
pAutocloseBracesChk->Enable( false );
pAutocloseQuotesChk->Enable( false );
}
@@ -54,6 +54,7 @@ CodeCompleteOptionsDlg::~CodeCompleteOptionsDlg()
IMPL_LINK_NOARG(CodeCompleteOptionsDlg, OkHdl)
{
CodeCompleteOptions::SetCodeCompleteOn( pCodeCompleteChk->IsChecked() );
+ CodeCompleteOptions::SetProcedureAutoCompleteOn( pCodeCompleteChk->IsChecked() );
Close();
return 0;
}
diff --git a/basic/source/classes/codecompletecache.cxx b/basic/source/classes/codecompletecache.cxx
index 3898eb2..cb5d4db 100644
--- a/basic/source/classes/codecompletecache.cxx
+++ b/basic/source/classes/codecompletecache.cxx
@@ -21,9 +21,6 @@
#include <iostream>
#include <rtl/instance.hxx>
-const OUString CodeCompleteDataCache::GLOB_KEY = OUString("global key");
-const OUString CodeCompleteDataCache::NOT_FOUND = OUString("not found");
-
namespace
{
class theCodeCompleteOptions: public ::rtl::Static< CodeCompleteOptions, theCodeCompleteOptions >{};
@@ -62,6 +59,12 @@ void CodeCompleteOptions::SetProcedureAutoCompleteOn( const bool& b )
std::ostream& operator<< (std::ostream& aStream, const CodeCompleteDataCache& aCache)
{
+ aStream << "Global variables" << std::endl;
+ for(CodeCompleteVarTypes::const_iterator aIt = aCache.aGlobalVars.begin(); aIt != aCache.aGlobalVars.end(); ++aIt )
+ {
+ aStream << aIt->first << "," << aIt->second << std::endl;
+ }
+ aStream << "Local variables" << std::endl;
for( CodeCompleteVarScopes::const_iterator aIt = aCache.aVarScopes.begin(); aIt != aCache.aVarScopes.end(); ++aIt )
{
aStream << aIt->first << std::endl;
@@ -80,32 +83,61 @@ const CodeCompleteVarScopes& CodeCompleteDataCache::GetVars() const
return aVarScopes;
}
-void CodeCompleteDataCache::InsertProcedure( const OUString& sProcName, const CodeCompleteVarTypes& aVarTypes )
-{
- aVarScopes.insert( CodeCompleteVarScopes::value_type(sProcName, aVarTypes) );
-}
void CodeCompleteDataCache::SetVars( const CodeCompleteVarScopes& aScopes )
{
aVarScopes = aScopes;
}
-OUString CodeCompleteDataCache::GetVariableType( const OUString& sVarName, const OUString& sProcName ) const
+void CodeCompleteDataCache::print() const
{
- CodeCompleteVarScopes::const_iterator aIt = aVarScopes.find( sProcName );
- if( aIt == aVarScopes.end() )//procedure does not exist
- return CodeCompleteDataCache::NOT_FOUND;
+ std::cerr << *this << std::endl;
+}
+
+void CodeCompleteDataCache::Clear()
+{
+ aVarScopes.clear();
+}
+
+void CodeCompleteDataCache::InsertGlobalVar( const OUString& sVarName, const OUString& sVarType )
+{
+ aGlobalVars.insert( CodeCompleteVarTypes::value_type(sVarName, sVarType) );
+}
- CodeCompleteVarTypes aVarTypes = aIt->second;
- CodeCompleteVarTypes::const_iterator aOtherIt = aVarTypes.find( sVarName );
- if( aOtherIt == aVarTypes.end() )
- return CodeCompleteDataCache::NOT_FOUND;
+void CodeCompleteDataCache::InsertLocalVar( const OUString& sProcName, const OUString& sVarName, const OUString& sVarType )
+{
+ CodeCompleteVarScopes::const_iterator aIt = aVarScopes.find( sProcName );
+ if( aIt == aVarScopes.end() ) //new procedure
+ {
+ CodeCompleteVarTypes aTypes;
+ aTypes.insert( CodeCompleteVarTypes::value_type(sVarName, sVarType) );
+ aVarScopes.insert( CodeCompleteVarScopes::value_type(sProcName, aTypes) );
+ }
else
- return aOtherIt->second;
+ {
+ CodeCompleteVarTypes aTypes = aVarScopes[ sProcName ];
+ aTypes.insert( CodeCompleteVarTypes::value_type(sVarName, sVarType) );
+ aVarScopes[ sProcName ] = aTypes;
+ }
}
-void CodeCompleteDataCache::print() const
+OUString CodeCompleteDataCache::GetVarType( const OUString& sVarName )
{
- std::cerr << *this << std::endl;
+ for( CodeCompleteVarScopes::const_iterator aIt = aVarScopes.begin(); aIt != aVarScopes.end(); ++aIt )
+ {
+ CodeCompleteVarTypes aTypes = aIt->second;
+ for( CodeCompleteVarTypes::const_iterator aOtherIt = aTypes.begin(); aOtherIt != aTypes.end(); ++aOtherIt )
+ {
+ if( aOtherIt->first == sVarName )
+ return aOtherIt->second;
+ }
+ }
+ //not a local, search global scope
+ for( CodeCompleteVarTypes::const_iterator aIt = aGlobalVars.begin(); aIt != aGlobalVars.end(); ++aIt )
+ {
+ if( aIt->first == sVarName )
+ return aIt->second;
+ }
+ return OUString(""); //not found
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basic/source/classes/sbxmod.cxx b/basic/source/classes/sbxmod.cxx
index cbe5886..694fbf3 100644
--- a/basic/source/classes/sbxmod.cxx
+++ b/basic/source/classes/sbxmod.cxx
@@ -90,9 +90,6 @@ typedef ::std::map< sal_Int16, Any, ::std::less< sal_Int16 > > OutParamMap;
::com::sun::star::uno::Any sbxToUnoValue( SbxVariable* pVar );
void unoToSbxValue( SbxVariable* pVar, const ::com::sun::star::uno::Any& aValue );
-/*const OUString CodeCompleteDataCache::GLOB_KEY = OUString("global key");
-const OUString CodeCompleteDataCache::NOT_FOUND = OUString("not found");*/
-
class DocObjectWrapper : public DocObjectWrapper_BASE
{
Reference< XAggregation > m_xAggProxy;
@@ -672,7 +669,6 @@ void SbModule::EndDefinitions( sal_Bool bNewState )
{
if( p->bInvalid )
{
- std::cerr << "invalid definition: " << p->GetName() << std::endl;
pMethods->Remove( p );
}
else
@@ -941,12 +937,15 @@ void SbModule::SetSource32( const OUString& r )
}
// Definition of the method
SbMethod* pMeth = NULL;
+ OUString sMethName;
if( eEndTok != NIL )
{
sal_uInt16 nLine1 = aTok.GetLine();
if( aTok.Next() == SYMBOL )
{
OUString aName_( aTok.GetSym() );
+ //std::cerr << "method name: " << aName_ << std::endl;
+ sMethName = aName_;
SbxDataType t = aTok.GetType();
if( t == SbxVARIANT && eEndTok == ENDSUB )
{
@@ -970,12 +969,25 @@ void SbModule::SetSource32( const OUString& r )
if( aTok.Next() == eEndTok )
{
pMeth->nLine2 = aTok.GetLine();
+ //std::cerr << "there is end for "<< sMethName << std::endl;
break;
}
}
if( aTok.IsEof() )
{
pMeth->nLine2 = aTok.GetLine();
+ std::cerr << "EOF reached, no end for "<< sMethName <<", line " << aTok.GetLine() << std::endl;
+ //std::cerr << "write end to: " << aOUSource.getLength() / pMeth->nLine2 << std::endl;
+ sal_Int32 nPos=0;
+ sal_Int32 nCounter = 0;
+ std::cerr << "source length: " << aOUSource.getLength() << std::endl;
+ for(sal_uInt32 i=0; i < aOUSource.getLength() ; ++i)
+ {
+ nPos++;
+ if( aOUSource[i] == '\n' && nCounter != aTok.GetLine() )
+ nCounter++;
+ }
+ std::cerr << "newline index: " << nPos << std::endl;
}
}
}
@@ -1783,9 +1795,8 @@ IMPL_LINK( ErrorHdlResetter, BasicErrorHdl, StarBASIC *, /*pBasic*/)
return 0;
}
-CodeCompleteDataCache SbModule::GetCodeCompleteDataFromParse()
+void SbModule::GetCodeCompleteDataFromParse(CodeCompleteDataCache& aCache)
{
- CodeCompleteDataCache aCache;
ErrorHdlResetter aErrHdl;
SbxBase::ResetError();
@@ -1794,7 +1805,8 @@ CodeCompleteDataCache SbModule::GetCodeCompleteDataFromParse()
while( pParser->Parse() ) {}
SbiSymPool* pPool = pParser->pPool;
- CodeCompleteVarTypes aGlobVarTypes;
+ //CodeCompleteVarTypes aGlobVarTypes;
+ aCache.Clear();
for( sal_uInt16 i = 0; i < pPool->GetSize(); ++i )
{
SbiSymDef* pSymDef = pPool->Get(i);
@@ -1802,13 +1814,13 @@ CodeCompleteDataCache SbModule::GetCodeCompleteDataFromParse()
{
if( !pParser->aGblStrings.Find( pSymDef->GetTypeId() ).isEmpty() )
{
- //std::cerr << "global " << pSymDef->GetName() << std::endl;
- aGlobVarTypes.insert( CodeCompleteVarTypes::value_type( pSymDef->GetName(), pParser->aGblStrings.Find( pSymDef->GetTypeId() ) ) );
+ //aGlobVarTypes.insert( CodeCompleteVarTypes::value_type( pSymDef->GetName(), pParser->aGblStrings.Find( pSymDef->GetTypeId() ) ) );
+ aCache.InsertGlobalVar( pSymDef->GetName(), pParser->aGblStrings.Find(pSymDef->GetTypeId()) );
}
}
SbiSymPool& pChildPool = pSymDef->GetPool();
- CodeCompleteVarTypes aLocVarTypes;
+ //CodeCompleteVarTypes aLocVarTypes;
for(sal_uInt16 j = 0; j < pChildPool.GetSize(); ++j )
{
SbiSymDef* pChildSymDef = pChildPool.Get(j);
@@ -1816,17 +1828,16 @@ CodeCompleteDataCache SbModule::GetCodeCompleteDataFromParse()
{
if( !pParser->aGblStrings.Find( pChildSymDef->GetTypeId() ).isEmpty() )
{
- //std::cerr << "local " << pChildSymDef->GetName() << std::endl;
- aLocVarTypes.insert( CodeCompleteVarTypes::value_type( pChildSymDef->GetName(), pParser->aGblStrings.Find( pChildSymDef->GetTypeId() ) ) );
+ //aLocVarTypes.insert( CodeCompleteVarTypes::value_type( pChildSymDef->GetName(), pParser->aGblStrings.Find( pChildSymDef->GetTypeId() ) ) );
+ aCache.InsertLocalVar( pSymDef->GetName(), pChildSymDef->GetName(), pParser->aGblStrings.Find(pChildSymDef->GetTypeId()) );
}
}
}
- aCache.InsertProcedure( pSymDef->GetName(), aLocVarTypes );
+ //aCache.InsertProcedure( pSymDef->GetName(), aLocVarTypes );
}
- aCache.InsertProcedure( CodeCompleteDataCache::GLOB_KEY, aGlobVarTypes );
+ //aCache.InsertProcedure( CodeCompleteDataCache::GLOB_KEY, aGlobVarTypes );
delete pParser;
- return aCache;
}
SbxArrayRef SbModule::GetMethods()
diff --git a/include/basic/codecompletecache.hxx b/include/basic/codecompletecache.hxx
index 57ed673..480c3c1 100644
--- a/include/basic/codecompletecache.hxx
+++ b/include/basic/codecompletecache.hxx
@@ -33,6 +33,7 @@ typedef boost::unordered_map< OUString, OUString, OUStringHash > CodeCompleteVar
typedef boost::unordered_map< OUString, CodeCompleteVarTypes, OUStringHash > CodeCompleteVarScopes;
/* procedure, CodeCompleteVarTypes */
+
class BASIC_DLLPUBLIC CodeCompleteOptions
{
/*
@@ -63,11 +64,9 @@ class BASIC_DLLPUBLIC CodeCompleteDataCache
* */
private:
CodeCompleteVarScopes aVarScopes;
+ CodeCompleteVarTypes aGlobalVars;
public:
- static const OUString GLOB_KEY;
- static const OUString NOT_FOUND;
-
CodeCompleteDataCache(){}
virtual ~CodeCompleteDataCache(){}
@@ -76,9 +75,11 @@ public:
void SetVars( const CodeCompleteVarScopes& aScopes );
const CodeCompleteVarScopes& GetVars() const;
- void InsertProcedure( const OUString& sProcName, const CodeCompleteVarTypes& aVarTypes );
- OUString GetVariableType( const OUString& sVarName, const OUString& sProcName ) const;
+ void InsertGlobalVar( const OUString& sVarName, const OUString& sVarType );
+ void InsertLocalVar( const OUString& sProcName, const OUString& sVarName, const OUString& sVarType );
+ OUString GetVarType( const OUString& sVarName );
void print() const; // wrapper for operator<<, prints to std::cerr
+ void Clear();
};
#endif // CODECOMPLETECACHE_H
diff --git a/include/basic/sbmod.hxx b/include/basic/sbmod.hxx
index 5a77cfb..b3e694b 100644
--- a/include/basic/sbmod.hxx
+++ b/include/basic/sbmod.hxx
@@ -152,7 +152,8 @@ 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 );
- CodeCompleteDataCache GetCodeCompleteDataFromParse();
+ //CodeCompleteDataCache GetCodeCompleteDataFromParse();
+ void GetCodeCompleteDataFromParse(CodeCompleteDataCache& aCache);
SbxArrayRef GetMethods();
};
More information about the Libreoffice-commits
mailing list