formula/source/core/api/FormulaCompiler.cxx | 9 +++++++++ include/formula/FormulaCompiler.hxx | 23 +++++++++++++++++++++++ sc/inc/compiler.hxx | 5 +++++ sc/source/core/tool/calcconfig.cxx | 12 ------------ sc/source/core/tool/compiler.cxx | 6 +++--- 5 files changed, 40 insertions(+), 15 deletions(-)
New commits: commit ad15930e60b1e175d127022fd99fe71f140cbd88 Author: Eike Rathke <[email protected]> AuthorDate: Thu Sep 1 13:27:46 2022 +0200 Commit: Xisco Fauli <[email protected]> CommitDate: Mon Sep 5 16:20:26 2022 +0200 Resolves: tdf#142293 Implement the temporariness of GetOpCodeMap() This is a combination of 5 commits. Related: tdf#142293 Introduce a protected FormulaCompiler::GetFinalOpCodeMap() ... to prepare having GetOpCodeMap() return a temporary if a final doesn't exist yet. Currently just an alias. xChange-Id: I6fc100ae6223010e149e4af01fc7c17630930de7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139162 Reviewed-by: Eike Rathke <[email protected]> Tested-by: Jenkins (cherry picked from commit 603f9ce4f39a59bd84b5c08e3d725e0ee664991f) Related: tdf#142293 Use FormulaCompiler::GetFinalOpCodeMap() in ScCompiler xChange-Id: I65bf11fca11acfbc372c99a5210e0f79b61f2be4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139171 Reviewed-by: Eike Rathke <[email protected]> Tested-by: Jenkins (cherry picked from commit b8a83c5c63873faf1a63205b8aad634f351d1a9f) Resolves: tdf#142293 Implement the temporariness of GetOpCodeMap() xChange-Id: I7c587a68dbdeab9a8c8ed324ecae2eb5dd75b9df Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139201 Reviewed-by: Eike Rathke <[email protected]> Tested-by: Jenkins (cherry picked from commit 5aaa0cda74de4170972b7988d8fca16a560b8500) Related: tdf#142293 Remove temporariness now implemented at GetOpCodeMap() xChange-Id: Ic61f45b1da286e2f4890bbc81dc5cd18c0d5bbe5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139202 Reviewed-by: Eike Rathke <[email protected]> Tested-by: Jenkins (cherry picked from commit 15acaddb54c3e14a49b0d26d879c4436d34933e1) Related: tdf#142293 Have ScCompiler::GetOpCodeMap() overwrite ... FormulaCompiler::GetOpCodeMap() forwarding to GetFinalOpCodeMap() as that is what we want from ScCompiler (and always had), eliminating the now possible temporariness of FormulaCompiler::GetOpCodeMap(). xChange-Id: Ia87fb0e911e4f7995bfb5df07dcd1fde3713d006 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139205 Reviewed-by: Eike Rathke <[email protected]> Tested-by: Jenkins (cherry picked from commit 033e98dbe6aafd6719eb83ea4d2fc68110e195c9) Change-Id: I7c587a68dbdeab9a8c8ed324ecae2eb5dd75b9df Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139230 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 591b28744289..044921d70cc0 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -816,6 +816,15 @@ FormulaCompiler::~FormulaCompiler() } FormulaCompiler::OpCodeMapPtr FormulaCompiler::GetOpCodeMap( const sal_Int32 nLanguage ) const +{ + const bool bTemporary = !HasOpCodeMap(nLanguage); + OpCodeMapPtr xMap = GetFinalOpCodeMap(nLanguage); + if (bTemporary) + const_cast<FormulaCompiler*>(this)->DestroyOpCodeMap(nLanguage); + return xMap; +} + +FormulaCompiler::OpCodeMapPtr FormulaCompiler::GetFinalOpCodeMap( const sal_Int32 nLanguage ) const { FormulaCompiler::OpCodeMapPtr xMap; using namespace sheet; diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index 36632035602e..d94dbd40d399 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -196,7 +196,30 @@ public: typedef std::shared_ptr< const OpCodeMap > OpCodeMapPtr; typedef std::shared_ptr< OpCodeMap > NonConstOpCodeMapPtr; +protected: + /** Get finalized OpCodeMap for formula language. + + Creates/returns a singleton instance of an OpCodeMap that contains + external AddIn mappings if the derived class supports them. Do not call + at this base class as it results in a permanent mapping without AddIns + even for derived classes (unless it is for the implementation of the + temporary GetOpCodeMap()). + + @param nLanguage + One of css::sheet::FormulaLanguage constants. + @return Map for nLanguage. If nLanguage is unknown, a NULL map is returned. + */ + OpCodeMapPtr GetFinalOpCodeMap( const sal_Int32 nLanguage ) const; + +public: /** Get OpCodeMap for formula language. + + Returns either the finalized OpCodeMap (created by GetFinalOpCodeMap() + of a derived class) for nLanguage if there is such, or if not then a + temporary map of which its singleton is reset immediately and the + temporary will get destroyed by the caller's scope. A temporary map + created at this base class does *not* contain AddIn mappings. + @param nLanguage One of css::sheet::FormulaLanguage constants. @return Map for nLanguage. If nLanguage is unknown, a NULL map is returned. diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 5f6c521d11cf..cb60e1f96acb 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -439,6 +439,11 @@ public: static const Convention* GetRefConvention( formula::FormulaGrammar::AddressConvention eConv ); + /** Overwrite FormulaCompiler::GetOpCodeMap() forwarding to + GetFinalOpCodeMap(). + */ + OpCodeMapPtr GetOpCodeMap( const sal_Int32 nLanguage ) const { return GetFinalOpCodeMap(nLanguage); } + /// Set symbol map if not empty. void SetFormulaLanguage( const OpCodeMapPtr & xMap ); diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx index 27836704dab9..7eb36d73a97c 100644 --- a/sc/source/core/tool/calcconfig.cxx +++ b/sc/source/core/tool/calcconfig.cxx @@ -187,11 +187,7 @@ bool ScCalcConfig::operator!= (const ScCalcConfig& r) const OUString ScOpCodeSetToSymbolicString(const ScCalcConfig::OpCodeSet& rOpCodes) { OUStringBuffer result(256); - // If GetOpCodeMap() initializes the map at base class - // formula::FormulaCompiler before any ScCompiler did, all AddIn mapping - // would be missing also in future. So if it didn't exist destroy it again. formula::FormulaCompiler aCompiler; - const bool bTemporary = !aCompiler.HasOpCodeMap(css::sheet::FormulaLanguage::ENGLISH); formula::FormulaCompiler::OpCodeMapPtr pOpCodeMap(aCompiler.GetOpCodeMap(css::sheet::FormulaLanguage::ENGLISH)); for (auto i = rOpCodes->begin(); i != rOpCodes->end(); ++i) @@ -201,18 +197,13 @@ OUString ScOpCodeSetToSymbolicString(const ScCalcConfig::OpCodeSet& rOpCodes) result.append(pOpCodeMap->getSymbol(*i)); } - if (bTemporary) - aCompiler.DestroyOpCodeMap(css::sheet::FormulaLanguage::ENGLISH); - return result.makeStringAndClear(); } ScCalcConfig::OpCodeSet ScStringToOpCodeSet(std::u16string_view rOpCodes) { ScCalcConfig::OpCodeSet result = std::make_shared<o3tl::sorted_vector< OpCode >>(); - // Same as above. formula::FormulaCompiler aCompiler; - const bool bTemporary = !aCompiler.HasOpCodeMap(css::sheet::FormulaLanguage::ENGLISH); formula::FormulaCompiler::OpCodeMapPtr pOpCodeMap(aCompiler.GetOpCodeMap(css::sheet::FormulaLanguage::ENGLISH)); const formula::OpCodeHashMap& rHashMap(pOpCodeMap->getHashMap()); @@ -244,9 +235,6 @@ ScCalcConfig::OpCodeSet ScStringToOpCodeSet(std::u16string_view rOpCodes) if( result->find( ocSub ) != result->end()) result->insert( ocNegSub ); - if (bTemporary) - aCompiler.DestroyOpCodeMap(css::sheet::FormulaLanguage::ENGLISH); - return result; } diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index b6784f861f71..580c7ef44666 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -257,17 +257,17 @@ void ScCompiler::SetGrammar( const FormulaGrammar::Grammar eGrammar ) if( eGrammar == FormulaGrammar::GRAM_EXTERNAL ) { meGrammar = eGrammar; - mxSymbols = GetOpCodeMap( css::sheet::FormulaLanguage::NATIVE); + mxSymbols = GetFinalOpCodeMap( css::sheet::FormulaLanguage::NATIVE); } else { FormulaGrammar::Grammar eMyGrammar = eGrammar; const sal_Int32 nFormulaLanguage = FormulaGrammar::extractFormulaLanguage( eMyGrammar); - OpCodeMapPtr xMap = GetOpCodeMap( nFormulaLanguage); + OpCodeMapPtr xMap = GetFinalOpCodeMap( nFormulaLanguage); OSL_ENSURE( xMap, "ScCompiler::SetGrammar: unknown formula language"); if (!xMap) { - xMap = GetOpCodeMap( css::sheet::FormulaLanguage::NATIVE); + xMap = GetFinalOpCodeMap( css::sheet::FormulaLanguage::NATIVE); eMyGrammar = xMap->getGrammar(); }
