@joebigelow / wix-1 / commits / 18752ee7

Modernize BalCompiler and BalBurnBackendExtension.

Sean Hall committed Apr 6, 2020 at 12:30 UTC 18752ee7da742d0219e7b882315e03ad888f5725
3 files changed +150 -129
src/test/WixToolsetTest.Bal/BalExtensionFixture.cs
+5
@@ -3,6 +3,7 @@
3 namespace WixToolsetTest.Bal
4 {
5 using System.IO;
6 + using System.Linq;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using Xunit;
@@ -29,6 +30,10 @@ namespace WixToolsetTest.Bal
30 "-o", bundleFile,
31 });
32 compileResult.AssertSuccess();
33 + Assert.Equal(new[]
34 + {
35 + "BurnBackend didn't provide Wixout so skipping BalExtension PostBind verification."
36 + }, compileResult.Messages.Select(x => x.ToString()).ToArray());
37
38 Assert.True(File.Exists(bundleFile));
39 }
src/wixext/BalBurnBackendExtension.cs
+34 -37
@@ -4,10 +4,10 @@ namespace WixToolset.Bal
4 {
5 using System;
6 using System.Linq;
7 + using WixToolset.Bal.Tuples;
8 using WixToolset.Data;
9 using WixToolset.Data.Burn;
9 - using WixToolset.Data.WindowsInstaller;
10 - using WixToolset.Data.WindowsInstaller.Rows;
10 + using WixToolset.Data.Tuples;
11 using WixToolset.Extensibility;
12 using WixToolset.Extensibility.Data;
13
@@ -17,17 +17,17 @@ namespace WixToolset.Bal
17 {
18 base.PostBackendBind(result);
19
20 - var output = WindowsInstallerData.Load(result.Wixout, false);
21 -
22 - // Only process Bundles.
23 - if (OutputType.Bundle != output.Type)
20 + if (result.Wixout == null)
21 {
22 + this.Messaging.Write(new Message(null, MessageLevel.Warning, 1, "BurnBackend didn't provide Wixout so skipping BalExtension PostBind verification."));
23 return;
24 }
25
28 - var baTable = output.Tables["WixBootstrapperApplication"];
29 - var baRow = baTable.Rows[0];
30 - var baId = (string)baRow[0];
26 + var intermediate = Intermediate.Load(result.Wixout);
27 + var section = intermediate.Sections.Single();
28 +
29 + var baTuple = section.Tuples.OfType<WixBootstrapperApplicationTuple>().SingleOrDefault();
30 + var baId = baTuple?.Id?.Id;
31 if (null == baId)
32 {
33 return;
@@ -38,60 +38,57 @@ namespace WixToolset.Bal
38
39 if (isStdBA || isMBA)
40 {
41 - this.VerifyBAFunctions(output);
41 + this.VerifyBAFunctions(section);
42 }
43
44 if (isMBA)
45 {
46 - this.VerifyPrereqPackages(output);
46 + this.VerifyPrereqPackages(section);
47 }
48 }
49
50 - private void VerifyBAFunctions(WindowsInstallerData output)
50 + private void VerifyBAFunctions(IntermediateSection section)
51 {
52 - Row baFunctionsRow = null;
53 - var baFunctionsTable = output.Tables["WixBalBAFunctions"];
54 - foreach (var row in baFunctionsTable.Rows)
52 + WixBalBAFunctionsTuple baFunctionsTuple = null;
53 + foreach (var tuple in section.Tuples.OfType<WixBalBAFunctionsTuple>())
54 {
56 - if (null == baFunctionsRow)
55 + if (null == baFunctionsTuple)
56 {
58 - baFunctionsRow = row;
57 + baFunctionsTuple = tuple;
58 }
59 else
60 {
62 - this.Messaging.Write(BalErrors.MultipleBAFunctions(row.SourceLineNumbers));
61 + this.Messaging.Write(BalErrors.MultipleBAFunctions(tuple.SourceLineNumbers));
62 }
63 }
64
66 - var payloadPropertiesTable = output.Tables["WixPayloadProperties"];
67 - var payloadPropertiesRows = payloadPropertiesTable.Rows.Cast<WixPayloadPropertiesRow>();
68 - if (null == baFunctionsRow)
65 + var payloadPropertiesTuples = section.Tuples.OfType<WixBundlePayloadTuple>().ToList();
66 + if (null == baFunctionsTuple)
67 {
70 - foreach (var payloadPropertiesRow in payloadPropertiesRows)
68 + foreach (var payloadPropertiesTuple in payloadPropertiesTuples)
69 {
70 // TODO: Make core WiX canonicalize Name (this won't catch '.\bafunctions.dll').
73 - if (string.Equals(payloadPropertiesRow.Name, "bafunctions.dll", StringComparison.OrdinalIgnoreCase))
71 + if (string.Equals(payloadPropertiesTuple.Name, "bafunctions.dll", StringComparison.OrdinalIgnoreCase))
72 {
75 - this.Messaging.Write(BalWarnings.UnmarkedBAFunctionsDLL(payloadPropertiesRow.SourceLineNumbers));
73 + this.Messaging.Write(BalWarnings.UnmarkedBAFunctionsDLL(payloadPropertiesTuple.SourceLineNumbers));
74 }
75 }
76 }
77 else
78 {
81 - // TODO: May need to revisit this depending on the outcome of #5273.
82 - var payloadId = (string)baFunctionsRow[0];
83 - var bundlePayloadRow = payloadPropertiesRows.Single(x => payloadId == x.Id);
84 - if (BurnConstants.BurnUXContainerName != bundlePayloadRow.Container)
79 + var payloadId = baFunctionsTuple.Id;
80 + var bundlePayloadTuple = payloadPropertiesTuples.Single(x => payloadId == x.Id);
81 + if (BurnConstants.BurnUXContainerName != bundlePayloadTuple.ContainerRef)
82 {
86 - this.Messaging.Write(BalErrors.BAFunctionsPayloadRequiredInUXContainer(baFunctionsRow.SourceLineNumbers));
83 + this.Messaging.Write(BalErrors.BAFunctionsPayloadRequiredInUXContainer(baFunctionsTuple.SourceLineNumbers));
84 }
85 }
86 }
87
91 - private void VerifyPrereqPackages(WindowsInstallerData output)
88 + private void VerifyPrereqPackages(IntermediateSection section)
89 {
93 - var prereqInfoTable = output.Tables["WixMbaPrereqInformation"];
94 - if (null == prereqInfoTable || prereqInfoTable.Rows.Count == 0)
90 + var prereqInfoTuples = section.Tuples.OfType<WixMbaPrereqInformationTuple>().ToList();
91 + if (prereqInfoTuples.Count == 0)
92 {
93 this.Messaging.Write(BalErrors.MissingPrereq());
94 return;
@@ -100,24 +97,24 @@ namespace WixToolset.Bal
97 var foundLicenseFile = false;
98 var foundLicenseUrl = false;
99
103 - foreach (Row prereqInfoRow in prereqInfoTable.Rows)
100 + foreach (var prereqInfoTuple in prereqInfoTuples)
101 {
105 - if (null != prereqInfoRow[1])
102 + if (null != prereqInfoTuple.LicenseFile)
103 {
104 if (foundLicenseFile || foundLicenseUrl)
105 {
109 - this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoRow.SourceLineNumbers));
106 + this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoTuple.SourceLineNumbers));
107 return;
108 }
109
110 foundLicenseFile = true;
111 }
112
116 - if (null != prereqInfoRow[2])
113 + if (null != prereqInfoTuple.LicenseUrl)
114 {
115 if (foundLicenseFile || foundLicenseUrl)
116 {
120 - this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoRow.SourceLineNumbers));
117 + this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoTuple.SourceLineNumbers));
118 return;
119 }
120
src/wixext/BalCompiler.cs
+111 -92
@@ -15,16 +15,14 @@ namespace WixToolset.Bal
15 /// </summary>
16 public sealed class BalCompiler : BaseCompilerExtension
17 {
18 - private SourceLineNumber addedConditionLineNumber;
19 - private Dictionary<string, WixMbaPrereqInformationTuple> prereqInfoRows;
18 + private readonly Dictionary<string, WixMbaPrereqInformationTuple> prereqInfoTuplesByPackageId;
19
20 /// <summary>
21 /// Instantiate a new BalCompiler.
22 /// </summary>
23 public BalCompiler()
24 {
26 - this.addedConditionLineNumber = null;
27 - this.prereqInfoRows = new Dictionary<string, WixMbaPrereqInformationTuple>();
25 + this.prereqInfoTuplesByPackageId = new Dictionary<string, WixMbaPrereqInformationTuple>();
26 }
27
28 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/bal";
@@ -82,7 +80,7 @@ namespace WixToolset.Bal
80 /// <param name="context">Extra information about the context in which this element is being parsed.</param>
81 public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context)
82 {
85 - SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement);
83 + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement);
84 WixMbaPrereqInformationTuple prereqInfo;
85
86 switch (parentElement.Name.LocalName)
@@ -102,18 +100,20 @@ namespace WixToolset.Bal
100 {
101 case "PrereqLicenseFile":
102
105 - if (!this.prereqInfoRows.TryGetValue(packageId, out prereqInfo))
103 + if (!this.prereqInfoTuplesByPackageId.TryGetValue(packageId, out prereqInfo))
104 {
105 // at the time the extension attribute is parsed, the compiler might not yet have
106 // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
109 - XAttribute prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
107 + var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
108
109 if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
110 {
113 - prereqInfo = (WixMbaPrereqInformationTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixMbaPrereqInformation");
114 - prereqInfo.PackageId = packageId;
111 + prereqInfo = section.AddTuple(new WixMbaPrereqInformationTuple(sourceLineNumbers)
112 + {
113 + PackageId = packageId,
114 + });
115
116 - this.prereqInfoRows.Add(packageId, prereqInfo);
116 + this.prereqInfoTuplesByPackageId.Add(packageId, prereqInfo);
117 }
118 else
119 {
@@ -133,18 +133,20 @@ namespace WixToolset.Bal
133 break;
134 case "PrereqLicenseUrl":
135
136 - if (!this.prereqInfoRows.TryGetValue(packageId, out prereqInfo))
136 + if (!this.prereqInfoTuplesByPackageId.TryGetValue(packageId, out prereqInfo))
137 {
138 // at the time the extension attribute is parsed, the compiler might not yet have
139 // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
140 - XAttribute prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
140 + var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
141
142 if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
143 {
144 - prereqInfo = (WixMbaPrereqInformationTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixMbaPrereqInformation");
145 - prereqInfo.PackageId = packageId;
144 + prereqInfo = section.AddTuple(new WixMbaPrereqInformationTuple(sourceLineNumbers)
145 + {
146 + PackageId = packageId,
147 + });
148
147 - this.prereqInfoRows.Add(packageId, prereqInfo);
149 + this.prereqInfoTuplesByPackageId.Add(packageId, prereqInfo);
150 }
151 else
152 {
@@ -165,12 +167,14 @@ namespace WixToolset.Bal
167 case "PrereqPackage":
168 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
169 {
168 - if (!this.prereqInfoRows.TryGetValue(packageId, out prereqInfo))
170 + if (!this.prereqInfoTuplesByPackageId.TryGetValue(packageId, out prereqInfo))
171 {
170 - prereqInfo = (WixMbaPrereqInformationTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixMbaPrereqInformation");
171 - prereqInfo.PackageId = packageId;
172 + prereqInfo = section.AddTuple(new WixMbaPrereqInformationTuple(sourceLineNumbers)
173 + {
174 + PackageId = packageId,
175 + });
176
173 - this.prereqInfoRows.Add(packageId, prereqInfo);
177 + this.prereqInfoTuplesByPackageId.Add(packageId, prereqInfo);
178 }
179 }
180 break;
@@ -193,8 +197,10 @@ namespace WixToolset.Bal
197 case "BAFunctions":
198 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
199 {
196 - var tuple = (WixBalBAFunctionsTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixBalBAFunctions");
197 - tuple.PayloadId = payloadId;
200 + section.AddTuple(new WixBalBAFunctionsTuple(sourceLineNumbers)
201 + {
202 + PayloadId = payloadId,
203 + });
204 }
205 break;
206 default:
@@ -206,7 +212,7 @@ namespace WixToolset.Bal
212 case "Variable":
213 // at the time the extension attribute is parsed, the compiler might not yet have
214 // parsed the Name attribute, so we need to get it directly from the parent element.
209 - XAttribute variableName = parentElement.Attribute("Name");
215 + var variableName = parentElement.Attribute("Name");
216 if (null == variableName)
217 {
218 this.Messaging.Write(ErrorMessages.ExpectedParentWithAttribute(sourceLineNumbers, "Variable", "Overridable", "Name"));
@@ -218,8 +224,10 @@ namespace WixToolset.Bal
224 case "Overridable":
225 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
226 {
221 - var tuple = (WixStdbaOverridableVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixStdbaOverridableVariable");
222 - tuple.Name = variableName.Value;
227 + section.AddTuple(new WixStdbaOverridableVariableTuple(sourceLineNumbers)
228 + {
229 + Name = variableName.Value,
230 + });
231 }
232 break;
233 default:
@@ -237,11 +245,11 @@ namespace WixToolset.Bal
245 /// <param name="node">The element to parse.</param>
246 private void ParseConditionElement(Intermediate intermediate, IntermediateSection section, XElement node)
247 {
240 - SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
241 - string condition = this.ParseHelper.GetConditionInnerText(node); // condition is the inner text of the element.
248 + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
249 + var condition = this.ParseHelper.GetConditionInnerText(node); // condition is the inner text of the element.
250 string message = null;
251
244 - foreach (XAttribute attrib in node.Attributes())
252 + foreach (var attrib in node.Attributes())
253 {
254 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
255 {
@@ -276,14 +284,11 @@ namespace WixToolset.Bal
284
285 if (!this.Messaging.EncounteredError)
286 {
279 - var tuple = (WixBalConditionTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixBalCondition");
280 - tuple.Condition = condition;
281 - tuple.Message = message;
282 -
283 - if (null == this.addedConditionLineNumber)
287 + section.AddTuple(new WixBalConditionTuple(sourceLineNumbers)
288 {
285 - this.addedConditionLineNumber = sourceLineNumbers;
286 - }
289 + Condition = condition,
290 + Message = message,
291 + });
292 }
293 }
294
@@ -293,11 +298,11 @@ namespace WixToolset.Bal
298 /// <param name="node">The element to parse.</param>
299 private void ParseWixStandardBootstrapperApplicationElement(Intermediate intermediate, IntermediateSection section, XElement node)
300 {
296 - SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
301 + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
302 string launchTarget = null;
303 string launchTargetElevatedId = null;
304 string launchArguments = null;
300 - YesNoType launchHidden = YesNoType.NotSet;
305 + var launchHidden = YesNoType.NotSet;
306 string launchWorkingDir = null;
307 string licenseFile = null;
308 string licenseUrl = null;
@@ -305,13 +310,13 @@ namespace WixToolset.Bal
310 string logoSideFile = null;
311 string themeFile = null;
312 string localizationFile = null;
308 - YesNoType suppressOptionsUI = YesNoType.NotSet;
309 - YesNoType suppressDowngradeFailure = YesNoType.NotSet;
310 - YesNoType suppressRepair = YesNoType.NotSet;
311 - YesNoType showVersion = YesNoType.NotSet;
312 - YesNoType supportCacheOnly = YesNoType.NotSet;
313 + var suppressOptionsUI = YesNoType.NotSet;
314 + var suppressDowngradeFailure = YesNoType.NotSet;
315 + var suppressRepair = YesNoType.NotSet;
316 + var showVersion = YesNoType.NotSet;
317 + var supportCacheOnly = YesNoType.NotSet;
318
314 - foreach (XAttribute attrib in node.Attributes())
319 + foreach (var attrib in node.Attributes())
320 {
321 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
322 {
@@ -387,90 +392,101 @@ namespace WixToolset.Bal
392 {
393 if (!String.IsNullOrEmpty(launchTarget))
394 {
390 - var row = (WixBundleVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixBundleVariable");
391 - row.Id = new Identifier(AccessModifier.Public, "LaunchTarget");
392 - row.Value = launchTarget;
393 - row.Type = "string";
395 + section.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "LaunchTarget"))
396 + {
397 + Value = launchTarget,
398 + Type = "string",
399 + });
400 }
401
402 if (!String.IsNullOrEmpty(launchTargetElevatedId))
403 {
398 - var row = (WixBundleVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixBundleVariable");
399 - row.Id = new Identifier(AccessModifier.Public, "LaunchTargetElevatedId");
400 - row.Value = launchTargetElevatedId;
401 - row.Type = "string";
404 + section.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "LaunchTargetElevatedId"))
405 + {
406 + Value = launchTargetElevatedId,
407 + Type = "string",
408 + });
409 }
410
411 if (!String.IsNullOrEmpty(launchArguments))
412 {
406 - var row = (WixBundleVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixBundleVariable");
407 - row.Id = new Identifier(AccessModifier.Public, "LaunchArguments");
408 - row.Value = launchArguments;
409 - row.Type = "string";
413 + section.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "LaunchArguments"))
414 + {
415 + Value = launchArguments,
416 + Type = "string",
417 + });
418 }
419
420 if (YesNoType.Yes == launchHidden)
421 {
414 - var row = (WixBundleVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixBundleVariable");
415 - row.Id = new Identifier(AccessModifier.Public, "LaunchHidden");
416 - row.Value = "yes";
417 - row.Type = "string";
422 + section.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "LaunchHidden"))
423 + {
424 + Value = "yes",
425 + Type = "string",
426 + });
427 }
428
429
430 if (!String.IsNullOrEmpty(launchWorkingDir))
431 {
423 - var row = (WixBundleVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "Variable");
424 - row.Id = new Identifier(AccessModifier.Public, "LaunchWorkingFolder");
425 - row.Value = launchWorkingDir;
426 - row.Type = "string";
432 + section.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "LaunchWorkingFolder"))
433 + {
434 + Value = launchWorkingDir,
435 + Type = "string",
436 + });
437 }
438
439 if (!String.IsNullOrEmpty(licenseFile))
440 {
431 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
432 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "WixStdbaLicenseRtf");
433 - wixVariableRow.Value = licenseFile;
441 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixStdbaLicenseRtf"))
442 + {
443 + Value = licenseFile,
444 + });
445 }
446
447 if (null != licenseUrl)
448 {
438 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
439 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "WixStdbaLicenseUrl");
440 - wixVariableRow.Value = licenseUrl;
449 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixStdbaLicenseUrl"))
450 + {
451 + Value = licenseUrl,
452 + });
453 }
454
455 if (!String.IsNullOrEmpty(logoFile))
456 {
445 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
446 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "WixStdbaLogo");
447 - wixVariableRow.Value = logoFile;
457 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixStdbaLogo"))
458 + {
459 + Value = logoFile,
460 + });
461 }
462
463 if (!String.IsNullOrEmpty(logoSideFile))
464 {
452 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
453 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "WixStdbaLogoSide");
454 - wixVariableRow.Value = logoSideFile;
465 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixStdbaLogoSide"))
466 + {
467 + Value = logoSideFile,
468 + });
469 }
470
471 if (!String.IsNullOrEmpty(themeFile))
472 {
459 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
460 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "WixStdbaThemeXml");
461 - wixVariableRow.Value = themeFile;
473 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixStdbaThemeXml"))
474 + {
475 + Value = themeFile,
476 + });
477 }
478
479 if (!String.IsNullOrEmpty(localizationFile))
480 {
466 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
467 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "WixStdbaThemeWxl");
468 - wixVariableRow.Value = localizationFile;
481 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixStdbaThemeWxl"))
482 + {
483 + Value = localizationFile,
484 + });
485 }
486
487 if (YesNoType.Yes == suppressOptionsUI || YesNoType.Yes == suppressDowngradeFailure || YesNoType.Yes == suppressRepair || YesNoType.Yes == showVersion || YesNoType.Yes == supportCacheOnly)
488 {
473 - var tuple = (WixStdbaOptionsTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixStdbaOptions");
489 + var tuple = section.AddTuple(new WixStdbaOptionsTuple(sourceLineNumbers));
490 if (YesNoType.Yes == suppressOptionsUI)
491 {
492 tuple.SuppressOptionsUI = 1;
@@ -505,12 +521,12 @@ namespace WixToolset.Bal
521 /// <param name="node">The element to parse.</param>
522 private void ParseWixManagedBootstrapperApplicationHostElement(Intermediate intermediate, IntermediateSection section, XElement node)
523 {
508 - SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
524 + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
525 string logoFile = null;
526 string themeFile = null;
527 string localizationFile = null;
528
513 - foreach (XAttribute attrib in node.Attributes())
529 + foreach (var attrib in node.Attributes())
530 {
531 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
532 {
@@ -542,23 +558,26 @@ namespace WixToolset.Bal
558 {
559 if (!String.IsNullOrEmpty(logoFile))
560 {
545 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
546 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "PreqbaLogo");
547 - wixVariableRow.Value = logoFile;
561 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "PreqbaLogo"))
562 + {
563 + Value = logoFile,
564 + });
565 }
566
567 if (!String.IsNullOrEmpty(themeFile))
568 {
552 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
553 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "PreqbaThemeXml");
554 - wixVariableRow.Value = themeFile;
569 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "PreqbaThemeXml"))
570 + {
571 + Value = themeFile,
572 + });
573 }
574
575 if (!String.IsNullOrEmpty(localizationFile))
576 {
559 - var wixVariableRow = (WixVariableTuple)this.ParseHelper.CreateTuple(section, sourceLineNumbers, "WixVariable");
560 - wixVariableRow.Id = new Identifier(AccessModifier.Public, "PreqbaThemeWxl");
561 - wixVariableRow.Value = localizationFile;
577 + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "PreqbaThemeWxl"))
578 + {
579 + Value = localizationFile,
580 + });
581 }
582 }
583 }