Get rid of the index inside FormulaTokenArray
Instead, use FormulaTokenArrrayPlainIterator everywhere, especially in the FormulaCompiler. This is the final step of a long chain of commits. (Split up into many "uncontroversial" bits, and then this, to make potential bisecting easier.) Also added a logging operator<< for FormulaTokenArray, for SAL_DEBUG, SAL_INFO etc goodness. Change-Id: I02fe29f3f1e0dc33e5cba69e594223b4178a12bc Reviewed-on: https://gerrit.libreoffice.org/38851 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tor Lillqvist <tml@collabora.com>
This commit is contained in:
@@ -4361,6 +4361,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula )
|
||||
|
||||
ScTokenArray aArr;
|
||||
pArr = &aArr;
|
||||
maArrIterator = FormulaTokenArrayPlainIterator(*pArr);
|
||||
aFormula = comphelper::string::strip(rFormula, ' ');
|
||||
|
||||
nSrcPos = 0;
|
||||
@@ -4645,6 +4646,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula )
|
||||
ScTokenArray* pNew = new ScTokenArray( aArr );
|
||||
pNew->GenHash();
|
||||
pArr = pNew;
|
||||
maArrIterator = FormulaTokenArrayPlainIterator(*pArr);
|
||||
|
||||
if (!maExternalFiles.empty())
|
||||
{
|
||||
@@ -4675,6 +4677,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula, const OUStrin
|
||||
// remember pArr, in case a subsequent CompileTokenArray() is executed.
|
||||
ScTokenArray* pNew = new ScTokenArray( aTokenArray );
|
||||
pArr = pNew;
|
||||
maArrIterator = FormulaTokenArrayPlainIterator(*pArr);
|
||||
return pNew;
|
||||
}
|
||||
}
|
||||
@@ -4707,8 +4710,8 @@ bool ScCompiler::HandleRange()
|
||||
// or if not directly between ocSep/parenthesis,
|
||||
// e.g. SUM(...;(...;...)) no, SUM(...;(...)*3) yes,
|
||||
// in short: if it isn't a self-contained expression.
|
||||
FormulaToken* p1 = pArr->PeekPrevNoSpaces();
|
||||
FormulaToken* p2 = pArr->PeekNextNoSpaces();
|
||||
FormulaToken* p1 = maArrIterator.PeekPrevNoSpaces();
|
||||
FormulaToken* p2 = maArrIterator.PeekNextNoSpaces();
|
||||
OpCode eOp1 = (p1 ? p1->GetOpCode() : ocSep);
|
||||
OpCode eOp2 = (p2 ? p2->GetOpCode() : ocSep);
|
||||
bool bBorder1 = (eOp1 == ocSep || eOp1 == ocOpen);
|
||||
@@ -4719,7 +4722,6 @@ bool ScCompiler::HandleRange()
|
||||
pNew = new ScTokenArray();
|
||||
pNew->AddOpCode( ocClose );
|
||||
PushTokenArray( pNew, true );
|
||||
pNew->Reset();
|
||||
}
|
||||
pNew = pRangeData->GetCode()->Clone();
|
||||
pNew->SetFromRangeName( true );
|
||||
@@ -4737,13 +4739,12 @@ bool ScCompiler::HandleRange()
|
||||
SetRelNameReference();
|
||||
MoveRelWrap(pRangeData->GetMaxCol(), pRangeData->GetMaxRow());
|
||||
}
|
||||
pNew->Reset();
|
||||
maArrIterator.Reset();
|
||||
if ( bAddPair )
|
||||
{
|
||||
pNew = new ScTokenArray();
|
||||
pNew->AddOpCode( ocOpen );
|
||||
PushTokenArray( pNew, true );
|
||||
pNew->Reset();
|
||||
}
|
||||
return GetToken();
|
||||
}
|
||||
@@ -4755,7 +4756,6 @@ bool ScCompiler::HandleRange()
|
||||
pNew = new ScTokenArray;
|
||||
pNew->Add( new FormulaErrorToken( FormulaError::NoName));
|
||||
PushTokenArray( pNew, true );
|
||||
pNew->Reset();
|
||||
return GetToken();
|
||||
}
|
||||
return true;
|
||||
@@ -4791,12 +4791,12 @@ bool ScCompiler::HandleExternalReference(const FormulaToken& _aToken)
|
||||
|
||||
ScTokenArray* pNew = xNew->Clone();
|
||||
PushTokenArray( pNew, true);
|
||||
if (pNew->GetNextReference() != nullptr)
|
||||
if (FormulaTokenArrayPlainIterator(*pNew).GetNextReference() != nullptr)
|
||||
{
|
||||
SetRelNameReference();
|
||||
MoveRelWrap(MAXCOL, MAXROW);
|
||||
}
|
||||
pNew->Reset();
|
||||
maArrIterator.Reset();
|
||||
return GetToken();
|
||||
}
|
||||
default:
|
||||
@@ -4808,8 +4808,8 @@ bool ScCompiler::HandleExternalReference(const FormulaToken& _aToken)
|
||||
|
||||
void ScCompiler::AdjustSheetLocalNameRelReferences( SCTAB nDelta )
|
||||
{
|
||||
pArr->Reset();
|
||||
for (formula::FormulaToken* t = pArr->GetNextReference(); t; t = pArr->GetNextReference())
|
||||
maArrIterator.Reset();
|
||||
for (formula::FormulaToken* t = maArrIterator.GetNextReference(); t; t = maArrIterator.GetNextReference())
|
||||
{
|
||||
ScSingleRefData& rRef1 = *t->GetSingleRef();
|
||||
if (rRef1.IsTabRel())
|
||||
@@ -4827,9 +4827,9 @@ void ScCompiler::AdjustSheetLocalNameRelReferences( SCTAB nDelta )
|
||||
|
||||
void ScCompiler::SetRelNameReference()
|
||||
{
|
||||
pArr->Reset();
|
||||
for( formula::FormulaToken* t = pArr->GetNextReference(); t;
|
||||
t = pArr->GetNextReference() )
|
||||
maArrIterator.Reset();
|
||||
for( formula::FormulaToken* t = maArrIterator.GetNextReference(); t;
|
||||
t = maArrIterator.GetNextReference() )
|
||||
{
|
||||
ScSingleRefData& rRef1 = *t->GetSingleRef();
|
||||
if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() )
|
||||
@@ -4847,9 +4847,9 @@ void ScCompiler::SetRelNameReference()
|
||||
// don't call for other token arrays!
|
||||
void ScCompiler::MoveRelWrap( SCCOL nMaxCol, SCROW nMaxRow )
|
||||
{
|
||||
pArr->Reset();
|
||||
for( formula::FormulaToken* t = pArr->GetNextReference(); t;
|
||||
t = pArr->GetNextReference() )
|
||||
maArrIterator.Reset();
|
||||
for( formula::FormulaToken* t = maArrIterator.GetNextReference(); t;
|
||||
t = maArrIterator.GetNextReference() )
|
||||
{
|
||||
if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef )
|
||||
ScRefUpdate::MoveRelWrap( pDoc, aPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( *t->GetSingleRef() ).Ref() );
|
||||
@@ -4863,9 +4863,9 @@ void ScCompiler::MoveRelWrap( SCCOL nMaxCol, SCROW nMaxRow )
|
||||
void ScCompiler::MoveRelWrap( ScTokenArray& rArr, ScDocument* pDoc, const ScAddress& rPos,
|
||||
SCCOL nMaxCol, SCROW nMaxRow )
|
||||
{
|
||||
rArr.Reset();
|
||||
for( formula::FormulaToken* t = rArr.GetNextReference(); t;
|
||||
t = rArr.GetNextReference() )
|
||||
formula::FormulaTokenArrayPlainIterator aIter(rArr);
|
||||
for( formula::FormulaToken* t = aIter.GetNextReference(); t;
|
||||
t = aIter.GetNextReference() )
|
||||
{
|
||||
if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef )
|
||||
ScRefUpdate::MoveRelWrap( pDoc, rPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( *t->GetSingleRef() ).Ref() );
|
||||
@@ -5031,7 +5031,7 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu
|
||||
GetSetupTabNames(), aRef, true, (pArr && pArr->IsFromRangeName()));
|
||||
}
|
||||
}
|
||||
else if (pArr && (p = pArr->PeekPrevNoSpaces()) && p->GetOpCode() == ocTableRefOpen)
|
||||
else if (pArr && (p = maArrIterator.PeekPrevNoSpaces()) && p->GetOpCode() == ocTableRefOpen)
|
||||
{
|
||||
OUString aStr;
|
||||
ScAddress aAbs = rRef.toAbs(aPos);
|
||||
@@ -5351,8 +5351,8 @@ bool ScCompiler::HandleColRowName()
|
||||
bFound = true;
|
||||
else
|
||||
{
|
||||
FormulaToken* p1 = pArr->PeekPrevNoSpaces();
|
||||
FormulaToken* p2 = pArr->PeekNextNoSpaces();
|
||||
FormulaToken* p1 = maArrIterator.PeekPrevNoSpaces();
|
||||
FormulaToken* p2 = maArrIterator.PeekNextNoSpaces();
|
||||
// begin/end of a formula => single
|
||||
OpCode eOp1 = p1 ? p1->GetOpCode() : ocAdd;
|
||||
OpCode eOp2 = p2 ? p2->GetOpCode() : ocAdd;
|
||||
@@ -5422,7 +5422,6 @@ bool ScCompiler::HandleColRowName()
|
||||
}
|
||||
}
|
||||
PushTokenArray( pNew, true );
|
||||
pNew->Reset();
|
||||
return GetToken();
|
||||
}
|
||||
}
|
||||
@@ -5447,7 +5446,6 @@ bool ScCompiler::HandleDbData()
|
||||
ScTokenArray* pNew = new ScTokenArray();
|
||||
pNew->AddDoubleReference( aRefData );
|
||||
PushTokenArray( pNew, true );
|
||||
pNew->Reset();
|
||||
return GetToken();
|
||||
}
|
||||
return true;
|
||||
@@ -5455,7 +5453,7 @@ bool ScCompiler::HandleDbData()
|
||||
|
||||
bool ScCompiler::GetTokenIfOpCode( OpCode eOp )
|
||||
{
|
||||
const formula::FormulaToken* p = pArr->PeekNextNoSpaces();
|
||||
const formula::FormulaToken* p = maArrIterator.PeekNextNoSpaces();
|
||||
if (p && p->GetOpCode() == eOp)
|
||||
return GetToken();
|
||||
return false;
|
||||
@@ -5590,7 +5588,7 @@ bool ScCompiler::HandleTableRef()
|
||||
} eState = sOpen;
|
||||
do
|
||||
{
|
||||
const formula::FormulaToken* p = pArr->PeekNextNoSpaces();
|
||||
const formula::FormulaToken* p = maArrIterator.PeekNextNoSpaces();
|
||||
if (!p)
|
||||
eState = sStop;
|
||||
else
|
||||
@@ -5762,7 +5760,6 @@ bool ScCompiler::HandleTableRef()
|
||||
SetError( FormulaError::Pair);
|
||||
}
|
||||
PushTokenArray( pNew, true );
|
||||
pNew->Reset();
|
||||
return GetToken();
|
||||
}
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user