implement list diff verbs pick, del, find and skip.
now failing due to a contradiction in test fixture: it is nonsensical to re-order attributes; rather, we should cover re-ordering of children, to verify that the mutator binding properly surpasses the attribute layers and forwards operations to the lower layers responsible for handling child scopes...
This commit is contained in:
parent
0782dd4922
commit
c027ce4638
2 changed files with 42 additions and 28 deletions
|
|
@ -218,22 +218,42 @@ namespace diff{
|
|||
|
||||
/* == Forwarding: error handling == */
|
||||
|
||||
|
||||
void
|
||||
TreeDiffMutatorBinding::__expect_in_target (GenNode const& elm, Literal oper)
|
||||
{
|
||||
|
||||
if (endOfData())
|
||||
throw error::State(_Fmt("Unable to %s element %s from target as demanded; "
|
||||
"no (further) elements in target sequence") % oper % elm
|
||||
, LUMIERA_ERROR_DIFF_CONFLICT);
|
||||
|
||||
// /////////////////////////////////////////////////////////////TODO: is there any chance to uphold this special syntactic construct?? otherwise drop it from the language!
|
||||
// if (elm.matches(Ref::CHILD) and not srcPos()->isNamed())
|
||||
// return; // allow for anonymous pick or delete of children
|
||||
|
||||
if (not treeMutator_->matchSrc(elm))
|
||||
throw error::State(_Fmt("Unable to %s element %s from target as demanded; "
|
||||
"found element %s on current target position instead")
|
||||
% oper % elm % srcPos() /////////////////////TODO still relevant?
|
||||
, LUMIERA_ERROR_DIFF_CONFLICT);
|
||||
}
|
||||
|
||||
void
|
||||
TreeDiffMutatorBinding::__expect_further_elements (GenNode const& elm)
|
||||
{
|
||||
|
||||
if (endOfData())
|
||||
throw error::State(_Fmt("Premature end of target sequence, still expecting element %s; "
|
||||
"unable to apply diff further.") % elm
|
||||
, LUMIERA_ERROR_DIFF_CONFLICT);
|
||||
}
|
||||
|
||||
void
|
||||
TreeDiffMutatorBinding::__fail_not_found (GenNode const& elm)
|
||||
{
|
||||
|
||||
throw error::State(_Fmt("Premature end of sequence; unable to locate "
|
||||
"element %s in the remainder of the target.") % elm
|
||||
, LUMIERA_ERROR_DIFF_CONFLICT);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -259,30 +279,12 @@ namespace diff{
|
|||
|
||||
/* == Forwarding: mutation primitives == */
|
||||
|
||||
void
|
||||
TreeDiffMutatorBinding::skipSrc()
|
||||
{
|
||||
UNIMPLEMENTED("skip next src element and advance abstract source position");
|
||||
}
|
||||
|
||||
bool
|
||||
TreeDiffMutatorBinding::matchSrc (GenNode const& n)
|
||||
{
|
||||
UNIMPLEMENTED("ensure the next source element matches with given spec");
|
||||
}
|
||||
|
||||
bool
|
||||
TreeDiffMutatorBinding::acceptSrc (GenNode const& n)
|
||||
{
|
||||
UNIMPLEMENTED("accept existing element, when matching the given spec");
|
||||
}
|
||||
|
||||
bool
|
||||
TreeDiffMutatorBinding::findSrc (GenNode const& n)
|
||||
{
|
||||
UNIMPLEMENTED("locate designated element and accept it at current position");
|
||||
}
|
||||
|
||||
bool
|
||||
TreeDiffMutatorBinding::accept_until (GenNode const& refMark)
|
||||
{
|
||||
|
|
@ -323,21 +325,23 @@ namespace diff{
|
|||
TreeDiffMutatorBinding::del (GenNode const& n)
|
||||
{
|
||||
__expect_in_target(n, "remove");
|
||||
skipSrc();
|
||||
treeMutator_->skipSrc(n);
|
||||
}
|
||||
|
||||
void
|
||||
TreeDiffMutatorBinding::pick (GenNode const& n)
|
||||
{
|
||||
__expect_in_target(n, "pick");
|
||||
acceptSrc (n);
|
||||
// __expect_in_target(n, "pick"); ////////////////////////TODO TOD-o ?
|
||||
bool success = treeMutator_->acceptSrc (n);
|
||||
if (not success)
|
||||
__failMismatch (n, "pick");
|
||||
}
|
||||
|
||||
void
|
||||
TreeDiffMutatorBinding::skip (GenNode const& n)
|
||||
{
|
||||
__expect_further_elements (n);
|
||||
skipSrc();
|
||||
treeMutator_->skipSrc(n);
|
||||
} // assume the actual content has been moved away by a previous find()
|
||||
|
||||
void
|
||||
|
|
@ -345,7 +349,7 @@ namespace diff{
|
|||
{
|
||||
__expect_further_elements (n);
|
||||
// consume and leave waste, expected to be cleaned-up by skip() later
|
||||
if (not this->findSrc(n));
|
||||
if (not treeMutator_->findSrc(n))
|
||||
__fail_not_found (n);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -264,6 +264,19 @@ namespace diff{
|
|||
|
||||
void move_into_new_sequence (Iter pos);
|
||||
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #992
|
||||
|
||||
bool
|
||||
endOfData()
|
||||
{
|
||||
return not treeMutator_->hasSrc();
|
||||
}
|
||||
|
||||
string
|
||||
srcPos()
|
||||
{
|
||||
return "??"; ////////////////TODO can this be served by the treeMutator_ ?? Is it still necessary?
|
||||
}
|
||||
|
||||
|
||||
/* == Forwarding: error handling == */
|
||||
|
||||
|
|
@ -278,10 +291,7 @@ namespace diff{
|
|||
|
||||
/* == Forwarding: mutation primitives == */
|
||||
|
||||
void skipSrc();
|
||||
bool matchSrc (GenNode const& n);
|
||||
bool acceptSrc (GenNode const& n);
|
||||
bool findSrc (GenNode const& n);
|
||||
bool accept_until (GenNode const& refMark);
|
||||
void assignElm (GenNode const& n);
|
||||
void open_subScope (GenNode const& n);
|
||||
|
|
|
|||
Loading…
Reference in a new issue