void DerivationWriter :: copyMessage(SNode node, bool operationMode) { SNode current = node.firstChild(); while (current != lxNone) { Symbol symbol = (Symbol)current.type; switch (symbol) { case nsSubjectArg: _writer.newNode(lxMessage); unpackChildren(current); _writer.closeNode(); break; case nsMessageParameter: case nsObject: case nsExpression: _writer.newBookmark(); unpackChildren(current, 1); _writer.removeBookmark(); break; case nsElseOperation: _writer.newNode(lxExpression); unpackChildren(current); _writer.closeNode(); break; case nsSubCode: unpackNode(current, 1); break; case nsL0Operation: case nsL3Operation: case nsL4Operation: case nsL5Operation: case nsL6Operation: case nsL7Operation: case nsNewOperator: case nsMessageOperation: copyMessage(current, (symbol != nsMessageOperation)); _writer.insert(lxExpression); _writer.closeNode(); break; case tsIdentifier: case tsPrivate: case tsReference: if (!operationMode) { _writer.newNode(lxMessage); unpackNode(current, 0); _writer.closeNode(); break; } default: if (operationMode && current.existChild(lxTerminal)) { if ((Symbol)node.type == nsNewOperator) { //HOTFIX : mark new operator _writer.appendNode(lxOperator, -1); if (symbol == tsInteger || symbol == tsIdentifier) { unpackNode(current, 0); } } else { _writer.newNode(lxOperator); copyChildren(current); _writer.closeNode(); } _writer.newBookmark(); } break; } current = current.nextNode(); } if (operationMode) { _writer.removeBookmark(); } }