From 617fa92efc1269a2147ae569162981024f22efc6 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Fri, 25 Aug 2017 17:44:10 +0300 Subject: [PATCH] Fix MultiTemplateParser to not eat its closing tag (#4756) --- tests/app/xml-parser-tests/itemTemplates.xml | 15 +++++++++++ .../app/xml-parser-tests/xml-parser-tests.ts | 10 ++++++++ tns-core-modules/ui/builder/builder.ts | 25 +++++++++++++------ 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 tests/app/xml-parser-tests/itemTemplates.xml diff --git a/tests/app/xml-parser-tests/itemTemplates.xml b/tests/app/xml-parser-tests/itemTemplates.xml new file mode 100644 index 000000000..1836d9d2e --- /dev/null +++ b/tests/app/xml-parser-tests/itemTemplates.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/app/xml-parser-tests/xml-parser-tests.ts b/tests/app/xml-parser-tests/xml-parser-tests.ts index cd17b3c83..8c1e5050c 100644 --- a/tests/app/xml-parser-tests/xml-parser-tests.ts +++ b/tests/app/xml-parser-tests/xml-parser-tests.ts @@ -5,6 +5,7 @@ import * as TKUnit from "../TKUnit"; import * as xmlModule from "tns-core-modules/xml"; import * as fs from "tns-core-modules/file-system"; +import * as builder from "tns-core-modules/ui/builder"; export var test_XmlParser_IsDefined = function () { TKUnit.assertNotEqual(xmlModule.XmlParser, undefined, "Class XmlParser should be defined!"); @@ -182,3 +183,12 @@ export var test_XmlParser_NamespacesTest = function () { var xmlString = file.readTextSync(); xmlParser.parse(xmlString); }; + +export function test_MultiParserTemplate() { + const file = fs.File.fromPath(fs.path.join(__dirname, "itemTemplates.xml")); + const xml = file.readTextSync(); + + const view: any = builder.parse(xml); + TKUnit.assertNotNull(view.items) + TKUnit.assertEqual(view.items.length, 1); +} \ No newline at end of file diff --git a/tns-core-modules/ui/builder/builder.ts b/tns-core-modules/ui/builder/builder.ts index 3d3b966f1..a3b15955c 100644 --- a/tns-core-modules/ui/builder/builder.ts +++ b/tns-core-modules/ui/builder/builder.ts @@ -474,6 +474,9 @@ namespace xml2ui { export class MultiTemplateParser implements XmlStateConsumer { private _childParsers = new Array(); + private _value: KeyedTemplate[]; + + get value(): KeyedTemplate[] { return this._value; } constructor(private parent: XmlStateConsumer, private templateProperty: TemplateProperty) { } @@ -496,8 +499,8 @@ namespace xml2ui { createView: this._childParsers[i].buildTemplate() }); } - this.templateProperty.parent.component[this.templateProperty.name] = templates; - return this.parent; + this._value = templates; + return this.parent.parse(args); } } @@ -564,11 +567,12 @@ namespace xml2ui { var name = ComponentParser.getComplexPropertyName(args.elementName); - this.complexProperties.push({ + const complexProperty: ComponentParser.ComplexProperty = { parent: parent, name: name, - items: [], - }); + items: [] + }; + this.complexProperties.push(complexProperty); if (ComponentParser.isKnownTemplate(name, parent.exports)) { return new TemplateParser(this, { @@ -583,7 +587,7 @@ namespace xml2ui { } if (ComponentParser.isKnownMultiTemplate(name, parent.exports)) { - return new MultiTemplateParser(this, { + const parser = new MultiTemplateParser(this, { context: (parent ? getExports(parent.component) : null) || this.context, // Passing 'context' won't work if you set "codeFile" on the page parent: parent, name: name, @@ -592,6 +596,8 @@ namespace xml2ui { errorFormat: this.error, sourceTracker: this.sourceTracker }); + complexProperty.parser = parser; + return parser; } } else { @@ -628,7 +634,9 @@ namespace xml2ui { } else if (args.eventType === xml.ParserEventType.EndElement) { if (ComponentParser.isComplexProperty(args.elementName)) { if (complexProperty) { - if (parent && (parent.component)._addArrayFromBuilder) { + if (complexProperty.parser) { + parent.component[complexProperty.name] = complexProperty.parser.value; + } else if (parent && (parent.component)._addArrayFromBuilder) { // If parent is AddArrayFromBuilder call the interface method to populate the array property. (parent.component)._addArrayFromBuilder(complexProperty.name, complexProperty.items); complexProperty.items = []; @@ -643,7 +651,7 @@ namespace xml2ui { } } - return this; + return this; } private static isComplexProperty(name: string): boolean { @@ -692,6 +700,7 @@ namespace xml2ui { parent: ComponentModule; name: string; items?: Array; + parser?: { value: any; }; } } }