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:
parent
79c4d547b4
commit
03124f5be5
1 changed files with 25 additions and 19 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue