summaryrefslogtreecommitdiff
path: root/sc/source/core/tool/compiler.cxx
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-06-21 20:11:08 +0200
committerEike Rathke <erack@redhat.com>2015-06-21 20:14:20 +0200
commit37464e3fdaea201900408f7c2395f9bec6184f72 (patch)
tree0c74a52bf89ed909333712cf5c922950abf3f580 /sc/source/core/tool/compiler.cxx
parente0e285574244e855fd148ab7320b1aeb5914655a (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.cxx37
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