Kaydet (Commit) d0ded163 authored tarafından Eike Rathke's avatar Eike Rathke

Related: tdf#122301 FREQUENCY() with ForceArrayReturn on caller

FREQUENCY() forces its direct caller into array mode, but only for
the immediate subexpression and not for further operators of the
same parameter.

This weird Excel behaviour is stated in

ECMA-376-1:2016 OOXML 18.17.7.127 FREQUENCY
"A call to FREQUENCY shall be an array formula."

somewhat unclear what it actually applies to, but it turned out
that "a call" is indeed *only* THE direct call, see
https://bugs.documentfoundation.org/show_bug.cgi?id=122301#c19

Change-Id: I145d8fe26d75d5af25b987e190bf35f2d2c03ec6
Reviewed-on: https://gerrit.libreoffice.org/66407Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Tested-by: Jenkins
üst d08425c1
......@@ -2746,6 +2746,13 @@ void FormulaCompiler::ForceArrayOperator( FormulaTokenRef const & rCurr )
else
rCurr->SetInForceArray( formula::ParamClass::SuppressedReferenceOrForceArray);
}
// Propagate a ForceArrayReturn to caller if the called function
// returns one and the caller so far does not have a stronger array
// mode set.
if (pCurrentFactorToken->GetInForceArray() == ParamClass::Unknown
&& GetForceArrayParameter( rCurr.get(), SAL_MAX_UINT16) == ParamClass::ForceArrayReturn)
pCurrentFactorToken->SetInForceArray( ParamClass::ForceArrayReturn);
}
}
......
......@@ -151,7 +151,7 @@ bool FormulaToken::IsInForceArray() const
{
ParamClass eParam = GetInForceArray();
return eParam == ParamClass::ForceArray || eParam == ParamClass::ReferenceOrForceArray
|| eParam == ParamClass::ReferenceOrRefArray;
|| eParam == ParamClass::ReferenceOrRefArray || eParam == ParamClass::ForceArrayReturn;
}
bool FormulaToken::operator==( const FormulaToken& rToken ) const
......
......@@ -757,6 +757,7 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co
case ParamClass::ForceArray:
case ParamClass::ReferenceOrForceArray:
case ParamClass::SuppressedReferenceOrForceArray:
case ParamClass::ForceArrayReturn:
; // nothing, only as array/matrix
// no default to get compiler warning
}
......
......@@ -67,7 +67,12 @@ namespace formula
Reference in JumpMatrix context should use the result matrix
instead of the array of references. Never used as initial parameter
classification. */
SuppressedReferenceOrForceArray
SuppressedReferenceOrForceArray,
/** A function return forces the caller into array mode for this one
call, making it behave like it had ForceArray but not propagated to
any further operators in the same parameter. */
ForceArrayReturn
};
}
......
......@@ -146,7 +146,7 @@ const ScParameterClassification::RawData ScParameterClassification::pRawData[] =
{ ocForecast_ETS_STA, {{ ForceArray, ForceArray, ForceArray, Value, Value, Value }, 0, Value }},
{ ocForecast_ETS_STM, {{ ForceArray, ForceArray, ForceArray, Value, Value, Value }, 0, Value }},
{ ocFormula, {{ Reference }, 0, Value }},
{ ocFrequency, {{ ReferenceOrForceArray, ReferenceOrForceArray }, 0, Value }},
{ ocFrequency, {{ ReferenceOrForceArray, ReferenceOrForceArray }, 0, ForceArrayReturn }},
{ ocGCD, {{ Reference }, 1, Value }},
{ ocGeoMean, {{ Reference }, 1, Value }},
{ ocGreater, {{ Array, Array }, 0, Value }},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment