[Libreoffice-commits] core.git: Branch 'private/kohei/xlsx-import-speedup' - 3 commits - formula/source include/formula sc/inc sc/Library_sc.mk sc/qa sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Thu Nov 14 18:21:52 PST 2013


 formula/source/core/api/FormulaCompiler.cxx |   22 +-
 include/formula/FormulaCompiler.hxx         |   21 +-
 sc/Library_sc.mk                            |    1 
 sc/inc/compiler.hxx                         |   23 +--
 sc/inc/document.hxx                         |    2 
 sc/inc/tokenarray.hxx                       |    7 
 sc/inc/tokenstringcontext.hxx               |   39 +++++
 sc/qa/unit/ucalc.hxx                        |    2 
 sc/qa/unit/ucalc_formula.cxx                |   31 ++++
 sc/source/core/data/document.cxx            |   16 ++
 sc/source/core/tool/compiler.cxx            |  211 ++++++++++++++++------------
 sc/source/core/tool/token.cxx               |  158 ++++++++++++++++++++
 sc/source/core/tool/tokenstringcontext.cxx  |   29 +++
 13 files changed, 439 insertions(+), 123 deletions(-)

New commits:
commit 4cd9203a81b17c2208bc84f3a7665ccb46f9fd22
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu Nov 14 21:20:12 2013 -0500

    Create string from token array directly from ScTokenArray. Still WIP.
    
    And make it re-entrant for thread safety. This method should not modify
    the internal state of the token array object. The one with ScCompiler
    is not re-entrant. Still some way to go.
    
    Change-Id: I06de3637341727aef0963dddfb98527f415bf7fa

diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 5754ad9..c9f0b5f 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -254,6 +254,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
     sc/source/core/tool/stylehelper \
     sc/source/core/tool/subtotal \
     sc/source/core/tool/token \
+    sc/source/core/tool/tokenstringcontext \
     sc/source/core/tool/typedstrdata \
     sc/source/core/tool/unitconv \
     sc/source/core/tool/userlist \
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index 4cd31a3..6844b28 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -234,10 +234,11 @@ public:
         Convention( formula::FormulaGrammar::AddressConvention eConvP );
         virtual ~Convention();
 
-        virtual void MakeRefStr( OUStringBuffer&   rBuffer,
-                                 const ScCompiler&      rCompiler,
-                                 const ScComplexRefData&    rRef,
-                                 bool bSingleRef ) const = 0;
+        virtual void makeRefStr(
+            OUStringBuffer& rBuffer, const ScAddress& rPos, formula::FormulaGrammar::Grammar eGram,
+            const OUString& rErrRef, const std::vector<OUString>& rTabNames,
+            const ScComplexRefData& rRef, bool bSingleRef ) const = 0;
+
         virtual ::com::sun::star::i18n::ParseResult
                     parseAnyToken( const OUString& rFormula,
                                    sal_Int32 nSrcPos,
@@ -397,6 +398,8 @@ public:
     void            SetRefConvention( const Convention *pConvP );
     void            SetRefConvention( const formula::FormulaGrammar::AddressConvention eConv );
 
+    static const Convention* GetRefConvention( formula::FormulaGrammar::AddressConvention eConv );
+
     /// Set symbol map if not empty.
     void            SetFormulaLanguage( const OpCodeMapPtr & xMap );
 
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 09f1466..68e57d2 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -555,6 +555,8 @@ public:
     SC_DLLPUBLIC bool SetCodeName( SCTAB nTab, const OUString& rName );
     SC_DLLPUBLIC bool GetTable( const OUString& rName, SCTAB& rTab ) const;
 
+    std::vector<OUString> GetAllTableNames() const;
+
     OUString   GetCopyTabName(SCTAB nTab) const;
 
     SC_DLLPUBLIC void SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData);
diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx
index 83a3988..b8aec07 100644
--- a/sc/inc/tokenarray.hxx
+++ b/sc/inc/tokenarray.hxx
@@ -36,6 +36,7 @@ struct RefUpdateInsertTabContext;
 struct RefUpdateDeleteTabContext;
 struct RefUpdateMoveTabContext;
 struct RefUpdateResult;
+struct TokenStringContext;
 
 }
 
@@ -171,6 +172,12 @@ public:
     void CheckRelativeReferenceBounds(
         const sc::RefUpdateContext& rCxt, const ScAddress& rPos, SCROW nGroupLen, std::vector<SCROW>& rBounds ) const;
 
+    /**
+     * Create a string representation of formula token array without modifying
+     * the internal state of the token array.
+     */
+    OUString CreateString( sc::TokenStringContext& rCxt, const ScAddress& rPos ) const;
+
 #if DEBUG_FORMULA_COMPILER
     void Dump() const;
 #endif
diff --git a/sc/inc/tokenstringcontext.hxx b/sc/inc/tokenstringcontext.hxx
new file mode 100644
index 0000000..e5bb01c
--- /dev/null
+++ b/sc/inc/tokenstringcontext.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef SC_TOKENSTRINGCONTEXT_HXX
+#define SC_TOKENSTRINGCONTEXT_HXX
+
+#include "compiler.hxx"
+
+namespace sc {
+
+/**
+ * Context for creating string from an array of formula tokens, used in
+ * ScTokenArray::CreateString().  You can re-use the same string context
+ * between multiple CreateString() calls as long as the document content is
+ * unmodified.
+ */
+struct TokenStringContext
+{
+    formula::FormulaGrammar::Grammar meGram;
+    formula::FormulaCompiler::OpCodeMapPtr mxOpCodeMap;
+    const ScCompiler::Convention* mpRefConv;
+    OUString maErrRef;
+
+    std::vector<OUString> maTabNames;
+
+    TokenStringContext( formula::FormulaGrammar::Grammar eGram );
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 19c94d7..1298e73 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -84,6 +84,7 @@ public:
     void testRangeList();
     void testInput();
 
+    void testFormulaCreateStringFromTokens();
     void testFormulaParseReference();
     void testFetchVectorRefArray();
     void testFormulaHashAndTag();
@@ -293,6 +294,7 @@ public:
     CPPUNIT_TEST(testSharedStringPool);
     CPPUNIT_TEST(testRangeList);
     CPPUNIT_TEST(testInput);
+    CPPUNIT_TEST(testFormulaCreateStringFromTokens);
     CPPUNIT_TEST(testFormulaParseReference);
     CPPUNIT_TEST(testFetchVectorRefArray);
     CPPUNIT_TEST(testFormulaHashAndTag);
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index d12e45d..c780717 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -22,6 +22,7 @@
 #include "docsh.hxx"
 #include "docfunc.hxx"
 #include "paramisc.hxx"
+#include "tokenstringcontext.hxx"
 
 #include "formula/vectortoken.hxx"
 
@@ -29,6 +30,36 @@
 
 using namespace formula;
 
+void Test::testFormulaCreateStringFromTokens()
+{
+    m_pDoc->InsertTab(0, "Test");
+
+    const char* aTests[] = {
+        "1+2",
+        "SUM(A1:A10;B1:B10;C5;D6)"
+    };
+
+    boost::scoped_ptr<ScTokenArray> pArray;
+
+    sc::TokenStringContext aCxt(formula::FormulaGrammar::GRAM_ENGLISH);
+    aCxt.maTabNames = m_pDoc->GetAllTableNames();
+    ScAddress aPos(0,0,0);
+
+    for (size_t i = 0, n = SAL_N_ELEMENTS(aTests); i < n; ++i)
+    {
+        OUString aFormula = OUString::createFromAscii(aTests[i]);
+        ScCompiler aComp(m_pDoc, aPos);
+        aComp.SetGrammar(FormulaGrammar::GRAM_ENGLISH);
+        pArray.reset(aComp.CompileString(aFormula));
+        CPPUNIT_ASSERT_MESSAGE("Failed to compile formula string.", pArray.get());
+
+        OUString aCheck = pArray->CreateString(aCxt, aPos);
+        CPPUNIT_ASSERT_EQUAL(aFormula, aCheck);
+    }
+
+    m_pDoc->DeleteTab(0);
+}
+
 namespace {
 
 bool isEmpty( const formula::VectorRefArray& rArray, size_t nPos )
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index f8a6d92..80696e4 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -251,6 +251,22 @@ bool ScDocument::GetTable( const OUString& rName, SCTAB& rTab ) const
     return false;
 }
 
+std::vector<OUString> ScDocument::GetAllTableNames() const
+{
+    std::vector<OUString> aNames;
+    aNames.reserve(maTabs.size());
+    TableContainer::const_iterator it = maTabs.begin(), itEnd = maTabs.end();
+    for (; it != itEnd; ++it)
+    {
+        OUString aName;
+        const ScTable& rTab = **it;
+        rTab.GetName(aName);
+        aNames.push_back(aName);
+    }
+
+    return aNames;
+}
+
 ScDBData* ScDocument::GetAnonymousDBData(SCTAB nTab)
 {
     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 52d47df..dc2bd4a 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -726,15 +726,15 @@ struct ConventionOOO_A1 : public Convention_A1
 {
     ConventionOOO_A1() : Convention_A1 (FormulaGrammar::CONV_OOO) { }
     ConventionOOO_A1( FormulaGrammar::AddressConvention eConv ) : Convention_A1 (eConv) { }
-    static OUString MakeTabStr( const ScCompiler& rComp, SCTAB nTab, OUString& aDoc )
+
+    static OUString MakeTabStr( const std::vector<OUString>& rTabNames, SCTAB nTab, OUString& aDoc )
     {
         OUString aString;
-        OUString aTmp;
-        if (!rComp.GetDoc()->GetName( nTab, aTmp ))
+        if (static_cast<size_t>(nTab) >= rTabNames.size())
             aString = ScGlobal::GetRscString(STR_NO_REF_TABLE);
         else
         {
-            aString = aTmp;
+            aString = rTabNames[nTab];
             // "'Doc'#Tab"
             sal_Int32 nPos = ScCompiler::GetDocTabPos( aString );
             if ( nPos != -1 )
@@ -753,7 +753,7 @@ struct ConventionOOO_A1 : public Convention_A1
     }
 
     void MakeOneRefStrImpl(
-        OUStringBuffer& rBuffer, const ScCompiler& rComp,
+        OUStringBuffer& rBuffer, const OUString& rErrRef, const std::vector<OUString>& rTabNames,
         const ScSingleRefData& rRef, const ScAddress& rAbsRef,
         bool bForceTab, bool bODF ) const
     {
@@ -763,13 +763,13 @@ struct ConventionOOO_A1 : public Convention_A1
             {
                 if (!rRef.IsTabRel())
                     rBuffer.append(sal_Unicode('$'));
-                rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
+                rBuffer.append(rErrRef);
                 rBuffer.append(sal_Unicode('.'));
             }
             else
             {
                 OUString aDoc;
-                OUString aRefStr(MakeTabStr(rComp, rAbsRef.Tab(), aDoc));
+                OUString aRefStr(MakeTabStr(rTabNames, rAbsRef.Tab(), aDoc));
                 rBuffer.append(aDoc);
                 if (!rRef.IsTabRel())
                     rBuffer.append(sal_Unicode('$'));
@@ -781,58 +781,38 @@ struct ConventionOOO_A1 : public Convention_A1
         if (!rRef.IsColRel())
             rBuffer.append(sal_Unicode('$'));
         if (!ValidCol(rAbsRef.Col()))
-            rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
+            rBuffer.append(rErrRef);
         else
             MakeColStr(rBuffer, rAbsRef.Col());
         if (!rRef.IsRowRel())
             rBuffer.append(sal_Unicode('$'));
         if (!ValidRow(rAbsRef.Row()))
-            rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
+            rBuffer.append(rErrRef);
         else
             MakeRowStr(rBuffer, rAbsRef.Row());
     }
 
-    void MakeRefStrImpl( OUStringBuffer&   rBuffer,
-                         const ScCompiler&      rComp,
-                         const ScComplexRefData&    rRef,
-                         bool bSingleRef,
-                         bool bODF ) const
+    void makeRefStr( OUStringBuffer&   rBuffer,
+                     const ScAddress& rPos,
+                     FormulaGrammar::Grammar /*eGram*/,
+                     const OUString& rErrRef,
+                     const std::vector<OUString>& rTabNames,
+                     const ScComplexRefData& rRef,
+                     bool bSingleRef ) const
     {
-        if (bODF)
-            rBuffer.append(sal_Unicode('['));
         ScComplexRefData aRef( rRef );
         // In case absolute/relative positions weren't separately available:
         // transform relative to absolute!
-        ScAddress aAbs1 = aRef.Ref1.toAbs(rComp.GetPos()), aAbs2;
+        ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2;
         if( !bSingleRef )
-            aAbs2 = aRef.Ref2.toAbs(rComp.GetPos());
+            aAbs2 = aRef.Ref2.toAbs(rPos);
 
-        if (bODF && FormulaGrammar::isODFF( rComp.GetGrammar()) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2)))
-        {
-            rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
-            // For ODFF write [#REF!], but not for PODF so apps reading ODF
-            // 1.0/1.1 may have a better chance if they implemented the old
-            // form.
-        }
-        else
+        MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, false, false);
+        if (!bSingleRef)
         {
-            MakeOneRefStrImpl(rBuffer, rComp, aRef.Ref1, aAbs1, false, bODF);
-            if (!bSingleRef)
-            {
-                rBuffer.append(sal_Unicode(':'));
-                MakeOneRefStrImpl(rBuffer, rComp, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), bODF);
-            }
+            rBuffer.append(sal_Unicode(':'));
+            MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false);
         }
-        if (bODF)
-            rBuffer.append(sal_Unicode(']'));
-    }
-
-    void MakeRefStr( OUStringBuffer&   rBuffer,
-                     const ScCompiler&      rComp,
-                     const ScComplexRefData& rRef,
-                     bool bSingleRef ) const
-    {
-        MakeRefStrImpl( rBuffer, rComp, rRef, bSingleRef, false);
     }
 
     virtual sal_Unicode getSpecialSymbol( SpecialSymbolType eSymType ) const
@@ -1005,12 +985,39 @@ const ScCompiler::Convention * const ScCompiler::pConvOOO_A1 = &ConvOOO_A1;
 struct ConventionOOO_A1_ODF : public ConventionOOO_A1
 {
     ConventionOOO_A1_ODF() : ConventionOOO_A1 (FormulaGrammar::CONV_ODF) { }
-    void MakeRefStr( OUStringBuffer&   rBuffer,
-                     const ScCompiler&      rComp,
+    void makeRefStr( OUStringBuffer&   rBuffer,
+                     const ScAddress& rPos,
+                     FormulaGrammar::Grammar eGram,
+                     const OUString& rErrRef,
+                     const std::vector<OUString>& rTabNames,
                      const ScComplexRefData& rRef,
                      bool bSingleRef ) const
     {
-        MakeRefStrImpl( rBuffer, rComp, rRef, bSingleRef, true);
+        rBuffer.append(sal_Unicode('['));
+        ScComplexRefData aRef( rRef );
+        // In case absolute/relative positions weren't separately available:
+        // transform relative to absolute!
+        ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2;
+        if( !bSingleRef )
+            aAbs2 = aRef.Ref2.toAbs(rPos);
+
+        if (FormulaGrammar::isODFF(eGram) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2)))
+        {
+            rBuffer.append(rErrRef);
+            // For ODFF write [#REF!], but not for PODF so apps reading ODF
+            // 1.0/1.1 may have a better chance if they implemented the old
+            // form.
+        }
+        else
+        {
+            MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, false, true);
+            if (!bSingleRef)
+            {
+                rBuffer.append(sal_Unicode(':'));
+                MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true);
+            }
+        }
+        rBuffer.append(sal_Unicode(']'));
     }
 
     virtual OUString makeExternalNameStr( const OUString& rFile, const OUString& rName ) const
@@ -1038,22 +1045,20 @@ const ScCompiler::Convention * const ScCompiler::pConvOOO_A1_ODF = &ConvOOO_A1_O
 
 struct ConventionXL
 {
-    static bool GetDocAndTab( const ScCompiler& rComp,
-                              const ScSingleRefData& rRef,
-                              OUString& rDocName,
-                              OUString& rTabName )
+    static bool GetDocAndTab(
+        const ScAddress& rPos, const std::vector<OUString>& rTabNames,
+        const ScSingleRefData& rRef, OUString& rDocName, OUString& rTabName )
     {
         bool bHasDoc = false;
 
         rDocName = "";
-        OUString aTmp;
-        ScAddress aAbs = rRef.toAbs(rComp.GetPos());
-        if (rRef.IsTabDeleted() || !rComp.GetDoc()->GetName(aAbs.Tab(), aTmp))
+        ScAddress aAbs = rRef.toAbs(rPos);
+        if (rRef.IsTabDeleted() || static_cast<size_t>(aAbs.Tab()) >= rTabNames.size())
         {
             rTabName = ScGlobal::GetRscString( STR_NO_REF_TABLE );
             return false;
         }
-        rTabName = aTmp;
+        rTabName = rTabNames[aAbs.Tab()];
 
         // Cheesy hack to unparse the OOO style "'Doc'#Tab"
         sal_Int32 nPos = ScCompiler::GetDocTabPos( rTabName);
@@ -1074,7 +1079,8 @@ struct ConventionXL
     }
 
     static void MakeDocStr( OUStringBuffer& rBuf,
-                            const ScCompiler& rComp,
+                            const ScAddress& rPos,
+                            const std::vector<OUString>& rTabNames,
                             const ScComplexRefData& rRef,
                             bool bSingleRef )
     {
@@ -1083,13 +1089,13 @@ struct ConventionXL
             OUString aStartTabName, aStartDocName, aEndTabName, aEndDocName;
             bool bStartHasDoc = false, bEndHasDoc = false;
 
-            bStartHasDoc = GetDocAndTab( rComp, rRef.Ref1,
-                                         aStartDocName, aStartTabName);
+            bStartHasDoc = GetDocAndTab(
+                rPos, rTabNames, rRef.Ref1, aStartDocName, aStartTabName);
 
             if( !bSingleRef && rRef.Ref2.IsFlag3D() )
             {
-                bEndHasDoc = GetDocAndTab( rComp, rRef.Ref2,
-                                           aEndDocName, aEndTabName);
+                bEndHasDoc = GetDocAndTab(
+                    rPos, rTabNames, rRef.Ref2, aEndDocName, aEndTabName);
             }
             else
                 bEndHasDoc = bStartHasDoc;
@@ -1259,8 +1265,11 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
         MakeRowStr(rBuf, rAbs.Row());
     }
 
-    void MakeRefStr( OUStringBuffer&   rBuf,
-                     const ScCompiler&      rComp,
+    void makeRefStr( OUStringBuffer&   rBuf,
+                     const ScAddress& rPos,
+                     FormulaGrammar::Grammar /*eGram*/,
+                     const OUString& /*rErrRef*/,
+                     const std::vector<OUString>& rTabNames,
                      const ScComplexRefData& rRef,
                      bool bSingleRef ) const
     {
@@ -1268,9 +1277,9 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
 
         // Play fast and loose with invalid refs.  There is not much point in producing
         // Foo!A1:#REF! versus #REF! at this point
-        ScAddress aAbs1 = aRef.Ref1.toAbs(rComp.GetPos()), aAbs2;
+        ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2;
 
-        MakeDocStr( rBuf, rComp, aRef, bSingleRef );
+        MakeDocStr(rBuf, rPos, rTabNames, aRef, bSingleRef);
 
         if (!ValidAddress(aAbs1))
         {
@@ -1280,7 +1289,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
 
         if( !bSingleRef )
         {
-            aAbs2 = aRef.Ref2.toAbs(rComp.GetPos());
+            aAbs2 = aRef.Ref2.toAbs(rPos);
             if (!ValidAddress(aAbs2))
             {
                 rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE));
@@ -1448,15 +1457,18 @@ r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef, const ScAddress
 struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
 {
     ConventionXL_R1C1() : ScCompiler::Convention( FormulaGrammar::CONV_XL_R1C1 ) { }
-    void MakeRefStr( OUStringBuffer&   rBuf,
-                     const ScCompiler&      rComp,
+    void makeRefStr( OUStringBuffer&   rBuf,
+                     const ScAddress& rPos,
+                     FormulaGrammar::Grammar /*eGram*/,
+                     const OUString& /*rErrRef*/,
+                     const std::vector<OUString>& rTabNames,
                      const ScComplexRefData& rRef,
                      bool bSingleRef ) const
     {
-        ScRange aAbsRef = rRef.toAbs(rComp.GetPos());
+        ScRange aAbsRef = rRef.toAbs(rPos);
         ScComplexRefData aRef( rRef );
 
-        MakeDocStr( rBuf, rComp, aRef, bSingleRef );
+        MakeDocStr(rBuf, rPos, rTabNames, aRef, bSingleRef);
 
         // Play fast and loose with invalid refs.  There is not much point in producing
         // Foo!A1:#REF! versus #REF! at this point
@@ -1662,7 +1674,7 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos)
         :
         pDoc( pDocument ),
         aPos( rPos ),
-        mpFormatter(pDoc->GetFormatTable()),
+        mpFormatter(pDoc ? pDoc->GetFormatTable() : NULL),
         pCharClass( ScGlobal::pCharClass ),
         mnPredetectedReference(0),
         mnRangeOpPosInSymbol(-1),
@@ -1729,16 +1741,31 @@ sal_Int32 ScCompiler::GetDocTabPos( const OUString& rString )
 
 void ScCompiler::SetRefConvention( FormulaGrammar::AddressConvention eConv )
 {
-    switch ( eConv ) {
-        case FormulaGrammar::CONV_UNSPECIFIED :
-            break;
-        default :
-        case FormulaGrammar::CONV_OOO :      SetRefConvention( pConvOOO_A1 ); break;
-        case FormulaGrammar::CONV_ODF :      SetRefConvention( pConvOOO_A1_ODF ); break;
-        case FormulaGrammar::CONV_XL_A1 :    SetRefConvention( pConvXL_A1 );  break;
-        case FormulaGrammar::CONV_XL_R1C1 :  SetRefConvention( pConvXL_R1C1 ); break;
-        case FormulaGrammar::CONV_XL_OOX :   SetRefConvention( pConvXL_OOX ); break;
+    const Convention* p = GetRefConvention(eConv);
+    if (p)
+        SetRefConvention(p);
+}
+
+const ScCompiler::Convention* ScCompiler::GetRefConvention( FormulaGrammar::AddressConvention eConv )
+{
+    switch (eConv)
+    {
+        case FormulaGrammar::CONV_OOO:
+            return pConvOOO_A1;
+        case FormulaGrammar::CONV_ODF:
+            return pConvOOO_A1_ODF;
+        case FormulaGrammar::CONV_XL_A1:
+            return pConvXL_A1;
+        case FormulaGrammar::CONV_XL_R1C1:
+            return pConvXL_R1C1;
+        case FormulaGrammar::CONV_XL_OOX:
+            return pConvXL_OOX;
+        case FormulaGrammar::CONV_UNSPECIFIED:
+        default:
+            ;
     }
+
+    return NULL;
 }
 
 void ScCompiler::SetRefConvention( const ScCompiler::Convention *pConvP )
@@ -4188,6 +4215,8 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken*
     const ScSingleRefData& rRef = static_cast<const ScToken*>(_pTokenP)->GetSingleRef();
     ScComplexRefData aRef;
     aRef.Ref1 = aRef.Ref2 = rRef;
+    OUString aErrRef = GetCurrentOpCodeMap()->getSymbol( ocErrRef);
+    std::vector<OUString> aTabNames = GetDoc()->GetAllTableNames();
     if ( eOp == ocColRowName )
     {
         ScAddress aAbs = rRef.toAbs(aPos);
@@ -4200,16 +4229,18 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken*
         else
         {
             rBuffer.append(ScGlobal::GetRscString(STR_NO_NAME_REF));
-            pConv->MakeRefStr (rBuffer, *this, aRef, true );
+            pConv->makeRefStr(rBuffer, aPos, meGrammar, aErrRef, aTabNames, aRef, true);
         }
     }
     else
-        pConv->MakeRefStr( rBuffer, *this, aRef, true );
+        pConv->makeRefStr(rBuffer, aPos, meGrammar, aErrRef, aTabNames, aRef, true);
 }
 
 void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
 {
-    pConv->MakeRefStr( rBuffer, *this, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false );
+    OUString aErrRef = GetCurrentOpCodeMap()->getSymbol( ocErrRef);
+    std::vector<OUString> aTabNames = GetDoc()->GetAllTableNames();
+    pConv->makeRefStr(rBuffer, aPos, meGrammar, aErrRef, aTabNames, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false);
 }
 
 void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index aa6e68c..0361414 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -38,6 +38,7 @@
 #include "externalrefmgr.hxx"
 #include "document.hxx"
 #include "refupdatecontext.hxx"
+#include "tokenstringcontext.hxx"
 #include "types.hxx"
 #include "svl/sharedstring.hxx"
 
@@ -3104,6 +3105,163 @@ void ScTokenArray::CheckRelativeReferenceBounds(
     }
 }
 
+namespace {
+
+void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, const FormulaToken& rToken, const ScAddress& rPos )
+{
+    if (rToken.IsExternalRef())
+    {
+        // TODO : Implement this.
+        return;
+    }
+
+    OpCode eOp = rToken.GetOpCode();
+    switch (rToken.GetType())
+    {
+        case svDouble:
+        {
+            if (rCxt.mxOpCodeMap->isEnglish())
+            {
+                rtl::math::doubleToUStringBuffer(
+                    rBuf, rToken.GetDouble(), rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, '.', true);
+            }
+            else
+            {
+                SvtSysLocale aSysLocale;
+                rtl::math::doubleToUStringBuffer(
+                    rBuf, rToken.GetDouble(),
+                    rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
+                    aSysLocale.GetLocaleDataPtr()->getNumDecimalSep()[0], true);
+            }
+        }
+        break;
+        case svString:
+        {
+            OUString aStr = rToken.GetString().getString();
+            if (eOp == ocBad || eOp == ocStringXML)
+            {
+                rBuf.append(aStr);
+                return;
+            }
+
+            rBuf.append(sal_Unicode('"'));
+            rBuf.append(aStr.replaceAll("\"", "\"\""));
+            rBuf.append(sal_Unicode('"'));
+        }
+        break;
+        case svSingleRef:
+        {
+            if (rCxt.mpRefConv)
+            {
+                const ScSingleRefData& rRef = static_cast<const ScToken&>(rToken).GetSingleRef();
+                ScComplexRefData aRef;
+                aRef.Ref1 = rRef;
+                aRef.Ref2 = rRef;
+                rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt.meGram, rCxt.maErrRef, rCxt.maTabNames, aRef, true);
+            }
+            else
+                rBuf.append(rCxt.maErrRef);
+        }
+        break;
+        case svDoubleRef:
+        {
+            if (rCxt.mpRefConv)
+            {
+                const ScComplexRefData& rRef = static_cast<const ScToken&>(rToken).GetDoubleRef();
+                rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt.meGram, rCxt.maErrRef, rCxt.maTabNames, rRef, false);
+            }
+            else
+                rBuf.append(rCxt.maErrRef);
+        }
+        break;
+        case svMatrix:
+            // TODO : Implement this.
+        break;
+        case svIndex:
+            // TODO : Implement this.
+        break;
+        case svExternal:
+            // TODO : Implement this.
+        break;
+        case svError:
+        {
+            sal_uInt16 nErr = rToken.GetError();
+            OpCode eOpErr;
+            switch (nErr)
+            {
+                break;
+                case errDivisionByZero:
+                    eOpErr = ocErrDivZero;
+                break;
+                case errNoValue:
+                    eOpErr = ocErrValue;
+                break;
+                case errNoRef:
+                    eOpErr = ocErrRef;
+                break;
+                case errNoName:
+                    eOpErr = ocErrName;
+                break;
+                case errIllegalFPOperation:
+                    eOpErr = ocErrNum;
+                break;
+                case NOTAVAILABLE:
+                    eOpErr = ocErrNA;
+                break;
+                case errNoCode:
+                default:
+                    eOpErr = ocErrNull;
+            }
+            rBuf.append(rCxt.mxOpCodeMap->getSymbol(eOpErr));
+        }
+        break;
+        case svByte:
+        case svJump:
+        case svFAP:
+        case svMissing:
+        case svSep:
+        default:
+            ;
+    }
+}
+
+}
+
+OUString ScTokenArray::CreateString( sc::TokenStringContext& rCxt, const ScAddress& rPos ) const
+{
+    if (!nLen)
+        return OUString();
+
+    OUStringBuffer aBuf;
+
+    FormulaToken** p = pCode;
+    FormulaToken** pEnd = p + static_cast<size_t>(nLen);
+    for (; p != pEnd; ++p)
+    {
+        const FormulaToken* pToken = *p;
+        OpCode eOp = pToken->GetOpCode();
+        switch (eOp)
+        {
+            case ocPush:
+                appendTokenByType(rCxt, aBuf, *pToken, rPos);
+            break;
+            case ocSpaces:
+                // TODO : Handle intersection operator '!!'.
+                aBuf.append(sal_Unicode(' '));
+            break;
+            default:
+            {
+                if (eOp < rCxt.mxOpCodeMap->getSymbolCount())
+                    aBuf.append(rCxt.mxOpCodeMap->getSymbol(eOp));
+                else
+                    return OUString();
+            }
+        }
+    }
+
+    return aBuf.makeStringAndClear();
+}
+
 #if DEBUG_FORMULA_COMPILER
 void ScTokenArray::Dump() const
 {
diff --git a/sc/source/core/tool/tokenstringcontext.cxx b/sc/source/core/tool/tokenstringcontext.cxx
new file mode 100644
index 0000000..5fea0a9
--- /dev/null
+++ b/sc/source/core/tool/tokenstringcontext.cxx
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "tokenstringcontext.hxx"
+#include "compiler.hxx"
+
+using namespace com::sun::star;
+
+namespace sc {
+
+TokenStringContext::TokenStringContext( formula::FormulaGrammar::Grammar eGram ) :
+    meGram(eGram),
+    mpRefConv(ScCompiler::GetRefConvention(formula::FormulaGrammar::extractRefConvention(eGram)))
+{
+    ScCompiler aComp(NULL, ScAddress());
+    mxOpCodeMap = aComp.GetOpCodeMap(formula::FormulaGrammar::extractFormulaLanguage(eGram));
+    if (mxOpCodeMap)
+        maErrRef = mxOpCodeMap->getSymbol(ocErrRef);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 3269d73ed327ea02ee34994170812a6c7600abd8
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu Nov 14 14:57:21 2013 -0500

    Remove unused member.
    
    Change-Id: I8331251f77fb202375370a425e01862aa0f6310d

diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index 803a46a..0dba793 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -529,7 +529,6 @@ DBG_NAME(FormulaCompiler)
 FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr )
         :
         pArr( &rArr ),
-        pExternalRef(NULL),
         pStack( NULL ),
         nRecursion(0),
         nNumFmt( NUMBERFORMAT_UNDEFINED ),
@@ -546,7 +545,6 @@ FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr )
 FormulaCompiler::FormulaCompiler()
         :
         pArr( NULL ),
-        pExternalRef(NULL),
         pStack( NULL ),
         nRecursion(0),
         nNumFmt( NUMBERFORMAT_UNDEFINED ),
diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx
index e851fcf..b450ed6 100644
--- a/include/formula/FormulaCompiler.hxx
+++ b/include/formula/FormulaCompiler.hxx
@@ -320,7 +320,6 @@ protected:
     FormulaTokenRef     mpToken;                // current token
     FormulaTokenRef     pCurrentFactorToken;    // current factor token (of Factor() method)
     FormulaTokenArray*  pArr;
-    ExternalReferenceHelper* pExternalRef;
 
     FormulaToken**      pCode;
     FormulaArrayStack*  pStack;
commit 4554e122401e0d06f3f0adf02e7307983e4b77a6
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu Nov 14 14:39:56 2013 -0500

    Identify methods that don't modify internal state and mark them const.
    
    Change-Id: Ie63d93d51640bfb80dc02bb226d742c2f9be96d8

diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index d099042..803a46a 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -963,7 +963,7 @@ sal_uInt16 FormulaCompiler::GetErrorConstant( const OUString& rName ) const
 }
 
 
-void FormulaCompiler::AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError )
+void FormulaCompiler::AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError ) const
 {
     OpCode eOp;
     switch (nError)
@@ -1875,7 +1875,7 @@ FormulaToken* FormulaCompiler::CreateStringFromToken( OUStringBuffer& rBuffer, F
 }
 
 
-void FormulaCompiler::AppendDouble( OUStringBuffer& rBuffer, double fVal )
+void FormulaCompiler::AppendDouble( OUStringBuffer& rBuffer, double fVal ) const
 {
     if ( mxSymbols->isEnglish() )
     {
@@ -1894,12 +1894,12 @@ void FormulaCompiler::AppendDouble( OUStringBuffer& rBuffer, double fVal )
     }
 }
 
-void FormulaCompiler::AppendBoolean( OUStringBuffer& rBuffer, bool bVal )
+void FormulaCompiler::AppendBoolean( OUStringBuffer& rBuffer, bool bVal ) const
 {
     rBuffer.append( mxSymbols->getSymbol( static_cast<OpCode>(bVal ? ocTrue : ocFalse)) );
 }
 
-void FormulaCompiler::AppendString( OUStringBuffer& rBuffer, const OUString & rStr )
+void FormulaCompiler::AppendString( OUStringBuffer& rBuffer, const OUString & rStr ) const
 {
     rBuffer.append( sal_Unicode('"'));
     if ( lcl_UnicodeStrChr( rStr.getStr(), '"' ) == NULL )
@@ -2074,27 +2074,27 @@ bool FormulaCompiler::HandleDbData()
     return true;
 }
 
-void FormulaCompiler::CreateStringFromSingleRef( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/)
+void FormulaCompiler::CreateStringFromSingleRef( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const
 {
 }
 
-void FormulaCompiler::CreateStringFromDoubleRef( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/)
+void FormulaCompiler::CreateStringFromDoubleRef( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const
 {
 }
 
-void FormulaCompiler::CreateStringFromIndex( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/)
+void FormulaCompiler::CreateStringFromIndex( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const
 {
 }
 
-void FormulaCompiler::CreateStringFromMatrix( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/)
+void FormulaCompiler::CreateStringFromMatrix( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const
 {
 }
 
-void FormulaCompiler::CreateStringFromExternal( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/)
+void FormulaCompiler::CreateStringFromExternal( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const
 {
 }
 
-void FormulaCompiler::LocalizeString( OUString& /*rName*/ )
+void FormulaCompiler::LocalizeString( OUString& /*rName*/ ) const
 {
 }
 
diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx
index ff2ebf3..e851fcf 100644
--- a/include/formula/FormulaCompiler.hxx
+++ b/include/formula/FormulaCompiler.hxx
@@ -245,9 +245,9 @@ public:
     FormulaToken* CreateStringFromToken( OUStringBuffer& rBuffer, FormulaToken* pToken,
                                     bool bAllowArrAdvance = false );
 
-    void AppendBoolean( OUStringBuffer& rBuffer, bool bVal );
-    void AppendDouble( OUStringBuffer& rBuffer, double fVal );
-    void AppendString( OUStringBuffer& rBuffer, const OUString & rStr );
+    void AppendBoolean( OUStringBuffer& rBuffer, bool bVal ) const;
+    void AppendDouble( OUStringBuffer& rBuffer, double fVal ) const;
+    void AppendString( OUStringBuffer& rBuffer, const OUString & rStr ) const;
 
     /** Set symbol map corresponding to one of predefined formula::FormulaGrammar::Grammar,
         including an address reference convention. */
@@ -282,14 +282,14 @@ protected:
     virtual bool HandleSingleRef();
     virtual bool HandleDbData();
 
-    virtual void CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* pTokenP);
-    virtual void CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* pTokenP);
-    virtual void CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* pTokenP);
-    virtual void CreateStringFromMatrix(OUStringBuffer& rBuffer,FormulaToken* pTokenP);
-    virtual void CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* pTokenP);
-    virtual void LocalizeString(OUString& rName );   // modify rName - input: exact name
+    virtual void CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* pTokenP) const;
+    virtual void CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const;
+    virtual void CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const;
+    virtual void CreateStringFromMatrix(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const;
+    virtual void CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const;
+    virtual void LocalizeString( OUString& rName ) const;   // modify rName - input: exact name
 
-    void AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError );
+    void AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError ) const;
 
     bool   GetToken();
     OpCode NextToken();
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index 3b366c0..4cd31a3 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -472,12 +472,12 @@ private:
     virtual bool HandleDbData();
 
     virtual formula::FormulaTokenRef ExtendRangeReference( formula::FormulaToken & rTok1, formula::FormulaToken & rTok2, bool bReuseDoubleRef );
-    virtual void CreateStringFromExternal(OUStringBuffer& rBuffer, formula::FormulaToken* pTokenP);
-    virtual void CreateStringFromSingleRef(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP);
-    virtual void CreateStringFromDoubleRef(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP);
-    virtual void CreateStringFromMatrix( OUStringBuffer& rBuffer, formula::FormulaToken* _pTokenP);
-    virtual void CreateStringFromIndex(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP);
-    virtual void LocalizeString( OUString& rName );   // modify rName - input: exact name
+    virtual void CreateStringFromExternal(OUStringBuffer& rBuffer, formula::FormulaToken* pTokenP) const;
+    virtual void CreateStringFromSingleRef(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP) const;
+    virtual void CreateStringFromDoubleRef(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP) const;
+    virtual void CreateStringFromMatrix( OUStringBuffer& rBuffer, formula::FormulaToken* _pTokenP) const;
+    virtual void CreateStringFromIndex(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP) const;
+    virtual void LocalizeString( OUString& rName ) const;   // modify rName - input: exact name
 
     /// Access the CharTable flags
     inline sal_uLong GetCharTableFlags( sal_Unicode c, sal_Unicode cLast )
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index bcff41e..52d47df 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4109,7 +4109,7 @@ bool ScCompiler::IsCharFlagAllConventions(
         return false;
 }
 
-void ScCompiler::CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* pTokenP)
+void ScCompiler::CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* pTokenP) const
 {
     FormulaToken* t = pTokenP;
     ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager();
@@ -4137,8 +4137,8 @@ void ScCompiler::CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken*
     }
 }
 
-void ScCompiler::CreateStringFromMatrix( OUStringBuffer& rBuffer,
-                                           FormulaToken* pTokenP)
+void ScCompiler::CreateStringFromMatrix(
+    OUStringBuffer& rBuffer, FormulaToken* pTokenP) const
 {
     const ScMatrix* pMatrix = static_cast<ScToken*>(pTokenP)->GetMatrix();
     SCSIZE nC, nMaxC, nR, nMaxR;
@@ -4182,10 +4182,10 @@ void ScCompiler::CreateStringFromMatrix( OUStringBuffer& rBuffer,
     rBuffer.append( mxSymbols->getSymbol(ocArrayClose) );
 }
 
-void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP)
+void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
 {
     const OpCode eOp = _pTokenP->GetOpCode();
-    ScSingleRefData& rRef = static_cast<ScToken*>(_pTokenP)->GetSingleRef();
+    const ScSingleRefData& rRef = static_cast<const ScToken*>(_pTokenP)->GetSingleRef();
     ScComplexRefData aRef;
     aRef.Ref1 = aRef.Ref2 = rRef;
     if ( eOp == ocColRowName )
@@ -4207,12 +4207,12 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken*
         pConv->MakeRefStr( rBuffer, *this, aRef, true );
 }
 
-void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP)
+void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
 {
     pConv->MakeRefStr( rBuffer, *this, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false );
 }
 
-void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP)
+void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
 {
     const OpCode eOp = _pTokenP->GetOpCode();
     OUStringBuffer aBuffer;
@@ -4220,14 +4220,14 @@ void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pT
     {
         case ocName:
         {
-            ScRangeData* pData = GetRangeData( *_pTokenP);
+            const ScRangeData* pData = GetRangeData( *_pTokenP);
             if (pData)
                 aBuffer.append(pData->GetName());
         }
         break;
         case ocDBArea:
         {
-            ScDBData* pDBData = pDoc->GetDBCollection()->getNamedDBs().findByIndex(_pTokenP->GetIndex());
+            const ScDBData* pDBData = pDoc->GetDBCollection()->getNamedDBs().findByIndex(_pTokenP->GetIndex());
             if (pDBData)
                 aBuffer.append(pDBData->GetName());
         }
@@ -4241,7 +4241,7 @@ void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pT
         rBuffer.append(ScGlobal::GetRscString(STR_NO_NAME_REF));
 }
 
-void ScCompiler::LocalizeString( OUString& rName )
+void ScCompiler::LocalizeString( OUString& rName ) const
 {
     ScGlobal::GetAddInCollection()->LocalizeString( rName );
 }


More information about the Libreoffice-commits mailing list