Resolves: tdf#99461 reverse logic of TokenPointers::skipToken()

... so that all code tokens are adjusted even if shared with another
flat copied token array, but RPN not if shared. Was vice versa.

ScConditionEntry has shared token arrays for pFormula1|pFCell1
respectively pFormula2|pFCell2 hence the references weren't updated.

Change-Id: I52256b5ea20da753a2a29ff437f09c921566e070
This commit is contained in:
Eike Rathke 2016-04-25 18:54:41 +02:00
parent 79c4d547b4
commit 03124f5be5

View file

@ -139,27 +139,33 @@ namespace
bool skipToken( size_t i, const FormulaToken* const * pp )
{
// Handle all tokens in RPN, and code tokens only if they have a
// reference count of 1, which means they are not referenced in
// RPN.
if (i == 0)
return (*pp)->GetRef() > 1;
if (mbSkipRelName)
// Handle all code tokens, and tokens in RPN only if they have a
// reference count of 1, which means they are not referenced in the
// code array. Doing it the other way would skip code tokens that
// are held by flat copied token arrays and thus are shared. For
// flat copy arrays the caller has to know what it does and should
// discard all RPN, update only one array and regenerate all RPN.
if (i == 1)
{
// Skip (do not adjust) relative references resulting from
// named expressions.
switch ((*pp)->GetType())
if ((*pp)->GetRef() > 1)
return true;
if (mbSkipRelName)
{
case svSingleRef:
return (*pp)->GetSingleRef()->IsRelName();
case svDoubleRef:
{
const ScComplexRefData& rRef = *(*pp)->GetDoubleRef();
return rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName();
}
default:
; // nothing
// Skip (do not adjust) relative references resulting from
// named expressions. Resolved expressions are only in RPN.
switch ((*pp)->GetType())
{
case svSingleRef:
return (*pp)->GetSingleRef()->IsRelName();
case svDoubleRef:
{
const ScComplexRefData& rRef = *(*pp)->GetDoubleRef();
return rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName();
}
default:
; // nothing
}
}
}