diff options
author | Eike Rathke <erack@redhat.com> | 2015-03-10 15:46:10 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-03-11 14:32:36 +0100 |
commit | 519d2f6e5e820229d3548a33313ba15155121537 (patch) | |
tree | 68478096f068033a70c96fe9b05d3c72e135f168 | |
parent | 6242ea42a417cf7791c6c731cb6f1d87d21c0610 (diff) |
add TableRef stack
Change-Id: If781e6ab13eb5ad175352e330379776d6ca4fcd8
-rw-r--r-- | sc/inc/compiler.hxx | 8 | ||||
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 27 |
2 files changed, 33 insertions, 2 deletions
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 298e341f8cd7..ec99d45ce260 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -313,6 +313,14 @@ private: std::vector<OUString> maTabNames; /// sheet names mangled for the current grammar for output std::vector<OUString> &GetSetupTabNames() const; /// get or setup tab names for the current grammar + struct TableRefEntry + { + ScTokenRef mxToken; + sal_uInt16 mnLevel; + TableRefEntry( formula::FormulaToken* p ) : mxToken(p), mnLevel(0) {} + }; + std::vector<TableRefEntry> maTableRefs; /// "stack" of currently active ocTableRef tokens + bool NextNewToken(bool bInArray = false); virtual void SetError(sal_uInt16 nError) SAL_OVERRIDE; diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index c913ab7ad4d6..fd5edd4da0d9 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3938,11 +3938,34 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) const FormulaToken* pPrev = pArr->PeekPrev( nIdx); if (pPrev && pPrev->GetOpCode() == ocDBArea) { + FormulaToken* pTableRefToken = new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL); + maTableRefs.push_back( TableRefEntry( pTableRefToken)); // pPrev may be dead hereafter. - static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, - new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL)); + static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, pTableRefToken); } } + switch (eOp) + { + case ocTableRefOpen: + SAL_WARN_IF( maTableRefs.empty(), "sc.core", "ocTableRefOpen without TableRefEntry"); + if (maTableRefs.empty()) + SetError(errPair); + else + ++maTableRefs.back().mnLevel; + break; + case ocTableRefClose: + SAL_WARN_IF( maTableRefs.empty(), "sc.core", "ocTableRefClose without TableRefEntry"); + if (maTableRefs.empty()) + SetError(errPair); + else + { + if (--maTableRefs.back().mnLevel == 0) + maTableRefs.pop_back(); + } + break; + default: + break; + } eLastOp = maRawToken.GetOpCode(); if ( bAutoCorrect ) aCorrectedFormula += aCorrectedSymbol; |