sc/inc/compiler.hxx | 12 ++++- sc/source/core/tool/compiler.cxx | 88 +++++++++++++++++++-------------------- sc/source/core/tool/token.cxx | 4 - 3 files changed, 57 insertions(+), 47 deletions(-)
New commits: commit dbe2563b41ef70b7a56aa0490c6b8110c3783932 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Nov 15 11:28:48 2013 -0500 Have makeRefStr() accept a context object rather than individual params. Change-Id: Id52e02aa29d85d207420c80a95ada2f8487f165f diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 6844b28..ee3c689 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -78,6 +78,12 @@ class ScRangeData; class ScExternalRefManager; class ScTokenArray; +namespace sc { + +struct TokenStringContext; + +} + // constants and data types internal to compiler /* @@ -235,8 +241,7 @@ public: virtual ~Convention(); virtual void makeRefStr( - OUStringBuffer& rBuffer, const ScAddress& rPos, formula::FormulaGrammar::Grammar eGram, - const OUString& rErrRef, const std::vector<OUString>& rTabNames, + OUStringBuffer& rBuffer, const ScAddress& rPos, const sc::TokenStringContext& rCxt, const ScComplexRefData& rRef, bool bSingleRef ) const = 0; virtual ::com::sun::star::i18n::ParseResult @@ -333,6 +338,7 @@ private: bool mbCloseBrackets; // whether to close open brackets automatically, default TRUE bool mbRewind; // whether symbol is to be rewound to some step during lexical analysis std::vector<sal_uInt16> maExternalFiles; + mutable sc::TokenStringContext* mpTokenStringCxt; bool NextNewToken(bool bInArray = false); @@ -370,6 +376,8 @@ public: ScCompiler( ScDocument* pDocument, const ScAddress&,ScTokenArray& rArr); + virtual ~ScCompiler(); + public: static void DeInit(); /// all diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 1ef766c..b5fdedc 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -67,6 +67,7 @@ #include "formulaparserpool.hxx" #include "tokenarray.hxx" #include "scmatrix.hxx" +#include "tokenstringcontext.hxx" using namespace formula; using namespace ::com::sun::star; @@ -727,14 +728,14 @@ 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 std::vector<OUString>& rTabNames, SCTAB nTab, OUString& aDoc ) + static OUString MakeTabStr( const sc::TokenStringContext& rCxt, SCTAB nTab, OUString& aDoc ) { OUString aString; - if (static_cast<size_t>(nTab) >= rTabNames.size()) + if (static_cast<size_t>(nTab) >= rCxt.maTabNames.size()) aString = ScGlobal::GetRscString(STR_NO_REF_TABLE); else { - aString = rTabNames[nTab]; + aString = rCxt.maTabNames[nTab]; // "'Doc'#Tab" sal_Int32 nPos = ScCompiler::GetDocTabPos( aString ); if ( nPos != -1 ) @@ -753,7 +754,7 @@ struct ConventionOOO_A1 : public Convention_A1 } void MakeOneRefStrImpl( - OUStringBuffer& rBuffer, const OUString& rErrRef, const std::vector<OUString>& rTabNames, + OUStringBuffer& rBuffer, const sc::TokenStringContext& rCxt, const ScSingleRefData& rRef, const ScAddress& rAbsRef, bool bForceTab, bool bODF ) const { @@ -763,13 +764,13 @@ struct ConventionOOO_A1 : public Convention_A1 { if (!rRef.IsTabRel()) rBuffer.append('$'); - rBuffer.append(rErrRef); + rBuffer.append(rCxt.maErrRef); rBuffer.append('.'); } else { OUString aDoc; - OUString aRefStr(MakeTabStr(rTabNames, rAbsRef.Tab(), aDoc)); + OUString aRefStr(MakeTabStr(rCxt, rAbsRef.Tab(), aDoc)); rBuffer.append(aDoc); if (!rRef.IsTabRel()) rBuffer.append('$'); @@ -781,22 +782,20 @@ struct ConventionOOO_A1 : public Convention_A1 if (!rRef.IsColRel()) rBuffer.append('$'); if (!ValidCol(rAbsRef.Col())) - rBuffer.append(rErrRef); + rBuffer.append(rCxt.maErrRef); else MakeColStr(rBuffer, rAbsRef.Col()); if (!rRef.IsRowRel()) rBuffer.append('$'); if (!ValidRow(rAbsRef.Row())) - rBuffer.append(rErrRef); + rBuffer.append(rCxt.maErrRef); else MakeRowStr(rBuffer, rAbsRef.Row()); } void makeRefStr( OUStringBuffer& rBuffer, const ScAddress& rPos, - FormulaGrammar::Grammar /*eGram*/, - const OUString& rErrRef, - const std::vector<OUString>& rTabNames, + const sc::TokenStringContext& rCxt, const ScComplexRefData& rRef, bool bSingleRef ) const { @@ -807,11 +806,11 @@ struct ConventionOOO_A1 : public Convention_A1 if( !bSingleRef ) aAbs2 = aRef.Ref2.toAbs(rPos); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, false, false); + MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref1, aAbs1, false, false); if (!bSingleRef) { rBuffer.append(':'); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false); + MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false); } } @@ -987,9 +986,7 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 ConventionOOO_A1_ODF() : ConventionOOO_A1 (FormulaGrammar::CONV_ODF) { } void makeRefStr( OUStringBuffer& rBuffer, const ScAddress& rPos, - FormulaGrammar::Grammar eGram, - const OUString& rErrRef, - const std::vector<OUString>& rTabNames, + const sc::TokenStringContext& rCxt, const ScComplexRefData& rRef, bool bSingleRef ) const { @@ -1001,20 +998,20 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 if( !bSingleRef ) aAbs2 = aRef.Ref2.toAbs(rPos); - if (FormulaGrammar::isODFF(eGram) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2))) + if (FormulaGrammar::isODFF(rCxt.meGram) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2))) { - rBuffer.append(rErrRef); + rBuffer.append(rCxt.maErrRef); // 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); + MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref1, aAbs1, false, true); if (!bSingleRef) { rBuffer.append(sal_Unicode(':')); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true); + MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true); } } rBuffer.append(sal_Unicode(']')); @@ -1046,19 +1043,19 @@ const ScCompiler::Convention * const ScCompiler::pConvOOO_A1_ODF = &ConvOOO_A1_O struct ConventionXL { static bool GetDocAndTab( - const ScAddress& rPos, const std::vector<OUString>& rTabNames, + const ScAddress& rPos, const sc::TokenStringContext& rCxt, const ScSingleRefData& rRef, OUString& rDocName, OUString& rTabName ) { bool bHasDoc = false; rDocName = ""; ScAddress aAbs = rRef.toAbs(rPos); - if (rRef.IsTabDeleted() || static_cast<size_t>(aAbs.Tab()) >= rTabNames.size()) + if (rRef.IsTabDeleted() || static_cast<size_t>(aAbs.Tab()) >= rCxt.maTabNames.size()) { rTabName = ScGlobal::GetRscString( STR_NO_REF_TABLE ); return false; } - rTabName = rTabNames[aAbs.Tab()]; + rTabName = rCxt.maTabNames[aAbs.Tab()]; // Cheesy hack to unparse the OOO style "'Doc'#Tab" sal_Int32 nPos = ScCompiler::GetDocTabPos( rTabName); @@ -1080,7 +1077,7 @@ struct ConventionXL static void MakeDocStr( OUStringBuffer& rBuf, const ScAddress& rPos, - const std::vector<OUString>& rTabNames, + const sc::TokenStringContext& rCxt, const ScComplexRefData& rRef, bool bSingleRef ) { @@ -1090,12 +1087,12 @@ struct ConventionXL bool bStartHasDoc = false, bEndHasDoc = false; bStartHasDoc = GetDocAndTab( - rPos, rTabNames, rRef.Ref1, aStartDocName, aStartTabName); + rPos, rCxt, rRef.Ref1, aStartDocName, aStartTabName); if( !bSingleRef && rRef.Ref2.IsFlag3D() ) { bEndHasDoc = GetDocAndTab( - rPos, rTabNames, rRef.Ref2, aEndDocName, aEndTabName); + rPos, rCxt, rRef.Ref2, aEndDocName, aEndTabName); } else bEndHasDoc = bStartHasDoc; @@ -1267,9 +1264,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL void makeRefStr( OUStringBuffer& rBuf, const ScAddress& rPos, - FormulaGrammar::Grammar /*eGram*/, - const OUString& /*rErrRef*/, - const std::vector<OUString>& rTabNames, + const sc::TokenStringContext& rCxt, const ScComplexRefData& rRef, bool bSingleRef ) const { @@ -1279,7 +1274,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL // Foo!A1:#REF! versus #REF! at this point ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2; - MakeDocStr(rBuf, rPos, rTabNames, aRef, bSingleRef); + MakeDocStr(rBuf, rPos, rCxt, aRef, bSingleRef); if (!ValidAddress(aAbs1)) { @@ -1459,16 +1454,14 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL ConventionXL_R1C1() : ScCompiler::Convention( FormulaGrammar::CONV_XL_R1C1 ) { } void makeRefStr( OUStringBuffer& rBuf, const ScAddress& rPos, - FormulaGrammar::Grammar /*eGram*/, - const OUString& /*rErrRef*/, - const std::vector<OUString>& rTabNames, + const sc::TokenStringContext& rCxt, const ScComplexRefData& rRef, bool bSingleRef ) const { ScRange aAbsRef = rRef.toAbs(rPos); ScComplexRefData aRef( rRef ); - MakeDocStr(rBuf, rPos, rTabNames, aRef, bSingleRef); + MakeDocStr(rBuf, rPos, rCxt, aRef, bSingleRef); // Play fast and loose with invalid refs. There is not much point in producing // Foo!A1:#REF! versus #REF! at this point @@ -1665,7 +1658,8 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos,ScTokenArra meEncodeUrlMode( ENCODE_BY_GRAMMAR ), meExtendedErrorDetection( EXTENDED_ERROR_DETECTION_NONE ), mbCloseBrackets( true ), - mbRewind( false ) + mbRewind( false ), + mpTokenStringCxt(NULL) { nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0; } @@ -1682,11 +1676,17 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos) meEncodeUrlMode( ENCODE_BY_GRAMMAR ), meExtendedErrorDetection( EXTENDED_ERROR_DETECTION_NONE ), mbCloseBrackets( true ), - mbRewind( false ) + mbRewind( false ), + mpTokenStringCxt(NULL) { nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0; } +ScCompiler::~ScCompiler() +{ + delete mpTokenStringCxt; +} + void ScCompiler::CheckTabQuotes( OUString& rString, const FormulaGrammar::AddressConvention eConv ) { @@ -4224,12 +4224,13 @@ void ScCompiler::CreateStringFromMatrix( void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const { + if (!mpTokenStringCxt) + mpTokenStringCxt = new sc::TokenStringContext(pDoc, meGrammar); + const OpCode eOp = _pTokenP->GetOpCode(); 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); @@ -4242,18 +4243,19 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* else { rBuffer.append(ScGlobal::GetRscString(STR_NO_NAME_REF)); - pConv->makeRefStr(rBuffer, aPos, meGrammar, aErrRef, aTabNames, aRef, true); + pConv->makeRefStr(rBuffer, aPos, *mpTokenStringCxt, aRef, true); } } else - pConv->makeRefStr(rBuffer, aPos, meGrammar, aErrRef, aTabNames, aRef, true); + pConv->makeRefStr(rBuffer, aPos, *mpTokenStringCxt, aRef, true); } void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const { - OUString aErrRef = GetCurrentOpCodeMap()->getSymbol( ocErrRef); - std::vector<OUString> aTabNames = GetDoc()->GetAllTableNames(); - pConv->makeRefStr(rBuffer, aPos, meGrammar, aErrRef, aTabNames, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false); + if (!mpTokenStringCxt) + mpTokenStringCxt = new sc::TokenStringContext(pDoc, meGrammar); + + pConv->makeRefStr(rBuffer, aPos, *mpTokenStringCxt, 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 8984632..c2b8056 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -3201,7 +3201,7 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons ScComplexRefData aRef; aRef.Ref1 = rRef; aRef.Ref2 = rRef; - rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt.meGram, rCxt.maErrRef, rCxt.maTabNames, aRef, true); + rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt, aRef, true); } else rBuf.append(rCxt.maErrRef); @@ -3212,7 +3212,7 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons 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); + rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt, rRef, false); } else rBuf.append(rCxt.maErrRef); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits