diff options
author | Eike Rathke <erack@redhat.com> | 2015-06-21 20:11:08 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-06-21 20:14:20 +0200 |
commit | 37464e3fdaea201900408f7c2395f9bec6184f72 (patch) | |
tree | 0c74a52bf89ed909333712cf5c922950abf3f580 /sc/source/core/tool/compiler.cxx | |
parent | e0e285574244e855fd148ab7320b1aeb5914655a (diff) |
TableRef: make ThisRow work in named expressions
... including reference update as named expressions don't hold RPN.
Change-Id: Ieea19e24f1dcf71d489ff0249bc7d3644e4f0d2b
Diffstat (limited to 'sc/source/core/tool/compiler.cxx')
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 0a2c60ae875c..4e1cee1aa30d 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5072,7 +5072,12 @@ bool ScCompiler::HandleTableRef() aRange.aEnd.SetRow( aPos.Row()); } else - nError = errNoRef; + { + nError = errNoValue; + // For *some* relative row reference in named + // expressions' thisrow special handling below. + aRange.aEnd.SetRow( aRange.aStart.Row()); + } bForwardToClose = true; } break; @@ -5153,8 +5158,10 @@ bool ScCompiler::HandleTableRef() } while (eState != sStop); } ScTokenArray* pNew = new ScTokenArray(); - if (!nError) + if (!nError || nError == errNoValue) { + // The errNoValue case generates a thisrow reference that can be + // used to save named expressions in A1 syntax notation. if (bColumnRange) { // Limit range to specified columns. @@ -5203,8 +5210,17 @@ bool ScCompiler::HandleTableRef() aRefData.SetRowRel( true); } aRefData.SetFlag3D( true); - aRefData.SetAddress( aRange.aStart, aPos); - pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData )); + if (nError) + { + aRefData.SetAddress( aRange.aStart, aRange.aStart); + pTR->SetAreaRefRPN( new ScSingleRefToken( aRefData)); // set reference at TableRef + pNew->Add( new FormulaErrorToken( nError)); // set error in RPN + } + else + { + aRefData.SetAddress( aRange.aStart, aPos); + pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData)); + } } else { @@ -5218,8 +5234,17 @@ bool ScCompiler::HandleTableRef() aRefData.Ref2.SetRowRel( true); } aRefData.Ref1.SetFlag3D( true); - aRefData.SetRange( aRange, aPos); - pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); + if (nError) + { + aRefData.SetRange( aRange, aRange.aStart); + pTR->SetAreaRefRPN( new ScDoubleRefToken( aRefData)); // set reference at TableRef + pNew->Add( new FormulaErrorToken( nError)); // set error in RPN + } + else + { + aRefData.SetRange( aRange, aPos); + pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData)); + } } } else |