Kaydet (Commit) 0df2c02d authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Let's have makeRefStr() take individual parameters again.

And remove use of TokenStringContext from ScCompiler.

Change-Id: Ib0636e2437a64edd372623a7176dab462eed831b
üst 62b36e80
...@@ -78,12 +78,6 @@ class ScRangeData; ...@@ -78,12 +78,6 @@ class ScRangeData;
class ScExternalRefManager; class ScExternalRefManager;
class ScTokenArray; class ScTokenArray;
namespace sc {
struct TokenStringContext;
}
// constants and data types internal to compiler // constants and data types internal to compiler
/* /*
...@@ -241,7 +235,10 @@ public: ...@@ -241,7 +235,10 @@ public:
virtual ~Convention(); virtual ~Convention();
virtual void makeRefStr( virtual void makeRefStr(
OUStringBuffer& rBuffer, const ScAddress& rPos, const sc::TokenStringContext& rCxt, OUStringBuffer& rBuffer,
formula::FormulaGrammar::Grammar eGram,
const ScAddress& rPos,
const OUString& rErrRef, const std::vector<OUString>& rTabNames,
const ScComplexRefData& rRef, bool bSingleRef ) const = 0; const ScComplexRefData& rRef, bool bSingleRef ) const = 0;
virtual ::com::sun::star::i18n::ParseResult virtual ::com::sun::star::i18n::ParseResult
...@@ -338,7 +335,7 @@ private: ...@@ -338,7 +335,7 @@ private:
bool mbCloseBrackets; // whether to close open brackets automatically, default TRUE bool mbCloseBrackets; // whether to close open brackets automatically, default TRUE
bool mbRewind; // whether symbol is to be rewound to some step during lexical analysis bool mbRewind; // whether symbol is to be rewound to some step during lexical analysis
std::vector<sal_uInt16> maExternalFiles; std::vector<sal_uInt16> maExternalFiles;
mutable sc::TokenStringContext* mpTokenStringCxt; std::vector<OUString> maTabNames;
bool NextNewToken(bool bInArray = false); bool NextNewToken(bool bInArray = false);
......
...@@ -67,7 +67,6 @@ ...@@ -67,7 +67,6 @@
#include "formulaparserpool.hxx" #include "formulaparserpool.hxx"
#include "tokenarray.hxx" #include "tokenarray.hxx"
#include "scmatrix.hxx" #include "scmatrix.hxx"
#include "tokenstringcontext.hxx"
using namespace formula; using namespace formula;
using namespace ::com::sun::star; using namespace ::com::sun::star;
...@@ -728,19 +727,20 @@ struct ConventionOOO_A1 : public Convention_A1 ...@@ -728,19 +727,20 @@ struct ConventionOOO_A1 : public Convention_A1
ConventionOOO_A1() : Convention_A1 (FormulaGrammar::CONV_OOO) { } ConventionOOO_A1() : Convention_A1 (FormulaGrammar::CONV_OOO) { }
ConventionOOO_A1( FormulaGrammar::AddressConvention eConv ) : Convention_A1 (eConv) { } ConventionOOO_A1( FormulaGrammar::AddressConvention eConv ) : Convention_A1 (eConv) { }
static OUString MakeTabStr( const sc::TokenStringContext& rCxt, SCTAB nTab ) static OUString MakeTabStr( const std::vector<OUString>& rTabNames, SCTAB nTab )
{ {
OUString aString; OUString aString;
if (static_cast<size_t>(nTab) >= rCxt.maTabNames.size()) if (static_cast<size_t>(nTab) >= rTabNames.size())
aString = ScGlobal::GetRscString(STR_NO_REF_TABLE); aString = ScGlobal::GetRscString(STR_NO_REF_TABLE);
else else
aString = rCxt.maTabNames[nTab]; aString = rTabNames[nTab];
aString += "."; aString += ".";
return aString; return aString;
} }
void MakeOneRefStrImpl( void MakeOneRefStrImpl(
OUStringBuffer& rBuffer, const sc::TokenStringContext& rCxt, OUStringBuffer& rBuffer,
const OUString& rErrRef, const std::vector<OUString>& rTabNames,
const ScSingleRefData& rRef, const ScAddress& rAbsRef, const ScSingleRefData& rRef, const ScAddress& rAbsRef,
bool bForceTab, bool bODF ) const bool bForceTab, bool bODF ) const
{ {
...@@ -750,12 +750,12 @@ struct ConventionOOO_A1 : public Convention_A1 ...@@ -750,12 +750,12 @@ struct ConventionOOO_A1 : public Convention_A1
{ {
if (!rRef.IsTabRel()) if (!rRef.IsTabRel())
rBuffer.append('$'); rBuffer.append('$');
rBuffer.append(rCxt.maErrRef); rBuffer.append(rErrRef);
rBuffer.append('.'); rBuffer.append('.');
} }
else else
{ {
OUString aRefStr(MakeTabStr(rCxt, rAbsRef.Tab())); OUString aRefStr(MakeTabStr(rTabNames, rAbsRef.Tab()));
if (!rRef.IsTabRel()) if (!rRef.IsTabRel())
rBuffer.append('$'); rBuffer.append('$');
rBuffer.append(aRefStr); rBuffer.append(aRefStr);
...@@ -766,20 +766,21 @@ struct ConventionOOO_A1 : public Convention_A1 ...@@ -766,20 +766,21 @@ struct ConventionOOO_A1 : public Convention_A1
if (!rRef.IsColRel()) if (!rRef.IsColRel())
rBuffer.append('$'); rBuffer.append('$');
if (!ValidCol(rAbsRef.Col())) if (!ValidCol(rAbsRef.Col()))
rBuffer.append(rCxt.maErrRef); rBuffer.append(rErrRef);
else else
MakeColStr(rBuffer, rAbsRef.Col()); MakeColStr(rBuffer, rAbsRef.Col());
if (!rRef.IsRowRel()) if (!rRef.IsRowRel())
rBuffer.append('$'); rBuffer.append('$');
if (!ValidRow(rAbsRef.Row())) if (!ValidRow(rAbsRef.Row()))
rBuffer.append(rCxt.maErrRef); rBuffer.append(rErrRef);
else else
MakeRowStr(rBuffer, rAbsRef.Row()); MakeRowStr(rBuffer, rAbsRef.Row());
} }
void makeRefStr( OUStringBuffer& rBuffer, void makeRefStr( OUStringBuffer& rBuffer,
formula::FormulaGrammar::Grammar /*eGram*/,
const ScAddress& rPos, const ScAddress& rPos,
const sc::TokenStringContext& rCxt, const OUString& rErrRef, const std::vector<OUString>& rTabNames,
const ScComplexRefData& rRef, const ScComplexRefData& rRef,
bool bSingleRef ) const bool bSingleRef ) const
{ {
...@@ -790,11 +791,11 @@ struct ConventionOOO_A1 : public Convention_A1 ...@@ -790,11 +791,11 @@ struct ConventionOOO_A1 : public Convention_A1
if( !bSingleRef ) if( !bSingleRef )
aAbs2 = aRef.Ref2.toAbs(rPos); aAbs2 = aRef.Ref2.toAbs(rPos);
MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref1, aAbs1, false, false); MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, false, false);
if (!bSingleRef) if (!bSingleRef)
{ {
rBuffer.append(':'); rBuffer.append(':');
MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false); MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false);
} }
} }
...@@ -969,8 +970,9 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 ...@@ -969,8 +970,9 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
{ {
ConventionOOO_A1_ODF() : ConventionOOO_A1 (FormulaGrammar::CONV_ODF) { } ConventionOOO_A1_ODF() : ConventionOOO_A1 (FormulaGrammar::CONV_ODF) { }
void makeRefStr( OUStringBuffer& rBuffer, void makeRefStr( OUStringBuffer& rBuffer,
formula::FormulaGrammar::Grammar eGram,
const ScAddress& rPos, const ScAddress& rPos,
const sc::TokenStringContext& rCxt, const OUString& rErrRef, const std::vector<OUString>& rTabNames,
const ScComplexRefData& rRef, const ScComplexRefData& rRef,
bool bSingleRef ) const bool bSingleRef ) const
{ {
...@@ -982,20 +984,20 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 ...@@ -982,20 +984,20 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
if( !bSingleRef ) if( !bSingleRef )
aAbs2 = aRef.Ref2.toAbs(rPos); aAbs2 = aRef.Ref2.toAbs(rPos);
if (FormulaGrammar::isODFF(rCxt.meGram) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2))) if (FormulaGrammar::isODFF(eGram) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2)))
{ {
rBuffer.append(rCxt.maErrRef); rBuffer.append(rErrRef);
// For ODFF write [#REF!], but not for PODF so apps reading ODF // 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 // 1.0/1.1 may have a better chance if they implemented the old
// form. // form.
} }
else else
{ {
MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref1, aAbs1, false, true); MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, false, true);
if (!bSingleRef) if (!bSingleRef)
{ {
rBuffer.append(sal_Unicode(':')); rBuffer.append(sal_Unicode(':'));
MakeOneRefStrImpl(rBuffer, rCxt, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true); MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true);
} }
} }
rBuffer.append(sal_Unicode(']')); rBuffer.append(sal_Unicode(']'));
...@@ -1027,21 +1029,21 @@ const ScCompiler::Convention * const ScCompiler::pConvOOO_A1_ODF = &ConvOOO_A1_O ...@@ -1027,21 +1029,21 @@ const ScCompiler::Convention * const ScCompiler::pConvOOO_A1_ODF = &ConvOOO_A1_O
struct ConventionXL struct ConventionXL
{ {
static void GetTab( static void GetTab(
const ScAddress& rPos, const sc::TokenStringContext& rCxt, const ScAddress& rPos, const std::vector<OUString>& rTabNames,
const ScSingleRefData& rRef, OUString& rTabName ) const ScSingleRefData& rRef, OUString& rTabName )
{ {
ScAddress aAbs = rRef.toAbs(rPos); ScAddress aAbs = rRef.toAbs(rPos);
if (rRef.IsTabDeleted() || static_cast<size_t>(aAbs.Tab()) >= rCxt.maTabNames.size()) if (rRef.IsTabDeleted() || static_cast<size_t>(aAbs.Tab()) >= rTabNames.size())
{ {
rTabName = ScGlobal::GetRscString( STR_NO_REF_TABLE ); rTabName = ScGlobal::GetRscString( STR_NO_REF_TABLE );
return; return;
} }
rTabName = rCxt.maTabNames[aAbs.Tab()]; rTabName = rTabNames[aAbs.Tab()];
} }
static void MakeTabStr( OUStringBuffer& rBuf, static void MakeTabStr( OUStringBuffer& rBuf,
const ScAddress& rPos, const ScAddress& rPos,
const sc::TokenStringContext& rCxt, const std::vector<OUString>& rTabNames,
const ScComplexRefData& rRef, const ScComplexRefData& rRef,
bool bSingleRef ) bool bSingleRef )
{ {
...@@ -1049,11 +1051,11 @@ struct ConventionXL ...@@ -1049,11 +1051,11 @@ struct ConventionXL
{ {
OUString aStartTabName, aEndTabName; OUString aStartTabName, aEndTabName;
GetTab(rPos, rCxt, rRef.Ref1, aStartTabName); GetTab(rPos, rTabNames, rRef.Ref1, aStartTabName);
if( !bSingleRef && rRef.Ref2.IsFlag3D() ) if( !bSingleRef && rRef.Ref2.IsFlag3D() )
{ {
GetTab(rPos, rCxt, rRef.Ref2, aEndTabName); GetTab(rPos, rTabNames, rRef.Ref2, aEndTabName);
} }
rBuf.append( aStartTabName ); rBuf.append( aStartTabName );
...@@ -1211,8 +1213,9 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL ...@@ -1211,8 +1213,9 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
} }
void makeRefStr( OUStringBuffer& rBuf, void makeRefStr( OUStringBuffer& rBuf,
formula::FormulaGrammar::Grammar /*eGram*/,
const ScAddress& rPos, const ScAddress& rPos,
const sc::TokenStringContext& rCxt, const OUString& /*rErrRef*/, const std::vector<OUString>& rTabNames,
const ScComplexRefData& rRef, const ScComplexRefData& rRef,
bool bSingleRef ) const bool bSingleRef ) const
{ {
...@@ -1222,7 +1225,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL ...@@ -1222,7 +1225,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
// Foo!A1:#REF! versus #REF! at this point // Foo!A1:#REF! versus #REF! at this point
ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2; ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2;
MakeTabStr(rBuf, rPos, rCxt, aRef, bSingleRef); MakeTabStr(rBuf, rPos, rTabNames, aRef, bSingleRef);
if (!ValidAddress(aAbs1)) if (!ValidAddress(aAbs1))
{ {
...@@ -1401,15 +1404,16 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL ...@@ -1401,15 +1404,16 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
{ {
ConventionXL_R1C1() : ScCompiler::Convention( FormulaGrammar::CONV_XL_R1C1 ) { } ConventionXL_R1C1() : ScCompiler::Convention( FormulaGrammar::CONV_XL_R1C1 ) { }
void makeRefStr( OUStringBuffer& rBuf, void makeRefStr( OUStringBuffer& rBuf,
formula::FormulaGrammar::Grammar /*eGram*/,
const ScAddress& rPos, const ScAddress& rPos,
const sc::TokenStringContext& rCxt, const OUString& /*rErrRef*/, const std::vector<OUString>& rTabNames,
const ScComplexRefData& rRef, const ScComplexRefData& rRef,
bool bSingleRef ) const bool bSingleRef ) const
{ {
ScRange aAbsRef = rRef.toAbs(rPos); ScRange aAbsRef = rRef.toAbs(rPos);
ScComplexRefData aRef( rRef ); ScComplexRefData aRef( rRef );
MakeTabStr(rBuf, rPos, rCxt, aRef, bSingleRef); MakeTabStr(rBuf, rPos, rTabNames, aRef, bSingleRef);
// Play fast and loose with invalid refs. There is not much point in producing // Play fast and loose with invalid refs. There is not much point in producing
// Foo!A1:#REF! versus #REF! at this point // Foo!A1:#REF! versus #REF! at this point
...@@ -1606,10 +1610,19 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos,ScTokenArra ...@@ -1606,10 +1610,19 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos,ScTokenArra
meEncodeUrlMode( ENCODE_BY_GRAMMAR ), meEncodeUrlMode( ENCODE_BY_GRAMMAR ),
meExtendedErrorDetection( EXTENDED_ERROR_DETECTION_NONE ), meExtendedErrorDetection( EXTENDED_ERROR_DETECTION_NONE ),
mbCloseBrackets( true ), mbCloseBrackets( true ),
mbRewind( false ), mbRewind( false )
mpTokenStringCxt(NULL)
{ {
nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0; nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0;
if (pDoc)
{
maTabNames = pDoc->GetAllTableNames();
{
std::vector<OUString>::iterator it = maTabNames.begin(), itEnd = maTabNames.end();
for (; it != itEnd; ++it)
ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(meGrammar));
}
}
} }
ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos) ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos)
...@@ -1624,15 +1637,23 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos) ...@@ -1624,15 +1637,23 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos)
meEncodeUrlMode( ENCODE_BY_GRAMMAR ), meEncodeUrlMode( ENCODE_BY_GRAMMAR ),
meExtendedErrorDetection( EXTENDED_ERROR_DETECTION_NONE ), meExtendedErrorDetection( EXTENDED_ERROR_DETECTION_NONE ),
mbCloseBrackets( true ), mbCloseBrackets( true ),
mbRewind( false ), mbRewind( false )
mpTokenStringCxt(NULL)
{ {
nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0; nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0;
if (pDoc)
{
maTabNames = pDoc->GetAllTableNames();
{
std::vector<OUString>::iterator it = maTabNames.begin(), itEnd = maTabNames.end();
for (; it != itEnd; ++it)
ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(meGrammar));
}
}
} }
ScCompiler::~ScCompiler() ScCompiler::~ScCompiler()
{ {
delete mpTokenStringCxt;
} }
void ScCompiler::CheckTabQuotes( OUString& rString, void ScCompiler::CheckTabQuotes( OUString& rString,
...@@ -4172,9 +4193,7 @@ void ScCompiler::CreateStringFromMatrix( ...@@ -4172,9 +4193,7 @@ void ScCompiler::CreateStringFromMatrix(
void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
{ {
if (!mpTokenStringCxt) OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef);
mpTokenStringCxt = new sc::TokenStringContext(pDoc, meGrammar);
const OpCode eOp = _pTokenP->GetOpCode(); const OpCode eOp = _pTokenP->GetOpCode();
const ScSingleRefData& rRef = static_cast<const ScToken*>(_pTokenP)->GetSingleRef(); const ScSingleRefData& rRef = static_cast<const ScToken*>(_pTokenP)->GetSingleRef();
ScComplexRefData aRef; ScComplexRefData aRef;
...@@ -4191,19 +4210,17 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* ...@@ -4191,19 +4210,17 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken*
else else
{ {
rBuffer.append(ScGlobal::GetRscString(STR_NO_NAME_REF)); rBuffer.append(ScGlobal::GetRscString(STR_NO_NAME_REF));
pConv->makeRefStr(rBuffer, aPos, *mpTokenStringCxt, aRef, true); pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, maTabNames, aRef, true);
} }
} }
else else
pConv->makeRefStr(rBuffer, aPos, *mpTokenStringCxt, aRef, true); pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, maTabNames, aRef, true);
} }
void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
{ {
if (!mpTokenStringCxt) OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef);
mpTokenStringCxt = new sc::TokenStringContext(pDoc, meGrammar); pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, maTabNames, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false);
pConv->makeRefStr(rBuffer, aPos, *mpTokenStringCxt, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false);
} }
void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const
......
...@@ -3242,7 +3242,7 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons ...@@ -3242,7 +3242,7 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons
ScComplexRefData aRef; ScComplexRefData aRef;
aRef.Ref1 = rRef; aRef.Ref1 = rRef;
aRef.Ref2 = rRef; aRef.Ref2 = rRef;
rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt, aRef, true); rCxt.mpRefConv->makeRefStr(rBuf, rCxt.meGram, rPos, rCxt.maErrRef, rCxt.maTabNames, aRef, true);
} }
else else
rBuf.append(rCxt.maErrRef); rBuf.append(rCxt.maErrRef);
...@@ -3253,7 +3253,7 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons ...@@ -3253,7 +3253,7 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons
if (rCxt.mpRefConv) if (rCxt.mpRefConv)
{ {
const ScComplexRefData& rRef = static_cast<const ScToken&>(rToken).GetDoubleRef(); const ScComplexRefData& rRef = static_cast<const ScToken&>(rToken).GetDoubleRef();
rCxt.mpRefConv->makeRefStr(rBuf, rPos, rCxt, rRef, false); rCxt.mpRefConv->makeRefStr(rBuf, rCxt.meGram, rPos, rCxt.maErrRef, rCxt.maTabNames, rRef, false);
} }
else else
rBuf.append(rCxt.maErrRef); rBuf.append(rCxt.maErrRef);
......
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