summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2021-10-20 14:30:34 +0200
committerEike Rathke <erack@redhat.com>2021-10-20 18:50:29 +0200
commit45f53338461ba61c53c51a04f99fa281bf5150ae (patch)
treee52333fc2749ab8931873276d2e2025fb570ca88 /sc/source
parent56d750a5c0f857aedf036f0cd49cfad2de9238ae (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.cxx79
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 )