formula/source/core/api/token.cxx | 1 sc/inc/token.hxx | 3 ++ sc/source/core/tool/compiler.cxx | 44 ++++++++++++++++++++++++++++---------- sc/source/core/tool/token.cxx | 17 ++++++++++++++ 4 files changed, 53 insertions(+), 12 deletions(-)
New commits: commit 35a4d80750553e7d51a6139b61c47a4f7a475ce8 Author: Eike Rathke <[email protected]> Date: Fri Apr 17 01:10:06 2015 +0200 TableRef: use relative references where appropriate Change-Id: I1c680186271f20b6c01c06dbcc642bc1cf90865a diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 524badf..055bcd2 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5053,6 +5053,11 @@ bool ScCompiler::HandleTableRef() { ScSingleRefData aRefData; aRefData.InitFlags(); + aRefData.SetColRel( true); + if (eItem == ScTableRefToken::THIS_ROW) + { + aRefData.SetRowRel( true); + } aRefData.SetAddress( aRange.aStart, aPos); pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData )); } @@ -5060,6 +5065,13 @@ bool ScCompiler::HandleTableRef() { ScComplexRefData aRefData; aRefData.InitFlags(); + aRefData.Ref1.SetColRel( true); + aRefData.Ref2.SetColRel( true); + if (eItem == ScTableRefToken::THIS_ROW) + { + aRefData.Ref1.SetRowRel( true); + aRefData.Ref2.SetRowRel( true); + } aRefData.SetRange( aRange, aPos); pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); } commit 61a4859a63619c12057f28ba7df76336ffd45ccc Author: Eike Rathke <[email protected]> Date: Fri Apr 17 00:06:16 2015 +0200 TableRef: differentiate between cell and range reference Change-Id: I1243f8407e8301e0e4662b8839ab53d29dcfe5ed diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 1b04472..524badf 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5049,10 +5049,20 @@ bool ScCompiler::HandleTableRef() } if (aRange.IsValid()) { - ScComplexRefData aRefData; - aRefData.InitFlags(); - aRefData.SetRange( aRange, aPos); - pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); + if (aRange.aStart == aRange.aEnd) + { + ScSingleRefData aRefData; + aRefData.InitFlags(); + aRefData.SetAddress( aRange.aStart, aPos); + pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData )); + } + else + { + ScComplexRefData aRefData; + aRefData.InitFlags(); + aRefData.SetRange( aRange, aPos); + pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); + } } else { commit 9bfe478eaaa1c6b88bd396c94724a4afcc737549 Author: Eike Rathke <[email protected]> Date: Thu Apr 16 23:53:45 2015 +0200 TableRef: use errNoRef error token instead of setting compiler error So the ScTableRefToken always holds some RPN "reference". Change-Id: I69aa485b9b85286a3b272617781bb07198ea52c8 diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 0260def..1b04472 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5056,12 +5056,12 @@ bool ScCompiler::HandleTableRef() } else { - SetError( errNoRef); + pTR->SetAreaRefRPN( pNew->Add( new FormulaErrorToken( errNoRef))); } } else { - SetError( errNoRef); + pTR->SetAreaRefRPN( pNew->Add( new FormulaErrorToken( errNoRef))); } while (nLevel-- > 0) { commit be5b88c87dc50abd1d37a0074a5fb072d132fce2 Author: Eike Rathke <[email protected]> Date: Thu Apr 16 23:34:48 2015 +0200 TableRef: add the resulting area to ScTableRefToken Change-Id: I142c0c39ab4bb3c1d099cba42491cc9928ab300c diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 8335d1e..0260def 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5052,7 +5052,7 @@ bool ScCompiler::HandleTableRef() ScComplexRefData aRefData; aRefData.InitFlags(); aRefData.SetRange( aRange, aPos); - pNew->AddDoubleReference( aRefData ); + pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); } else { commit ccecacf002eb367bbe72eee73fb1d0f89aa2653f Author: Eike Rathke <[email protected]> Date: Thu Apr 16 22:56:47 2015 +0200 TableRef: prepare ScTableRefToken to hold the resulting area in RPN Change-Id: Iaf76cf298dd2f9f9b8d9fb56ecb9e7b29fdc6ca1 diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx index 6dfb236..4662074 100644 --- a/sc/inc/token.hxx +++ b/sc/inc/token.hxx @@ -236,9 +236,12 @@ public: Item GetItem() const; void AddItem( Item ); + void SetAreaRefRPN( formula::FormulaToken* pToken ); + const formula::FormulaToken* GetAreaRefRPN() const; private: + formula::FormulaTokenRef mxAreaRefRPN; ///< resulting RPN area sal_uInt16 mnIndex; ///< index into table / database range collection Item meItem; diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 7eeb037..6612b64 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -866,6 +866,16 @@ void ScTableRefToken::AddItem( ScTableRefToken::Item eItem ) meItem = static_cast<ScTableRefToken::Item>(meItem | eItem); } +void ScTableRefToken::SetAreaRefRPN( formula::FormulaToken* pToken ) +{ + mxAreaRefRPN = pToken; +} + +const formula::FormulaToken* ScTableRefToken::GetAreaRefRPN() const +{ + return mxAreaRefRPN.get(); +} + bool ScTableRefToken::operator==( const FormulaToken& r ) const { if ( !FormulaToken::operator==(r) ) @@ -881,6 +891,13 @@ bool ScTableRefToken::operator==( const FormulaToken& r ) const if (meItem != p->GetItem()) return false; + if (!mxAreaRefRPN && !p->mxAreaRefRPN) + ; // nothing + else if (!mxAreaRefRPN || !p->mxAreaRefRPN) + return false; + else if (!(*mxAreaRefRPN == *(p->mxAreaRefRPN))) + return false; + return true; } commit 95f62a57efec6bc38d8c59d95e5df1e9dc228038 Author: Eike Rathke <[email protected]> Date: Thu Apr 16 18:56:18 2015 +0200 ocTableRef is not in RPN Change-Id: If91d6724a07a40c28c0ebe64e94fa3166138072b diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx index 08a129a..5096421 100644 --- a/formula/source/core/api/token.cxx +++ b/formula/source/core/api/token.cxx @@ -56,7 +56,6 @@ inline bool lcl_IsReference( OpCode eOp, StackVar eType ) || (eOp == ocColRowNameAuto && eType == svDoubleRef) || (eOp == ocColRowName && eType == svSingleRef) || (eOp == ocMatRef && eType == svSingleRef) - || (eOp == ocTableRef && (eType == svSingleRef || eType == svDoubleRef)) ; } commit 1b9c67c75bf25fb16e5a4aaffbb64bc0edf3ee5f Author: Eike Rathke <[email protected]> Date: Thu Apr 16 18:24:46 2015 +0200 this confuses me here, move it elsewhere Change-Id: Id1b53f7f05305f25ac0b78d3d6c7dbe0fdf52bba diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index a988209..8335d1e 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -4554,6 +4554,11 @@ sal_Unicode ScCompiler::GetNativeAddressSymbol( Convention::SpecialSymbolType eT return pConv->getSpecialSymbol(eType); } +FormulaTokenRef ScCompiler::ExtendRangeReference( FormulaToken & rTok1, FormulaToken & rTok2, bool bReuseDoubleRef ) +{ + return extendRangeReference( rTok1, rTok2, aPos,bReuseDoubleRef ); +} + void ScCompiler::fillAddInToken(::std::vector< ::com::sun::star::sheet::FormulaOpCodeMapEntry >& _rVec,bool _bIsEnglish) const { // All known AddIn functions. @@ -5070,9 +5075,4 @@ bool ScCompiler::HandleTableRef() return true; } -FormulaTokenRef ScCompiler::ExtendRangeReference( FormulaToken & rTok1, FormulaToken & rTok2, bool bReuseDoubleRef ) -{ - return extendRangeReference( rTok1, rTok2, aPos,bReuseDoubleRef ); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
