diff options
author | Eike Rathke <erack@redhat.com> | 2021-10-20 14:30:34 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2021-10-20 18:50:29 +0200 |
commit | 45f53338461ba61c53c51a04f99fa281bf5150ae (patch) | |
tree | e52333fc2749ab8931873276d2e2025fb570ca88 /sc/source | |
parent | 56d750a5c0f857aedf036f0cd49cfad2de9238ae (diff) |
Related: tdf#145235 TEXTJOIN() allow empty delimiter of referenced empty
Like =TEXTJOIN(B1;0;A1:A2) where B1 is empty, this simply
concatenates content of A1 and A2 with an empty string delimiter.
Previously Err:502 expected argument was raised.
Also straighten array/matrix element handling and ensure all paths
deliver a string value.
Furthermore ScRefCellValue::hasEmptyValue() already includes
isEmpty() so the extra check is superfluous.
Change-Id: If761aa91df78c6b26fbfd626629e07860636e718
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123897
Tested-by: Eike Rathke <erack@redhat.com>
Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/core/tool/interpr8.cxx | 79 |
1 files changed, 34 insertions, 45 deletions
diff --git a/sc/source/core/tool/interpr8.cxx b/sc/source/core/tool/interpr8.cxx index 2c2f1c212b3f..fd0762eabc62 100644 --- a/sc/source/core/tool/interpr8.cxx +++ b/sc/source/core/tool/interpr8.cxx @@ -1538,14 +1538,13 @@ void ScInterpreter::ScTextJoin_MS() if ( nGlobalError != FormulaError::NONE ) break; ScRefCellValue aCell( mrDoc, aAdr ); - if ( !aCell.isEmpty() ) + if (aCell.hasEmptyValue()) + aDelimiters.emplace_back(""); + else { - if ( !aCell.hasEmptyValue() ) - { - svl::SharedString aSS; - GetCellString( aSS, aCell); - aDelimiters.push_back( aSS.getString()); - } + svl::SharedString aSS; + GetCellString( aSS, aCell); + aDelimiters.push_back( aSS.getString()); } } break; @@ -1579,17 +1578,14 @@ void ScInterpreter::ScTextJoin_MS() aAdr.SetRow( nRow ); aAdr.SetCol( nCol ); ScRefCellValue aCell( mrDoc, aAdr ); - if ( !aCell.isEmpty() ) + if (aCell.hasEmptyValue()) + aDelimiters.emplace_back(""); + else { - if ( !aCell.hasEmptyValue() ) - { - svl::SharedString aSS; - GetCellString( aSS, aCell); - aDelimiters.push_back( aSS.getString()); - } + svl::SharedString aSS; + GetCellString( aSS, aCell); + aDelimiters.push_back( aSS.getString()); } - else - aDelimiters.emplace_back("" ); } } } @@ -1611,18 +1607,17 @@ void ScInterpreter::ScTextJoin_MS() { for (SCSIZE j = 0; j < nC; ++j) { - if ( !pMat->IsEmpty( j, k ) ) + if (pMat->IsEmpty( j, k )) + aDelimiters.emplace_back(""); + else if (pMat->IsStringOrEmpty( j, k )) + aDelimiters.push_back( pMat->GetString( j, k ).getString() ); + else if (pMat->IsValue( j, k )) + aDelimiters.push_back( pMat->GetString( *pFormatter, j, k ).getString() ); + else { - if ( pMat->IsStringOrEmpty( j, k ) ) - aDelimiters.push_back( pMat->GetString( j, k ).getString() ); - else - { - if ( pMat->IsValue( j, k ) ) - aDelimiters.push_back( pMat->GetString( *pFormatter, j, k ).getString() ); - } + assert(!"should this really happen?"); + aDelimiters.emplace_back(""); } - else - aDelimiters.emplace_back("" ); } } } @@ -1682,17 +1677,12 @@ void ScInterpreter::ScTextJoin_MS() break; ScRefCellValue aCell( mrDoc, aAdr ); OUString aStr; - if ( !aCell.isEmpty() ) + if (!aCell.hasEmptyValue()) { - if ( !aCell.hasEmptyValue() ) - { - svl::SharedString aSS; - GetCellString( aSS, aCell); - aStr = aSS.getString(); - } + svl::SharedString aSS; + GetCellString( aSS, aCell); + aStr = aSS.getString(); } - else - aStr.clear(); if ( !aStr.isEmpty() || !bSkipEmpty ) { if ( !bFirst ) @@ -1788,18 +1778,17 @@ void ScInterpreter::ScTextJoin_MS() { for (SCSIZE j = 0; j < nC; ++j) { - if ( !pMat->IsEmpty( j, k ) ) - { - if ( pMat->IsStringOrEmpty( j, k ) ) - aStr = pMat->GetString( j, k ).getString(); - else - { - if ( pMat->IsValue( j, k ) ) - aStr = pMat->GetString( *pFormatter, j, k ).getString(); - } - } + if (pMat->IsEmpty( j, k ) ) + aStr.clear(); + else if (pMat->IsStringOrEmpty( j, k )) + aStr = pMat->GetString( j, k ).getString(); + else if (pMat->IsValue( j, k )) + aStr = pMat->GetString( *pFormatter, j, k ).getString(); else + { + assert(!"should this really happen?"); aStr.clear(); + } if ( !aStr.isEmpty() || !bSkipEmpty ) { if ( !bFirst ) |