Kaydet (Commit) 519d2f6e authored tarafından Eike Rathke's avatar Eike Rathke

add TableRef stack

Change-Id: If781e6ab13eb5ad175352e330379776d6ca4fcd8
üst 6242ea42
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment