diff --git a/dist/datamodel/node/data/StructNode.d.ts b/dist/datamodel/node/data/StructNode.d.ts index 1d797ee..68066b3 100644 --- a/dist/datamodel/node/data/StructNode.d.ts +++ b/dist/datamodel/node/data/StructNode.d.ts @@ -4,6 +4,7 @@ import type { PropClass, PIGroupDef } from '../BaseNode.js'; import type { ChildAddEdit, ChildUndoRedo } from '../childEdit.js'; export default class StructNode extends DataNode { _isElementNode?: boolean; + _fieldsDeclared: boolean; get icon(): string; get className(): string; get dataType(): string; diff --git a/dist/datamodel/node/data/StructNode.d.ts.map b/dist/datamodel/node/data/StructNode.d.ts.map index 2d4b132..25b0aa4 100644 --- a/dist/datamodel/node/data/StructNode.d.ts.map +++ b/dist/datamodel/node/data/StructNode.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"StructNode.d.ts","sourceRoot":"","sources":["../../../../src/datamodel/node/data/StructNode.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAUnE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,QAAQ;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAGD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAGD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAUD,IAAI,IAAI,IAAI,MAAM,EAAE,CAEnB;IAOD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAKD,IAAI,eAAe,IAAI,OAAO,CAE7B;IAID,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,aAAa,IAAI,SAAS,EAAE;IAI5B,WAAW,IAAI,UAAU,EAAE;IAQ3B,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAU3C,cAAc,IAAI,OAAO;IAgCzB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA8ChG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAkB5C,cAAc,IAAI,OAAO;IAIzB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IActC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAStD,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,QAAQ;IAmBxB,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI;IAC7C,eAAe,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI;IAEvD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAU;IAyChG,MAAM,KAAK,WAAW,IAAI,MAAM,CAAqB;IAErD,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAU;CAU1E"} \ No newline at end of file +{"version":3,"file":"StructNode.d.ts","sourceRoot":"","sources":["../../../../src/datamodel/node/data/StructNode.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAuCnE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,QAAQ;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAC;IASzB,eAAe,UAAS;IAExB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAGD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAGD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAUD,IAAI,IAAI,IAAI,MAAM,EAAE,CAEnB;IAOD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAKD,IAAI,eAAe,IAAI,OAAO,CAE7B;IAID,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,aAAa,IAAI,SAAS,EAAE;IAI5B,WAAW,IAAI,UAAU,EAAE;IAQ3B,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAU3C,cAAc,IAAI,OAAO;IAgCzB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA8ChG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAkB5C,cAAc,IAAI,OAAO;IAIzB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IActC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAStD,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,QAAQ;IAmBxB,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI;IAC7C,eAAe,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI;IAEvD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAU;IAkDhG,MAAM,KAAK,WAAW,IAAI,MAAM,CAAqB;IAErD,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAU;CAe1E"} \ No newline at end of file diff --git a/dist/datamodel/node/data/StructNode.js b/dist/datamodel/node/data/StructNode.js index b449b02..c563f92 100644 --- a/dist/datamodel/node/data/StructNode.js +++ b/dist/datamodel/node/data/StructNode.js @@ -10,7 +10,46 @@ import PropKind from '../../prop/PropKind.js'; import PropClassAtom from '../../prop/PropClass.js'; import { escapeXml, pad as xmlPad } from '../../parser/XmlUtils.js'; import { effectiveDims, elementCount, summaryForm } from '../../display/DisplayConvention.js'; +/** + * A struct's field names, read from the bytes rather than trusted from a key MATLAB may + * not have written. + * + * `_fields` wins when it is there, because it is the only statement of field ORDER an + * envelope carries and a bag's order is otherwise just a JSON object's key order. Absent + * it, the names ARE the keys of the element bag — which is what `BinarySlddParser` + * (`_fields: Object.keys(parsed[0])`), `McosParser` and `MatlabVariableNode` have all + * derived for themselves all along. That is why those three channels were unaffected when + * MATLAB stopped writing `_fields` into a text dictionary between builds `27.1.0.3353139` + * and `27.1.0.3393633`, and the text channel — the one that passed MATLAB's JSON straight + * through and trusted the key — showed every struct with no field rows at all. + * + * Element 0 rather than a union across elements, deliberately: a struct ARRAY shares one + * field list by definition, which is what makes it an array and not a bag of unrelated + * structs (see `_renameField`), so element 0 states it. It is also the rule the binary + * parser already applies, and a union would be a second rule for the same question. + */ +function fieldsOf(rawVal) { + if (Array.isArray(rawVal._fields)) { + return rawVal._fields; + } + const elements = rawVal._elements; + if (Array.isArray(elements) && elements.length > 0 && elements[0]) { + return Object.keys(elements[0]); + } + return []; +} export default class StructNode extends DataNode { + constructor() { + super(...arguments); + // Whether the parsed envelope DECLARED `_fields`, as opposed to us deriving the list + // from its element bag. Only `serializeValue` asks, and only so that a save does not + // add the key back to a file MATLAB left it out of: the reader may not depend on + // `_fields`, so the writer may not start producing it either, or our saves would + // diverge from MATLAB's own for every struct in every current-build dictionary. An + // untouched node replays `_rawInput` and never reaches the question; a modified one + // has already lost those bytes, which is why this is stored rather than re-read. + this._fieldsDeclared = false; + } get icon() { return 'wsTree'; } @@ -100,7 +139,7 @@ export default class StructNode extends DataNode { _dimensions: d, _elements: elements }; - if (this.serial._fields) { + if (this._fieldsDeclared) { result._fields = fields; } result._mw_element_type = this.serial._mw_element_type || 'MATLABArray'; @@ -219,14 +258,19 @@ export default class StructNode extends DataNode { execAddChild() { return addChildUndoable(this); } execRemoveChild(child) { return removeChildUndoable(this, child); } static parse(rawVal, name, parent) { + // Always an ARRAY, derived if MATLAB did not declare one, so that everything + // downstream of here — serializeElement, add/remove/restore, _renameField — reads + // one list that is already right rather than re-deciding the question. `fieldsOf` + // is the single place that decision is made. + const fields = fieldsOf(rawVal); const serial = { _dimensions: rawVal._dimensions, - _fields: rawVal._fields, + _fields: fields, _mw_element_type: rawVal._mw_element_type }; const node = new StructNode(name, parent, serial); node._rawInput = rawVal; - const fields = rawVal._fields || []; + node._fieldsDeclared = Array.isArray(rawVal._fields); const elements = rawVal._elements || []; if (elements.length > 1) { const dims = rawVal._dimensions || [1, elements.length]; @@ -238,6 +282,10 @@ export default class StructNode extends DataNode { }; const elemNode = new StructNode(String(ei), node, elemSerial); elemNode._isElementNode = true; + // Same answer as the array root's, so the two cannot come to disagree about + // it. An element serializes through serializeElement and so never emits + // `_fields` itself; this is here to keep that true by construction. + elemNode._fieldsDeclared = node._fieldsDeclared; // Column-major, as MATLAB stores it — see ObjectNode. The label is // DERIVED from this spec by BaseNode.displayName rather than baked // here, so renaming the array relabels its elements. @@ -264,6 +312,11 @@ export default class StructNode extends DataNode { _dimensions: [1, 1], _num_fields: 0, _field_names: [], + // Declared, empty. A struct WE invent has no MATLAB bytes to stay faithful to, + // so it keeps writing `_fields` the way it did before the list became + // derivable — the emit policy only exists to avoid contradicting a file MATLAB + // wrote, and there is no such file here. + _fields: [], _elements: [{}] }; return StructNode.parse(rawVal, name, parent); diff --git a/dist/datamodel/node/data/StructNode.js.map b/dist/datamodel/node/data/StructNode.js.map index 0426f71..0207173 100644 --- a/dist/datamodel/node/data/StructNode.js.map +++ b/dist/datamodel/node/data/StructNode.js.map @@ -1 +1 @@ -{"version":3,"file":"StructNode.js","sourceRoot":"","sources":["../../../../src/datamodel/node/data/StructNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"StructNode.js","sourceRoot":"","sources":["../../../../src/datamodel/node/data/StructNode.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAC5D,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAE9F;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,QAAQ,CAAC,MAA+B;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,OAAmB,CAAC;IACtC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAkD,CAAC;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,QAAQ;IAAhD;;QAGI,qFAAqF;QACrF,qFAAqF;QACrF,iFAAiF;QACjF,iFAAiF;QACjF,mFAAmF;QACnF,oFAAoF;QACpF,iFAAiF;QACjF,oBAAe,GAAG,KAAK,CAAC;IAwS5B,CAAC;IAtSG,IAAI,IAAI;QACJ,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,SAAS;QACT,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,sEAAsE;IACtE,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,4DAA4D;IAC5D,IAAI,IAAI;QACJ,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,+EAA+E;IAC/E,6EAA6E;IAC7E,gFAAgF;IAChF,2EAA2E;IAC3E,EAAE;IACF,gFAAgF;IAChF,6EAA6E;IAC7E,+DAA+D;IAC/D,IAAI,IAAI;QACJ,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,WAAmC,CAAC,CAAC;IAC1E,CAAC;IAED,6EAA6E;IAC7E,gFAAgF;IAChF,6EAA6E;IAC7E,+EAA+E;IAC/E,wBAAwB;IACxB,IAAI,YAAY;QACZ,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,sEAAsE;IACtE,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,8EAA8E;IAC9E,sFAAsF;IACtF,IAAI,mBAAmB;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,aAAa;QACT,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,WAAW;QACP,4EAA4E;QAC5E,6EAA6E;QAC7E,OAAO;YACH,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE;SAC7G,CAAC;IACN,CAAC;IAED,gBAAgB;QACZ,MAAM,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC,OAAoB,IAAI,EAAE,CAAC;QACvD,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,KAAkB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,cAAc;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,MAAM,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC,OAAoB,IAAI,EAAE,CAAC;QAEvD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAA8B,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC/B,QAAQ,CAAC,IAAI,CAAE,QAAuB,CAAC,cAAc,EAA6B,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAA4B;YACpC,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,QAAQ;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,gBAAgB,GAAI,IAAI,CAAC,MAAM,CAAC,gBAA2B,IAAI,aAAa,CAAC;QACpF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,OAAe,EAAE,KAAyC,EAAE,MAAc;QACnF,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAAC,CAAC;QAEhF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC;YAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,GAAG,IAAK,KAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAC1F,CAAC;YACD,GAAG,IAAI,CAAC,GAAG,YAAY,CAAC;YACxB,OAAO,GAAG,CAAC;QACf,CAAC;QAED,2EAA2E;QAC3E,6EAA6E;QAC7E,2EAA2E;QAC3E,yEAAyE;QACzE,8EAA8E;QAC9E,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAClF,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,iBAAiB,GAAG,OAAO,GAAG,KAAK,CAAC;QAC5E,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnC,GAAG,IAAK,QAAqB,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YACjF,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,GAAG,IAAK,KAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAC1F,CAAC;YACD,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC;QAC/C,CAAC;QACD,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;QAChC,OAAO,GAAG,CAAC;IACf,CAAC;IAED,gFAAgF;IAChF,iFAAiF;IACjF,8EAA8E;IAC9E,gFAAgF;IAChF,iFAAiF;IACjF,iFAAiF;IACjF,2EAA2E;IAC3E,iFAAiF;IACjF,sEAAsE;IACtE,YAAY,CAAC,IAAY,EAAE,EAAU;QACjC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,YAAY,UAAU,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,OAAO;QACX,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAE,OAAsB,CAAC,cAAc,EAAE,CAAC;gBAC1C,SAAS;YACb,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACnC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,cAAc;QACV,OAAO,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpF,CAAC;IAED,eAAe,CAAC,KAAe;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAmB,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,gBAAgB,CAAC,KAAe,EAAE,KAAa;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,OAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,WAAW;QACP,OAAO,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IACxD,CAAC;IAED,YAAY;QACR,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,UAAU,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;YAC1B,CAAC,EAAE,CAAC;QACR,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;QAC7B,CAAC;QACA,IAAI,CAAC,MAAM,CAAC,OAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,YAAY,KAAoC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChF,eAAe,CAAC,KAAgB,IAA0B,OAAO,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpG,MAAM,CAAC,KAAK,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC/E,6EAA6E;QAC7E,kFAAkF;QAClF,kFAAkF;QAClF,6CAA6C;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,MAAM,GAA4B;YACpC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM;YACf,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;SAC5C,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAI,MAAM,CAAC,SAAuC,IAAI,EAAE,CAAC;QAEvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAI,MAAM,CAAC,WAAwB,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;gBAC1B,MAAM,UAAU,GAA4B;oBACxC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBACnB,OAAO,EAAE,MAAM;oBACf,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;iBAC5C,CAAC;gBACF,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC9D,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC/B,4EAA4E;gBAC5E,wEAAwE;gBACxE,oEAAoE;gBACpE,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;gBAChD,mEAAmE;gBACnE,mEAAmE;gBACnE,qDAAqD;gBACrD,QAAQ,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAChF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACrB,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACxE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC3E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,WAAW,KAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;IAErD,MAAM,CAAC,aAAa,CAAC,IAAY,EAAE,MAAuB;QACtD,MAAM,MAAM,GAA4B;YACpC,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,EAAE;YAChB,+EAA+E;YAC/E,sEAAsE;YACtE,+EAA+E;YAC/E,yCAAyC;YACzC,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,CAAC,EAAE,CAAC;SAClB,CAAC;QACF,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/datamodel/parser/BinarySlddParser.js b/dist/datamodel/parser/BinarySlddParser.js index 18da1b6..ed60e31 100644 --- a/dist/datamodel/parser/BinarySlddParser.js +++ b/dist/datamodel/parser/BinarySlddParser.js @@ -425,7 +425,7 @@ function parseEntryValue(prop) { } // Numeric scalar or array const text = getTextContent(prop); - if (prop['@_IsComplex'] === '1') { + if (isComplexAttr(prop['@_IsComplex'])) { const result = { _type: 'cdata', _value: text }; if (dimension) { result._dimensions = parseDims(dimension); @@ -474,7 +474,7 @@ function parseCellElement(el) { // this check by falling past the shaped arm; that is the only reason the defect // hid. `_dimensions` rides in the envelope because the cdata form is the only // place a complex value's shape can be stated. - if (el['@_IsComplex'] === '1') { + if (isComplexAttr(el['@_IsComplex'])) { const cdata = { _type: 'cdata', _value: text }; if (dimension) { cdata._dimensions = parseDims(dimension); @@ -790,7 +790,7 @@ function parseStructElement(el) { } // A complex scalar carries its value as text with IsComplex="1" rather than // as child elements, so it never reaches the generic content decoder. - if (!prop.Element?.length && prop['@_IsComplex'] === '1') { + if (!prop.Element?.length && isComplexAttr(prop['@_IsComplex'])) { const dimension = prop['@_Dimension'] || null; const cdata = { _type: 'cdata', _value: getTextContent(prop) }; if (dimension) { @@ -835,21 +835,10 @@ function parseTypedValue(text, className, dimension) { } switch (className) { case 'double': + // Its own arm because its answer differs: a double's stored spelling IS a double's, + // so it needs no per-class narrowing. Every OTHER numeric class falls to the default + // and is recognized there, by the same predicate the shaped arm above used. return parseMatlabNum(text); - case 'single': - case 'int32': - case 'uint32': - case 'int16': - case 'uint16': - case 'int8': - case 'uint8': - // int64/uint64 belong here and not in the `default` arm: the default returns the - // bare body text, which the writer can only spell `Class="char"`. The value itself - // survived — a 64-bit scalar's stored text IS its exact decimal — so this half of - // defect 27 lost the CLASS rather than the digits. - case 'int64': - case 'uint64': - return formatTypedScalar(text, className); case 'logical': return text === '1' || text === 'true'; case 'char': @@ -858,27 +847,53 @@ function parseTypedValue(text, className, dimension) { // shape too, and the numeric branch above never claimed it. return charValue(text, dimension); default: + // Asked as a CLASS, not enumerated. This used to be nine more `case` labels, a + // second copy of isNumericClass's list — and the bug that copy invites is exactly + // defect 27: int64/uint64 were missing from BOTH lists, the value fell through to + // the bare-text return below, and the writer, seeing a bare string, spelled it + // `Class="char"`. One list, asked in every place the question comes up, is the only + // arrangement in which that cannot happen a second time. + if (isNumericClass(className)) { + return formatTypedScalar(text, className); + } return text || ''; } } -// int64 and uint64 were missing from this list AND from parseCellElement's copy of it, -// which is what made a 64-bit struct FIELD come back as text: parseTypedValue fell -// through the numeric branch to the `default: return text`, so sTyped's uint64 [7 8] -// decoded as the string '7 8' and the writer, seeing a bare string, wrote -// `

7 8

` — MATLAB reopened the field as a 1x3 char (defect +// The integer family is matched as a FAMILY rather than listed member by member, because +// the listing is what failed: int64 and uint64 were missing from this list AND from +// parseCellElement's copy of it, which is what made a 64-bit struct FIELD come back as +// text — parseTypedValue fell through the numeric branch to `default: return text`, so +// sTyped's uint64 [7 8] decoded as the string '7 8' and the writer, seeing a bare string, +// wrote `

7 8

`, which MATLAB reopened as a 1x3 char (defect // 27). The entry-level path never had the gap, so the same value was right at the top -// level and wrong one level down. +// level and wrong one level down. A pattern cannot omit a width. +// +// Deliberately NOT a catch-all "unknown class, probably numeric", and `half` is +// deliberately not in it. The arms this gates parse the body as numbers and the save path +// then formats from the `_type`, so admitting a class those two do not both understand +// turns a wrong TYPE into wrong DIGITS. Measured: `Class="half">1.5` admitted this way +// writes back `2`, and a class whose body is not numeric at all writes back `0`. Losing +// the class and keeping the characters — what the `default` arm does — is the less +// destructive of the two failures, so an unrecognized class stays there on purpose. Adding +// `half` needs the float handling on the save side too, not just a name here. +const NUMERIC_CLASS = /^(?:double|single|u?int(?:8|16|32|64))$/; function isNumericClass(className) { - return (className === 'double' || - className === 'single' || - className === 'int32' || - className === 'uint32' || - className === 'int16' || - className === 'uint16' || - className === 'int8' || - className === 'uint8' || - className === 'int64' || - className === 'uint64'); + return NUMERIC_CLASS.test(className); +} +// `IsComplex="1"` is the only spelling MATLAB has been measured writing, and the only one +// we write. `"true"` is accepted as well — the same latitude parseTypedValue's `logical` +// arm already takes (`text === '1' || text === 'true'`), and taken here for the reason +// that arm is not controversial: the cost of not recognizing the attribute is asymmetric. +// It does not merely degrade the display; the imaginary parts leave the value AND the next +// save, because a re-serialized element that was not read as complex is not written as +// complex either. That was defect 53's whole shape. Reading one extra spelling costs +// nothing today and turns a possible format change from silent data loss into a no-op. +// +// Three call sites — an entry value, a cell element and a property — which is why this is +// a function and not three comparisons: "one rule, three paths, two of them right" is how +// 52 and 53 both happened. +function isComplexAttr(attr) { + return attr === '1' || attr === 'true'; } // One numeric body, as the CLASS requires: exact decimal text for the tokens a 64-bit // integer cannot round-trip through a double, plain numbers for everything else. The diff --git a/dist/datamodel/parser/BinarySlddParser.js.map b/dist/datamodel/parser/BinarySlddParser.js.map index becbbc3..b9ec717 100644 --- a/dist/datamodel/parser/BinarySlddParser.js.map +++ b/dist/datamodel/parser/BinarySlddParser.js.map @@ -1 +1 @@ -{"version":3,"file":"BinarySlddParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/BinarySlddParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"BinarySlddParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/BinarySlddParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/datamodel/node/data/StructNode.ts b/src/datamodel/node/data/StructNode.ts index e8a30a9..f824e24 100644 --- a/src/datamodel/node/data/StructNode.ts +++ b/src/datamodel/node/data/StructNode.ts @@ -15,9 +15,47 @@ import PropClassAtom from '../../prop/PropClass.js'; import { escapeXml, pad as xmlPad } from '../../parser/XmlUtils.js'; import { effectiveDims, elementCount, summaryForm } from '../../display/DisplayConvention.js'; +/** + * A struct's field names, read from the bytes rather than trusted from a key MATLAB may + * not have written. + * + * `_fields` wins when it is there, because it is the only statement of field ORDER an + * envelope carries and a bag's order is otherwise just a JSON object's key order. Absent + * it, the names ARE the keys of the element bag — which is what `BinarySlddParser` + * (`_fields: Object.keys(parsed[0])`), `McosParser` and `MatlabVariableNode` have all + * derived for themselves all along. That is why those three channels were unaffected when + * MATLAB stopped writing `_fields` into a text dictionary between builds `27.1.0.3353139` + * and `27.1.0.3393633`, and the text channel — the one that passed MATLAB's JSON straight + * through and trusted the key — showed every struct with no field rows at all. + * + * Element 0 rather than a union across elements, deliberately: a struct ARRAY shares one + * field list by definition, which is what makes it an array and not a bag of unrelated + * structs (see `_renameField`), so element 0 states it. It is also the rule the binary + * parser already applies, and a union would be a second rule for the same question. + */ +function fieldsOf(rawVal: Record): string[] { + if (Array.isArray(rawVal._fields)) { + return rawVal._fields as string[]; + } + const elements = rawVal._elements as Record[] | undefined; + if (Array.isArray(elements) && elements.length > 0 && elements[0]) { + return Object.keys(elements[0]); + } + return []; +} + export default class StructNode extends DataNode { _isElementNode?: boolean; + // Whether the parsed envelope DECLARED `_fields`, as opposed to us deriving the list + // from its element bag. Only `serializeValue` asks, and only so that a save does not + // add the key back to a file MATLAB left it out of: the reader may not depend on + // `_fields`, so the writer may not start producing it either, or our saves would + // diverge from MATLAB's own for every struct in every current-build dictionary. An + // untouched node replays `_rawInput` and never reaches the question; a modified one + // has already lost those bytes, which is why this is stored rather than re-read. + _fieldsDeclared = false; + get icon(): string { return 'wsTree'; } @@ -121,7 +159,7 @@ export default class StructNode extends DataNode { _dimensions: d, _elements: elements }; - if (this.serial._fields) { + if (this._fieldsDeclared) { result._fields = fields; } result._mw_element_type = (this.serial._mw_element_type as string) || 'MATLABArray'; @@ -246,14 +284,19 @@ export default class StructNode extends DataNode { execRemoveChild(child?: BaseNode): ChildUndoRedo | null { return removeChildUndoable(this, child); } static parse(rawVal: Record, name: string, parent: BaseNode | null): StructNode { + // Always an ARRAY, derived if MATLAB did not declare one, so that everything + // downstream of here — serializeElement, add/remove/restore, _renameField — reads + // one list that is already right rather than re-deciding the question. `fieldsOf` + // is the single place that decision is made. + const fields = fieldsOf(rawVal); const serial: Record = { _dimensions: rawVal._dimensions, - _fields: rawVal._fields, + _fields: fields, _mw_element_type: rawVal._mw_element_type }; const node = new StructNode(name, parent, serial); node._rawInput = rawVal; - const fields = (rawVal._fields as string[]) || []; + node._fieldsDeclared = Array.isArray(rawVal._fields); const elements = (rawVal._elements as Record[]) || []; if (elements.length > 1) { @@ -266,6 +309,10 @@ export default class StructNode extends DataNode { }; const elemNode = new StructNode(String(ei), node, elemSerial); elemNode._isElementNode = true; + // Same answer as the array root's, so the two cannot come to disagree about + // it. An element serializes through serializeElement and so never emits + // `_fields` itself; this is here to keep that true by construction. + elemNode._fieldsDeclared = node._fieldsDeclared; // Column-major, as MATLAB stores it — see ObjectNode. The label is // DERIVED from this spec by BaseNode.displayName rather than baked // here, so renaming the array relabels its elements. @@ -294,6 +341,11 @@ export default class StructNode extends DataNode { _dimensions: [1, 1], _num_fields: 0, _field_names: [], + // Declared, empty. A struct WE invent has no MATLAB bytes to stay faithful to, + // so it keeps writing `_fields` the way it did before the list became + // derivable — the emit policy only exists to avoid contradicting a file MATLAB + // wrote, and there is no such file here. + _fields: [], _elements: [{}] }; return StructNode.parse(rawVal, name, parent); diff --git a/src/datamodel/parser/BinarySlddParser.ts b/src/datamodel/parser/BinarySlddParser.ts index ac96ce8..8921175 100644 --- a/src/datamodel/parser/BinarySlddParser.ts +++ b/src/datamodel/parser/BinarySlddParser.ts @@ -497,7 +497,7 @@ function parseEntryValue(prop: XmlNode): unknown { // Numeric scalar or array const text = getTextContent(prop); - if (prop['@_IsComplex'] === '1') { + if (isComplexAttr(prop['@_IsComplex'])) { const result: Record = { _type: 'cdata', _value: text }; if (dimension) { result._dimensions = parseDims(dimension); @@ -549,7 +549,7 @@ function parseCellElement(el: XmlNode): unknown { // this check by falling past the shaped arm; that is the only reason the defect // hid. `_dimensions` rides in the envelope because the cdata form is the only // place a complex value's shape can be stated. - if (el['@_IsComplex'] === '1') { + if (isComplexAttr(el['@_IsComplex'])) { const cdata: Record = { _type: 'cdata', _value: text }; if (dimension) { cdata._dimensions = parseDims(dimension); @@ -875,7 +875,7 @@ function parseStructElement(el: XmlNode): Record { } // A complex scalar carries its value as text with IsComplex="1" rather than // as child elements, so it never reaches the generic content decoder. - if (!prop.Element?.length && prop['@_IsComplex'] === '1') { + if (!prop.Element?.length && isComplexAttr(prop['@_IsComplex'])) { const dimension = prop['@_Dimension'] || null; const cdata: Record = { _type: 'cdata', _value: getTextContent(prop) }; if (dimension) { @@ -929,21 +929,10 @@ function parseTypedValue(text: string, className: string | null, dimension: stri switch (className) { case 'double': + // Its own arm because its answer differs: a double's stored spelling IS a double's, + // so it needs no per-class narrowing. Every OTHER numeric class falls to the default + // and is recognized there, by the same predicate the shaped arm above used. return parseMatlabNum(text); - case 'single': - case 'int32': - case 'uint32': - case 'int16': - case 'uint16': - case 'int8': - case 'uint8': - // int64/uint64 belong here and not in the `default` arm: the default returns the - // bare body text, which the writer can only spell `Class="char"`. The value itself - // survived — a 64-bit scalar's stored text IS its exact decimal — so this half of - // defect 27 lost the CLASS rather than the digits. - case 'int64': - case 'uint64': - return formatTypedScalar(text, className); case 'logical': return text === '1' || text === 'true'; case 'char': @@ -952,30 +941,56 @@ function parseTypedValue(text: string, className: string | null, dimension: stri // shape too, and the numeric branch above never claimed it. return charValue(text, dimension); default: + // Asked as a CLASS, not enumerated. This used to be nine more `case` labels, a + // second copy of isNumericClass's list — and the bug that copy invites is exactly + // defect 27: int64/uint64 were missing from BOTH lists, the value fell through to + // the bare-text return below, and the writer, seeing a bare string, spelled it + // `Class="char"`. One list, asked in every place the question comes up, is the only + // arrangement in which that cannot happen a second time. + if (isNumericClass(className)) { + return formatTypedScalar(text, className); + } return text || ''; } } -// int64 and uint64 were missing from this list AND from parseCellElement's copy of it, -// which is what made a 64-bit struct FIELD come back as text: parseTypedValue fell -// through the numeric branch to the `default: return text`, so sTyped's uint64 [7 8] -// decoded as the string '7 8' and the writer, seeing a bare string, wrote -// `

7 8

` — MATLAB reopened the field as a 1x3 char (defect +// The integer family is matched as a FAMILY rather than listed member by member, because +// the listing is what failed: int64 and uint64 were missing from this list AND from +// parseCellElement's copy of it, which is what made a 64-bit struct FIELD come back as +// text — parseTypedValue fell through the numeric branch to `default: return text`, so +// sTyped's uint64 [7 8] decoded as the string '7 8' and the writer, seeing a bare string, +// wrote `

7 8

`, which MATLAB reopened as a 1x3 char (defect // 27). The entry-level path never had the gap, so the same value was right at the top -// level and wrong one level down. +// level and wrong one level down. A pattern cannot omit a width. +// +// Deliberately NOT a catch-all "unknown class, probably numeric", and `half` is +// deliberately not in it. The arms this gates parse the body as numbers and the save path +// then formats from the `_type`, so admitting a class those two do not both understand +// turns a wrong TYPE into wrong DIGITS. Measured: `Class="half">1.5` admitted this way +// writes back `2`, and a class whose body is not numeric at all writes back `0`. Losing +// the class and keeping the characters — what the `default` arm does — is the less +// destructive of the two failures, so an unrecognized class stays there on purpose. Adding +// `half` needs the float handling on the save side too, not just a name here. +const NUMERIC_CLASS = /^(?:double|single|u?int(?:8|16|32|64))$/; + function isNumericClass(className: string): boolean { - return ( - className === 'double' || - className === 'single' || - className === 'int32' || - className === 'uint32' || - className === 'int16' || - className === 'uint16' || - className === 'int8' || - className === 'uint8' || - className === 'int64' || - className === 'uint64' - ); + return NUMERIC_CLASS.test(className); +} + +// `IsComplex="1"` is the only spelling MATLAB has been measured writing, and the only one +// we write. `"true"` is accepted as well — the same latitude parseTypedValue's `logical` +// arm already takes (`text === '1' || text === 'true'`), and taken here for the reason +// that arm is not controversial: the cost of not recognizing the attribute is asymmetric. +// It does not merely degrade the display; the imaginary parts leave the value AND the next +// save, because a re-serialized element that was not read as complex is not written as +// complex either. That was defect 53's whole shape. Reading one extra spelling costs +// nothing today and turns a possible format change from silent data loss into a no-op. +// +// Three call sites — an entry value, a cell element and a property — which is why this is +// a function and not three comparisons: "one rule, three paths, two of them right" is how +// 52 and 53 both happened. +function isComplexAttr(attr: string | undefined): boolean { + return attr === '1' || attr === 'true'; } // One numeric body, as the CLASS requires: exact decimal text for the tokens a 64-bit diff --git a/test/binarySlddValues.test.ts b/test/binarySlddValues.test.ts index 418f739..8fcc023 100644 --- a/test/binarySlddValues.test.ts +++ b/test/binarySlddValues.test.ts @@ -598,3 +598,87 @@ describe('parseBinarySlddParts — document-level bookkeeping', () => { expect(() => parseBinarySldd(ab)).toThrow('Missing data/chunk0.xml in binary SLDD'); }); }); + +// A `Class`/`IsComplex` attribute is read as a KIND of thing, not matched against a +// transcript of what one build of MATLAB happened to write. Both rules below were closed +// enumerations, and each enumeration has a defect on record: +// +// - `isNumericClass` listed its ten class names by hand, and `parseTypedValue` listed +// nine of them AGAIN as `case` labels. int64/uint64 were missing from both, so a +// 64-bit struct FIELD fell through to the bare-text return and the writer, seeing a +// bare string, spelled it `Class="char"` — MATLAB reopened the field as a char row of +// digits (defect 27). The integer family is now one pattern asked in one place, so it +// cannot omit a width and the two sites cannot disagree about one. +// - `IsComplex` was compared to the literal `'1'` in three places. A spelling this +// reader fails to recognize does not merely mis-display: the value loses its imaginary +// parts AND is re-serialized without `IsComplex`, so they leave the file too — defect +// 53's exact shape. `'true'` is accepted as well now, the same latitude the `logical` +// arm has always taken. +describe('parseBinarySlddParts — class and complexity read as kinds, not spellings', () => { + // Every integer width MATLAB has, crossed with all three sites the format nests a typed + // value at: an entry's own value, a struct FIELD, and a cell ELEMENT. The crossing is the + // point — defect 27 was right at the entry site and wrong at the other two, so a table + // that checked one site would have passed throughout. + const INT_CLASSES = ['int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64']; + + for (const cls of INT_CLASSES) { + it(`keeps the class of a ${cls} at the entry, field and cell sites`, () => { + // The CLASS is the assertion, not the serial spelling of the digits: an unsigned + // value carries a `U` suffix and a 64-bit one is held as exact text, both of which + // are pinned elsewhere. What defect 27 destroyed was the class. + const entry = value(`

7

`); + expect(entry, 'entry value').toMatchObject({ _type: cls }); + // And the save half, which is how 27 reached the file rather than only the screen: + // a value whose class the reader dropped comes back out as Class="char". + expect(saved(entry), 'entry value writes its class').toContain(`Class="${cls}"`); + + const field = value( + `

7

`, + ) as Record; + expect(field._elements[0].f, 'struct field').toMatchObject({ _type: cls }); + + const cell = value( + `

7

`, + ) as Record; + expect(cell._elements[0], 'cell element').toMatchObject({ _type: cls }); + }); + } + + it('leaves a class it does not know as text rather than guessing a number', () => { + // The pattern is deliberately not a catch-all, and this is the measurement that says + // so. Admitting an unknown class into the numeric arms hands the save path a `_type` + // it cannot format: `Class="half">1.5` comes back out as `2`, and a class whose body is + // not numeric at all comes back out as `0`. Dropping the class and keeping the + // characters is the less destructive failure, so it is the one this arm takes — which + // is also why `half`, a real MATLAB numeric class, is NOT in the pattern. + const field = value( + '

1.5

', + ) as Record; + expect(field._elements[0].f).toBe('1.5'); + }); + + for (const spelling of ['1', 'true']) { + it(`reads IsComplex="${spelling}" as complex at the entry, field and cell sites`, () => { + const entry = value(`

1.0+2.0i

`); + expect(entry, 'entry value').toEqual({ _type: 'cdata', _value: '1.0+2.0i' }); + + const field = value( + `

` + + `

1.0+2.0i

`, + ) as Record; + expect(field._elements[0].f, 'struct field').toEqual({ _type: 'cdata', _value: '1.0+2.0i' }); + + // The cell element states its shape in the envelope, because the text form is the + // only place a complex value's shape can be stated at all (defect 53). + const cell = value( + `

` + + `1.0+2.0i 3.0-4.0i

`, + ) as Record; + expect(cell._elements[0], 'cell element').toEqual({ + _type: 'cdata', + _value: '1.0+2.0i 3.0-4.0i', + _dimensions: [1, 2], + }); + }); + } +}); diff --git a/test/binaryWriteBackGate.test.ts b/test/binaryWriteBackGate.test.ts index 8a3ecb5..558264c 100644 --- a/test/binaryWriteBackGate.test.ts +++ b/test/binaryWriteBackGate.test.ts @@ -471,21 +471,16 @@ describe('defect 52: a string in a cell keeps its text, in the file as well as o const n = findEntry(root, name); return [String(n.displayValue), ...n.children.map((c: any) => String(c.displayValue))]; }; - for (const [name] of [...CELLS, ['cObj']]) { + // sStr, the string-in-a-STRUCT case, is compared on its field too. It used to be + // compared on its entry row alone: the build that wrote these fixtures (27.1.0.3393633) + // stopped emitting `_fields` in a text dictionary and StructNode.parse built a scalar + // struct's field children from `_fields` alone, so the text channel showed this struct + // with no field row while the binary channel derived the list from the element bag. That + // was its own defect (56) and it is fixed — `fieldsOf` now derives in the one place all + // four channels funnel through — so there is nothing left here to carve out. + for (const [name] of [...CELLS, ['cObj'], ['sStr']]) { expect(shown(bin, name), name).toEqual(shown(txt, name)); } - // sStr is compared on its own row alone, and deliberately not on its field. The channels - // DISAGREE there, for a reason that has nothing to do with strings or with cells: the - // build of MATLAB that wrote these two fixtures (27.1.0.3393633) no longer emits - // `_fields` in a text dictionary, and StructNode.parse builds a scalar struct's field - // children from `_fields` alone — so the text channel shows this struct with no field row - // at all, while the binary channel derives the list from the element bag - // (BinarySlddParser's `_fields: Object.keys(parsed[0])`). That is its own defect, with its - // own blast radius — every struct in every current-MATLAB text .sldd — and it is not - // asserted either way here. - expect(String(findEntry(bin, 'sStr').displayValue)).toBe( - String(findEntry(txt, 'sStr').displayValue), - ); }); it('writes every saveobj payload back, rather than an empty envelope', () => { @@ -616,20 +611,15 @@ describe('defects 53-55: an array inside a cell keeps its shape, its parts and i const bin = loadFile('../fixtures/cellarr_binary.sldd', 'cellarr_binary.sldd'); const txt = loadFile('../fixtures/cellarr_text.sldd', 'cellarr_text.sldd'); - // The walk stops at a SCALAR struct, and nowhere else. That is the one place the two - // channels are known to disagree for a reason unrelated to cells: the build of MATLAB - // that wrote these fixtures no longer emits `_fields` in a text dictionary, and - // StructNode.parse builds a scalar struct's field children from `_fields` alone, so the - // text channel shows a scalar struct with no field rows while the binary channel - // derives the list from the element bag. Its own defect, its own blast radius (every - // struct in every current-MATLAB text .sldd), not asserted either way here. + // The walk stops nowhere. It used to stop at a SCALAR struct, which was the one place + // the channels disagreed for a reason unrelated to cells: the build that wrote these + // fixtures stopped emitting `_fields` in a text dictionary and StructNode.parse built a + // scalar struct's field children from `_fields` alone (defect 56, fixed). With that + // carve-out gone the assertion reaches the fields of every struct element as well. const shown = (root: any, name: string): string[] => { const out: string[] = []; const walk = (n: any, path: string): void => { out.push(path + ' ' + String(n.displayValue) + ' | ' + String(n.dataType ?? '') + ' | ' + String(n.className ?? '')); - if (n.dataType === 'struct' && String(n.displayValue) === '<1x1 struct>') { - return; - } for (const c of n.children ?? []) { walk(c, path + '/' + c.name); } @@ -642,9 +632,10 @@ describe('defects 53-55: an array inside a cell keeps its shape, its parts and i expect(shown(bin, name), name).toEqual(shown(txt, name)); } // And a row count, so a walk that silently visited only the entry rows could not pass: - // the six defect cases have 32 rows between them (an entry and its element each, plus - // 2 + 2 + 8 numeric parts, 2 + 4 struct elements, and 2 objects). - expect(DEFECTS.reduce((n, [name]) => n + shown(bin, name).length, 0)).toBe(32); + // the six defect cases have 38 rows between them (an entry and its element each, plus + // 2 + 2 + 8 numeric parts, 2 + 4 struct elements and the `a` field of each of those + // six, and 2 objects). + expect(DEFECTS.reduce((n, [name]) => n + shown(bin, name).length, 0)).toBe(38); }); it('writes each array back the way MATLAB spells it', () => { diff --git a/test/parity/matlab/DESIGN.md b/test/parity/matlab/DESIGN.md index 4b269be..7b75b6d 100644 --- a/test/parity/matlab/DESIGN.md +++ b/test/parity/matlab/DESIGN.md @@ -1947,10 +1947,10 @@ READER did with what MATLAB wrote. fields, nested, struct array, every field class) got `_fields` on **none** of them. So on current MATLAB a struct in a text `.sldd` shows no field row at all: the fields are invisible and uneditable. This is a live defect with a far wider blast - radius than 52, it is NOT fixed here, and it is the case the README's own warning - describes — MATLAB changed its answer, which is a finding and not a test to fix. - `binaryWriteBackGate.test.ts` excludes that one struct field from its cross-channel - comparison and says why; nothing asserts the broken behaviour. + radius than 52, and it is the case the README's own warning describes — MATLAB + changed its answer, which is a finding and not a test to fix. **Fixed separately as + defect 56, below**; the cross-channel exclusions it forced in + `binaryWriteBackGate.test.ts` are gone with it. ## Three more, from asking what ELSE the cell site was missing @@ -2027,6 +2027,90 @@ Two things this measurement settled and left alone: about it (text `1…12`, binary `0…11`). Visible in the fixtures here, unrelated to cells, not asserted either way. +## Reading a format that changes: derive from structure, do not trust a spelling + +53–55 were the same shape as 52 one level out. **56 is that question asked of the format +itself**: where does a reader depend on MATLAB spelling something a particular way, such +that MATLAB changing its mind is silent data loss? The answer turned out to be already +sitting in the notes above, recorded as a neighbour of 52 and not yet fixed. + +56. **A struct in a current-MATLAB text `.sldd` showed no field rows, and a save deleted + its fields from the file.** `StructNode.parse` built a struct's children from + `rawVal._fields` alone, and build `27.1.0.3393633` stopped writing `_fields` where + `27.1.0.3353139` wrote it — so `fields` was `[]`, no field row was built even though + `_elements[0]` held every field, and `serializeElement`, which iterates the same list, + re-serialized the struct as `_elements: [{}]`. Measured on MATLAB's own bytes: every + struct in `cellarr_text.sldd` and `cellstr_text.sldd` (8 of them, including the + elements of a struct array and a struct inside a cell) came up empty, while every + struct in the older `typed_text.sldd`, `nd_nested.sldd` and `object_props_text.sldd` + was correct. No edit to the fields was needed for the loss — any edit under the entry + drops `_rawInput` and the re-serialize does the rest. + + **Four parsers build this envelope and three already DERIVED the list** — + `BinarySlddParser` (`_fields: Object.keys(parsed[0])`), `McosParser`, + `MatlabVariableNode` — so the binary channel was right throughout and only the text + channel, which passes MATLAB's JSON straight through, was wrong. That is the whole + lesson in one file: *the channel that derived from structure survived the format + change; the channel that trusted the key did not.* + + Fixed with `fieldsOf(rawVal)` in `StructNode.ts`, in the one place all four channels + funnel through: an explicit `_fields` still wins (it is the only statement of field + ORDER an envelope carries), and absent it the names are the keys of element 0 — element + 0 and not a union, because a struct array shares one field list by definition and that + is the rule the binary parser already applied. `serial._fields` is therefore always an + array, which is what lets `serializeElement`, `_renameField` and the + add/remove/restore hooks read one list that is already right instead of each deciding + what a missing key means. `addChildNode`'s `if (!this.serial._fields) { = [] }` was a + latent second bug on the same line — it would have built a list holding only the new + field — and it is unreachable now. + + The writer stays faithful: `_fieldsDeclared` records whether the INPUT declared the + key, and only then is it emitted, so a save does not add `_fields` back to a file + MATLAB left it out of. A struct WE invent (`createDefault`) declares an empty one, so + its behaviour is unchanged — the emit policy exists to avoid contradicting a MATLAB + file, and there is no such file in that case. + + Gated by `structFieldsAcrossBuilds.test.ts`, which asserts both builds' bytes as the + SAME assertion (a reader is not allowed to care which build it is reading), walks the + text channel against the binary one all the way down, and checks both halves of the + write: every field kept, `_fields` not invented, `_fields` preserved where it existed. + Reverting the derivation alone fails 11 tests across that file and + `binaryWriteBackGate.test.ts`, whose two cross-channel carve-outs for this defect are + now gone — the walk stops nowhere and `sStr`'s field is compared like everything else. + +Two enumerations hardened in the same pass, both inert against every byte MATLAB has +written and both closing a failure mode that already happened once: + +- **`isNumericClass` is a pattern, not a list, and `parseTypedValue` no longer keeps a + second copy of it.** The integer family is `u?int(8|16|32|64)`, so it cannot omit a + width, and the nine `case` labels that duplicated the same set are one + `isNumericClass(className)` in the `default` arm. Defect 27 was precisely that + duplication: int64/uint64 missing from BOTH lists, the value falling through to the + bare-text return, the writer spelling it `Class="char"`. +- **`IsComplex` accepts `"true"` as well as `"1"`**, through one `isComplexAttr` helper + rather than three literal comparisons — the same latitude `parseTypedValue`'s `logical` + arm has always taken. The asymmetry is the argument: an unrecognized spelling does not + merely mis-display, it drops the imaginary parts from the value AND from the next save, + which is defect 53's exact shape. + +Two findings from that hardening, measured and deliberately NOT acted on: + +- **The entry site is permissive in a way that corrupts, and the field site's narrowness is + the safer of the two failures.** `parseEntryValue` accepts ANY class and formats it as a + number, so `Class="half">1.5` writes back `2` and a class whose body is not numeric at + all writes back `0`; `parseTypedValue`'s `default` arm drops the class and keeps the + characters. So `half` is deliberately absent from `NUMERIC_CLASS` — admitting it there + would trade a wrong type for wrong digits — and the field site was NOT aligned with the + entry site, which was the change this audit set out to make until the measurement said + otherwise. Nothing in the whole MATLAB-authored binary corpus reaches that arm: the only + `

` values anywhere in it are `char`, `double`, `logical`, `cell`, `struct` + and the ten numeric classes. +- **`writeIntoSaveobj` asks `fields.includes(key)` of the same envelope and is NOT + affected**, because `SAVEOBJ_KEY` is set only by `BinarySlddParser` — the saveobj + envelope is a binary-channel concept and that channel derives its own `_fields`. Checked + rather than assumed; it is the one other place in the model layer that reads `_fields` to + decide something. + ## Known limitations, to verify and document - **Derived MCOS classes.** A customer class `MyParam < Simulink.Parameter` diff --git a/test/structFieldsAcrossBuilds.test.ts b/test/structFieldsAcrossBuilds.test.ts new file mode 100644 index 0000000..9b5fec1 --- /dev/null +++ b/test/structFieldsAcrossBuilds.test.ts @@ -0,0 +1,159 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A struct's field list is read from the ELEMENT BAG, not trusted from `_fields`. +// +// MATLAB changed its answer. Build `27.1.0.3353139` wrote a `"_fields": ["a","b"]` +// array beside `_elements` in a text (JSON) dictionary; build `27.1.0.3393633` writes +// none at all, and the field names live only as the keys of `_elements[i]`. +// `StructNode.parse` built a struct's children from `_fields` alone, so on current +// MATLAB every struct in every text `.sldd` came up with NO field rows — invisible and +// uneditable — and, because `serializeElement` iterates the same list, a struct that was +// then modified re-serialized as `_elements: [{}]` and every field was deleted from the +// saved file. +// +// Four parsers build this envelope and three of them already DERIVED the list +// (`BinarySlddParser`'s `_fields: Object.keys(parsed[0])`, `McosParser`, +// `MatlabVariableNode`); only the text channel passed MATLAB's JSON straight through. +// So the channel that derived from structure survived the format change and the channel +// that trusted the spelling broke — which is why the fix is to derive in the one place +// all four channels funnel through, rather than to teach the text parser to synthesize +// the key MATLAB dropped. +// +// Both builds' bytes are asserted here on purpose: a fix that reads the element bag must +// also still honour an explicit `_fields`, which is the only thing that states field +// ORDER for a bag whose keys a reader might reorder, and must not start writing `_fields` +// into a file MATLAB left it out of. +import { describe, it, expect } from 'vitest'; +import StructNode from '../src/datamodel/node/data/StructNode.js'; +import '../src/datamodel/node/data/NodeClassMap.js'; +import { loadFile, findEntry } from './parity/loadFile.js'; + +// Every struct MATLAB wrote into these fixtures, with the fields it wrote, keyed by the +// build that wrote them. The point of the table is that the two halves are the SAME +// assertion — the reader is not allowed to care which build it is reading. +const WITH_FIELDS: Array<[string, string, string[]]> = [ + ['typed_text.sldd', 'sTyped', ['a', 'b', 'c', 'd']], + ['typed_text.sldd', 'sCharMat', ['m', 'r']], + ['nd_nested.sldd', 'ndInStruct', ['flat', 'deep']], + ['nd_nested.sldd', 'ndTwoLevel', ['inner']], + ['object_props_text.sldd', 'a', ['b', 'c']], +]; + +const WITHOUT_FIELDS: Array<[string, string, string[]]> = [ + ['cellarr_text.sldd', 'sStructArr', ['f']], + ['cellarr_text.sldd', 'sObjArr', ['f']], + ['cellstr_text.sldd', 'sStr', ['f']], +]; + +describe('a struct read from MATLAB text bytes shows its fields, in either build', () => { + for (const [fixture, entry, fields] of [...WITH_FIELDS, ...WITHOUT_FIELDS]) { + it(fixture + ' / ' + entry + ' has fields ' + fields.join(','), () => { + const node = findEntry(loadFile('../fixtures/' + fixture, fixture), entry); + expect(node.children.map((c: any) => c.name)).toEqual(fields); + }); + } + + it('reaches the fields of every element of a struct array, and of a struct in a cell', () => { + // Nesting is where the blast radius actually is: `_fields` was threaded down to each + // element node, so an empty list at the top emptied every element too. A struct inside + // a CELL reaches StructNode.parse by a third route again. + const root = loadFile('../fixtures/cellarr_text.sldd', 'cellarr_text.sldd'); + const arr = findEntry(root, 'cStructArr').children[0]; + expect(String(arr.displayValue)).toBe('<1x2 struct>'); + expect(arr.children.map((e: any) => e.children.map((c: any) => c.name))).toEqual([['a'], ['a']]); + const scalar = findEntry(root, 'cStruct').children[0]; + expect(scalar.children.map((c: any) => c.name)).toEqual(['a']); + }); + + it('reads a struct the same way the binary channel does, all the way down', () => { + // The invariant stated BETWEEN the channels rather than inside either one — this + // repo's recurring defect class. The binary channel is the oracle precisely because + // it already derived the list; before the fix the two disagreed about every struct, + // and `binaryWriteBackGate` had to stop its cross-channel walk at a scalar struct to + // avoid the disagreement. Nothing stops it now. + const bin = loadFile('../fixtures/cellarr_binary.sldd', 'cellarr_binary.sldd'); + const txt = loadFile('../fixtures/cellarr_text.sldd', 'cellarr_text.sldd'); + const shown = (root: any, name: string): string[] => { + const out: string[] = []; + const walk = (n: any, path: string): void => { + out.push(path + ' ' + String(n.displayValue) + ' | ' + String(n.dataType ?? '')); + for (const c of n.children ?? []) { walk(c, path + '/' + c.name); } + }; + walk(findEntry(root, name), name); + return out; + }; + for (const name of ['sStructArr', 'cStruct', 'cStructArr', 'cStructArr2D']) { + expect(shown(bin, name), name).toEqual(shown(txt, name)); + } + }); +}); + +describe('writing a struct back keeps its fields, and keeps the file MATLAB-shaped', () => { + // The silent half. `serializeValue` replays `_rawInput` verbatim until something is + // modified, so the loss needed no edit to the fields themselves — any edit under the + // entry was enough to drop the raw bytes and re-serialize from an empty field list. + const serializeModified = (fixture: string, entry: string): Record => { + const node: any = findEntry(loadFile('../fixtures/' + fixture, fixture), entry); + node._markModified(); + return node.serializeValue() as Record; + }; + + it('keeps every field of a struct MATLAB wrote without _fields', () => { + const out = serializeModified('cellarr_text.sldd', 'sStructArr'); + const elements = out._elements as Record[]; + expect(Object.keys(elements[0])).toEqual(['f']); + // The field's own value has to survive too, not just its name: a 1x2 struct array. + expect((elements[0].f as Record)._dimensions).toEqual([1, 2]); + }); + + it('does not invent _fields in a file MATLAB left it out of', () => { + // Faithfulness is not cosmetic here: the whole reason the reader may not depend on + // `_fields` is that MATLAB's own writer dropped it, so writing it back would make our + // saves diverge from MATLAB's for every struct in every dictionary. + expect(serializeModified('cellarr_text.sldd', 'sStructArr')).not.toHaveProperty('_fields'); + }); + + it('keeps _fields in a file that had it, in MATLAB\'s own order', () => { + expect(serializeModified('typed_text.sldd', 'sTyped')._fields).toEqual(['a', 'b', 'c', 'd']); + }); +}); + +describe('StructNode.parse derives the field list', () => { + it('prefers an explicit _fields, which is the only statement of field ORDER', () => { + // An element bag's key order is a JSON object's key order. Where MATLAB stated the + // order outright, that statement wins — deriving would be a silent reordering of the + // user's struct. + const node = StructNode.parse({ + _array_type: 'Struct', _dimensions: [1, 1], + _fields: ['b', 'a'], _elements: [{ a: 1, b: 2 }], + }, 'S', null); + expect(node.children.map((c) => c.name)).toEqual(['b', 'a']); + }); + + it('derives from the element bag when _fields is absent', () => { + const node = StructNode.parse({ + _array_type: 'Struct', _dimensions: [1, 1], _elements: [{ a: 1, b: 2 }], + }, 'S', null); + expect(node.children.map((c) => c.name)).toEqual(['a', 'b']); + }); + + it('derives a struct array\'s shared list from its first element, as the binary parser does', () => { + const node = StructNode.parse({ + _array_type: 'Struct', _dimensions: [1, 2], _elements: [{ a: 1 }, { a: 2 }], + }, 'S', null); + expect(node.children.map((e) => e.children.map((c) => c.name))).toEqual([['a'], ['a']]); + }); + + it('adds a field to a derived list without dropping the ones MATLAB wrote', () => { + // The latent second bug: addChildNode's `if (!this.serial._fields) { = [] }` built a + // list holding ONLY the new field. Unreachable while the fields were invisible — + // there was no struct row to add to — and a field-deleting edit the moment they + // became visible again. + const node = StructNode.parse({ + _array_type: 'Struct', _dimensions: [1, 1], _elements: [{ a: 1, b: 2 }], + }, 'S', null); + (node as any).addChildNode(); + expect(node.children.map((c) => c.name)).toEqual(['a', 'b', 'field']); + expect(Object.keys((node as any).serializeElement())).toEqual(['a', 'b', 'field']); + }); +}); diff --git a/test/structNode.test.ts b/test/structNode.test.ts index 2659b89..3bb8d2f 100644 --- a/test/structNode.test.ts +++ b/test/structNode.test.ts @@ -266,15 +266,18 @@ describe('StructNode.addChildNode', () => { expect((node as any).serial._fields).toEqual(['field', 'field1']); }); - it('initializes _fields when the struct had none', () => { - // An empty struct parsed from a bare { _elements: [{}] } has no _fields - // array. addChildNode must create one rather than pushing onto undefined. + it('pushes onto the empty list parse derives for a struct with no fields', () => { + // A bare { _elements: [{}] } declares no _fields, and parse derives one from the + // element bag — empty, here, because the bag is. So the list addChildNode pushes + // onto always exists: `serial._fields` is an ARRAY for every parsed struct, which + // is what lets serializeElement and the rename/remove/restore hooks read it without + // each re-deciding what a missing key means. See structFieldsAcrossBuilds.test.ts. const node = StructNode.parse({ _array_type: 'Struct', _dimensions: [1, 1], _elements: [{}], }, 'S', null); - expect((node as any).serial._fields).toBeUndefined(); + expect((node as any).serial._fields).toEqual([]); (node as any).addChildNode(); expect((node as any).serial._fields).toEqual(['field']); });