aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Stega <mark2002@stega.us>2022-01-20 15:47:44 -0500
committerRob Mensching <rob@firegiant.com>2022-03-05 13:01:33 -0800
commit08b1dd325761edf6bdc2bca38d614611f3eaaa66 (patch)
tree65e245cf9b3d7f6eea86503ad2fbe6ad20366596
parentb6c0360f825c6f5dd11be04b4087a0a52d51a250 (diff)
downloadwix-08b1dd325761edf6bdc2bca38d614611f3eaaa66.tar.gz
wix-08b1dd325761edf6bdc2bca38d614611f3eaaa66.tar.bz2
wix-08b1dd325761edf6bdc2bca38d614611f3eaaa66.zip
Changed the coverter to use Messages rather than Errors
-rw-r--r--src/wix/WixToolset.Converters/WixConverter.cs213
1 files changed, 127 insertions, 86 deletions
diff --git a/src/wix/WixToolset.Converters/WixConverter.cs b/src/wix/WixToolset.Converters/WixConverter.cs
index 5dae29b7..183a7394 100644
--- a/src/wix/WixToolset.Converters/WixConverter.cs
+++ b/src/wix/WixToolset.Converters/WixConverter.cs
@@ -279,7 +279,7 @@ namespace WixToolset.Converters
279 279
280 private CustomTableTarget CustomTableSetting { get; } 280 private CustomTableTarget CustomTableSetting { get; }
281 281
282 private int Errors { get; set; } 282 private int Messages { get; set; }
283 283
284 private HashSet<ConverterTestType> ErrorsAsWarnings { get; set; } 284 private HashSet<ConverterTestType> ErrorsAsWarnings { get; set; }
285 285
@@ -301,8 +301,8 @@ namespace WixToolset.Converters
301 /// Convert a file. 301 /// Convert a file.
302 /// </summary> 302 /// </summary>
303 /// <param name="sourceFile">The file to convert.</param> 303 /// <param name="sourceFile">The file to convert.</param>
304 /// <param name="saveConvertedFile">Option to save the converted errors that are found.</param> 304 /// <param name="saveConvertedFile">Option to save the converted Messages that are found.</param>
305 /// <returns>The number of errors found.</returns> 305 /// <returns>The number of Messages found.</returns>
306 public int ConvertFile(string sourceFile, bool saveConvertedFile) 306 public int ConvertFile(string sourceFile, bool saveConvertedFile)
307 { 307 {
308 var document = this.OpenSourceFile(sourceFile); 308 var document = this.OpenSourceFile(sourceFile);
@@ -314,30 +314,30 @@ namespace WixToolset.Converters
314 314
315 this.ConvertDocument(document); 315 this.ConvertDocument(document);
316 316
317 // Fix errors if requested and necessary. 317 // Fix Messages if requested and necessary.
318 if (saveConvertedFile && 0 < this.Errors) 318 if (saveConvertedFile && 0 < this.Messages)
319 { 319 {
320 this.SaveDocument(document); 320 this.SaveDocument(document);
321 } 321 }
322 322
323 return this.Errors; 323 return this.Messages;
324 } 324 }
325 325
326 /// <summary> 326 /// <summary>
327 /// Convert a document. 327 /// Convert a document.
328 /// </summary> 328 /// </summary>
329 /// <param name="document">The document to convert.</param> 329 /// <param name="document">The document to convert.</param>
330 /// <returns>The number of errors found.</returns> 330 /// <returns>The number of Messages found.</returns>
331 public int ConvertDocument(XDocument document) 331 public int ConvertDocument(XDocument document)
332 { 332 {
333 // Reset the instance info. 333 // Reset the instance info.
334 this.Errors = 0; 334 this.Messages = 0;
335 this.SourceVersion = 0; 335 this.SourceVersion = 0;
336 this.Operation = ConvertOperation.Convert; 336 this.Operation = ConvertOperation.Convert;
337 337
338 // Remove the declaration. 338 // Remove the declaration.
339 if (null != document.Declaration 339 if (null != document.Declaration
340 && this.OnError(ConverterTestType.DeclarationPresent, null, "This file contains an XML declaration on the first line.")) 340 && this.OnInformation(ConverterTestType.DeclarationPresent, null, "This file contains an XML declaration on the first line."))
341 { 341 {
342 document.Declaration = null; 342 document.Declaration = null;
343 TrimLeadingText(document); 343 TrimLeadingText(document);
@@ -349,15 +349,15 @@ namespace WixToolset.Converters
349 this.ConvertNodes(document.Nodes(), 0); 349 this.ConvertNodes(document.Nodes(), 0);
350 this.RemoveUnusedNamespaces(document.Root); 350 this.RemoveUnusedNamespaces(document.Root);
351 351
352 return this.Errors; 352 return this.Messages;
353 } 353 }
354 354
355 /// <summary> 355 /// <summary>
356 /// Format a file. 356 /// Format a file.
357 /// </summary> 357 /// </summary>
358 /// <param name="sourceFile">The file to format.</param> 358 /// <param name="sourceFile">The file to format.</param>
359 /// <param name="saveConvertedFile">Option to save the format errors that are found.</param> 359 /// <param name="saveConvertedFile">Option to save the format Messages that are found.</param>
360 /// <returns>The number of errors found.</returns> 360 /// <returns>The number of Messages found.</returns>
361 public int FormatFile(string sourceFile, bool saveConvertedFile) 361 public int FormatFile(string sourceFile, bool saveConvertedFile)
362 { 362 {
363 var document = this.OpenSourceFile(sourceFile); 363 var document = this.OpenSourceFile(sourceFile);
@@ -369,30 +369,30 @@ namespace WixToolset.Converters
369 369
370 this.FormatDocument(document); 370 this.FormatDocument(document);
371 371
372 // Fix errors if requested and necessary. 372 // Fix Messages if requested and necessary.
373 if (saveConvertedFile && 0 < this.Errors) 373 if (saveConvertedFile && 0 < this.Messages)
374 { 374 {
375 this.SaveDocument(document); 375 this.SaveDocument(document);
376 } 376 }
377 377
378 return this.Errors; 378 return this.Messages;
379 } 379 }
380 380
381 /// <summary> 381 /// <summary>
382 /// Format a document. 382 /// Format a document.
383 /// </summary> 383 /// </summary>
384 /// <param name="document">The document to format.</param> 384 /// <param name="document">The document to format.</param>
385 /// <returns>The number of errors found.</returns> 385 /// <returns>The number of Messages found.</returns>
386 public int FormatDocument(XDocument document) 386 public int FormatDocument(XDocument document)
387 { 387 {
388 // Reset the instance info. 388 // Reset the instance info.
389 this.Errors = 0; 389 this.Messages = 0;
390 this.SourceVersion = 0; 390 this.SourceVersion = 0;
391 this.Operation = ConvertOperation.Format; 391 this.Operation = ConvertOperation.Format;
392 392
393 // Remove the declaration. 393 // Remove the declaration.
394 if (null != document.Declaration 394 if (null != document.Declaration
395 && this.OnError(ConverterTestType.DeclarationPresent, null, "This file contains an XML declaration on the first line.")) 395 && this.OnInformation(ConverterTestType.DeclarationPresent, null, "This file contains an XML declaration on the first line."))
396 { 396 {
397 document.Declaration = null; 397 document.Declaration = null;
398 TrimLeadingText(document); 398 TrimLeadingText(document);
@@ -402,7 +402,7 @@ namespace WixToolset.Converters
402 this.ConvertNodes(document.Nodes(), 0); 402 this.ConvertNodes(document.Nodes(), 0);
403 this.RemoveUnusedNamespaces(document.Root); 403 this.RemoveUnusedNamespaces(document.Root);
404 404
405 return this.Errors; 405 return this.Messages;
406 } 406 }
407 407
408 private XDocument OpenSourceFile(string sourceFile) 408 private XDocument OpenSourceFile(string sourceFile)
@@ -521,7 +521,7 @@ namespace WixToolset.Converters
521 { 521 {
522 var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect."; 522 var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect.";
523 523
524 if (this.OnError(testType, node, message)) 524 if (this.OnInformation(testType, node, message))
525 { 525 {
526 WixConverter.FixupWhitespace(this.IndentationAmount, level, whitespace); 526 WixConverter.FixupWhitespace(this.IndentationAmount, level, whitespace);
527 } 527 }
@@ -534,7 +534,7 @@ namespace WixToolset.Converters
534 { 534 {
535 var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect."; 535 var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect.";
536 536
537 if (this.OnError(testType, node, message)) 537 if (this.OnInformation(testType, node, message))
538 { 538 {
539 whitespace.Remove(); 539 whitespace.Remove();
540 } 540 }
@@ -563,7 +563,7 @@ namespace WixToolset.Converters
563 563
564 if (WixConverter.OldToNewNamespaceMapping.TryGetValue(declaration.Value, out var ns)) 564 if (WixConverter.OldToNewNamespaceMapping.TryGetValue(declaration.Value, out var ns))
565 { 565 {
566 if (this.OnError(ConverterTestType.XmlnsValueWrong, declaration, "The namespace '{0}' is out of date. It must be '{1}'.", declaration.Value, ns.NamespaceName)) 566 if (this.OnInformation(ConverterTestType.XmlnsValueWrong, declaration, "The namespace '{0}' is out of date. It must be '{1}'.", declaration.Value, ns.NamespaceName))
567 { 567 {
568 deprecatedToUpdatedNamespaces.Add(declaration.Value, ns); 568 deprecatedToUpdatedNamespaces.Add(declaration.Value, ns);
569 } 569 }
@@ -597,7 +597,7 @@ namespace WixToolset.Converters
597 { 597 {
598 var xUseUILanguages = element.Attribute(BalUseUILanguagesName); 598 var xUseUILanguages = element.Attribute(BalUseUILanguagesName);
599 if (xUseUILanguages != null && 599 if (xUseUILanguages != null &&
600 this.OnError(ConverterTestType.BalUseUILanguagesDeprecated, element, "bal:UseUILanguages is deprecated, 'true' is now the standard behavior.")) 600 this.OnInformation(ConverterTestType.BalUseUILanguagesDeprecated, element, "bal:UseUILanguages is deprecated, 'true' is now the standard behavior."))
601 { 601 {
602 xUseUILanguages.Remove(); 602 xUseUILanguages.Remove();
603 } 603 }
@@ -669,7 +669,7 @@ namespace WixToolset.Converters
669 669
670 bool CreateBADllElement(XObject node, out XElement xCreatedBADll) 670 bool CreateBADllElement(XObject node, out XElement xCreatedBADll)
671 { 671 {
672 var create = this.OnError(ConverterTestType.BootstrapperApplicationDll, node, "The bootstrapper application dll is now specified in the BootstrapperApplicationDll element."); 672 var create = this.OnInformation(ConverterTestType.BootstrapperApplicationDll, node, "The bootstrapper application dll is now specified in the BootstrapperApplicationDll element.");
673 xCreatedBADll = create ? new XElement(BootstrapperApplicationDllElementName) : null; 673 xCreatedBADll = create ? new XElement(BootstrapperApplicationDllElementName) : null;
674 return create; 674 return create;
675 } 675 }
@@ -679,7 +679,7 @@ namespace WixToolset.Converters
679 { 679 {
680 var xUseUILanguages = element.Attribute(BalUseUILanguagesName); 680 var xUseUILanguages = element.Attribute(BalUseUILanguagesName);
681 if (xUseUILanguages != null && 681 if (xUseUILanguages != null &&
682 this.OnError(ConverterTestType.BalUseUILanguagesDeprecated, element, "bal:UseUILanguages is deprecated, 'true' is now the standard behavior.")) 682 this.OnInformation(ConverterTestType.BalUseUILanguagesDeprecated, element, "bal:UseUILanguages is deprecated, 'true' is now the standard behavior."))
683 { 683 {
684 xUseUILanguages.Remove(); 684 xUseUILanguages.Remove();
685 } 685 }
@@ -781,7 +781,7 @@ namespace WixToolset.Converters
781 781
782 private void ConvertCatalogElement(XElement element) 782 private void ConvertCatalogElement(XElement element)
783 { 783 {
784 if (this.OnError(ConverterTestType.BundleSignatureValidationObsolete, element, "The Catalog element is obsolete. Signature validation is no longer supported. The element will be removed.")) 784 if (this.OnInformation(ConverterTestType.BundleSignatureValidationObsolete, element, "The Catalog element is obsolete. Signature validation is no longer supported. The element will be removed."))
785 { 785 {
786 element.Remove(); 786 element.Remove();
787 } 787 }
@@ -817,7 +817,7 @@ namespace WixToolset.Converters
817 var bootstrapperApplicationData = element.Attribute("BootstrapperApplicationData"); 817 var bootstrapperApplicationData = element.Attribute("BootstrapperApplicationData");
818 if (bootstrapperApplicationData?.Value == "no") 818 if (bootstrapperApplicationData?.Value == "no")
819 { 819 {
820 if (this.OnError(ConverterTestType.BootstrapperApplicationDataDeprecated, element, "The CustomTable element contains deprecated '{0}' attribute. Use the 'Unreal' attribute instead.", bootstrapperApplicationData.Name)) 820 if (this.OnInformation(ConverterTestType.BootstrapperApplicationDataDeprecated, element, "The CustomTable element contains deprecated '{0}' attribute. Use the 'Unreal' attribute instead.", bootstrapperApplicationData.Name))
821 { 821 {
822 bootstrapperApplicationData.Remove(); 822 bootstrapperApplicationData.Remove();
823 } 823 }
@@ -858,14 +858,14 @@ namespace WixToolset.Converters
858 switch (this.CustomTableSetting) 858 switch (this.CustomTableSetting)
859 { 859 {
860 case CustomTableTarget.Bundle: 860 case CustomTableTarget.Bundle:
861 if (this.OnError(ConverterTestType.CustomTableRef, element, "CustomTable elements that don't contain the table definition are now BundleCustomDataRef for Bundles.")) 861 if (this.OnInformation(ConverterTestType.CustomTableRef, element, "CustomTable elements that don't contain the table definition are now BundleCustomDataRef for Bundles."))
862 { 862 {
863 element.Name = WixConverter.BundleCustomDataRefElementName; 863 element.Name = WixConverter.BundleCustomDataRefElementName;
864 this.ConvertCustomTableElementToBundle(element); 864 this.ConvertCustomTableElementToBundle(element);
865 } 865 }
866 break; 866 break;
867 case CustomTableTarget.Msi: 867 case CustomTableTarget.Msi:
868 if (this.OnError(ConverterTestType.CustomTableRef, element, "CustomTable elements that don't contain the table definition are now CustomTableRef for MSI.")) 868 if (this.OnInformation(ConverterTestType.CustomTableRef, element, "CustomTable elements that don't contain the table definition are now CustomTableRef for MSI."))
869 { 869 {
870 element.Name = WixConverter.CustomTableRefElementName; 870 element.Name = WixConverter.CustomTableRefElementName;
871 } 871 }
@@ -925,7 +925,7 @@ namespace WixToolset.Converters
925 var action = UppercaseFirstChar(xCondition.Attribute("Action")?.Value); 925 var action = UppercaseFirstChar(xCondition.Attribute("Action")?.Value);
926 if (!String.IsNullOrEmpty(action) && 926 if (!String.IsNullOrEmpty(action) &&
927 TryGetInnerText(xCondition, out var text) && 927 TryGetInnerText(xCondition, out var text) &&
928 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}Condition' attribute instead.", xCondition.Name.LocalName, action)) 928 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}Condition' attribute instead.", xCondition.Name.LocalName, action))
929 { 929 {
930 element.Add(new XAttribute(action + "Condition", text)); 930 element.Add(new XAttribute(action + "Condition", text));
931 remove.Add(xCondition); 931 remove.Add(xCondition);
@@ -943,7 +943,7 @@ namespace WixToolset.Converters
943 var guid = element.Attribute("Guid"); 943 var guid = element.Attribute("Guid");
944 if (guid != null && guid.Value == "*") 944 if (guid != null && guid.Value == "*")
945 { 945 {
946 if (this.OnError(ConverterTestType.AutoGuidUnnecessary, element, "Using '*' for the Component Guid attribute is unnecessary. Remove the attribute to remove the redundancy.")) 946 if (this.OnInformation(ConverterTestType.AutoGuidUnnecessary, element, "Using '*' for the Component Guid attribute is unnecessary. Remove the attribute to remove the redundancy."))
947 { 947 {
948 guid.Remove(); 948 guid.Remove();
949 } 949 }
@@ -953,7 +953,7 @@ namespace WixToolset.Converters
953 if (xCondition != null) 953 if (xCondition != null)
954 { 954 {
955 if (TryGetInnerText(xCondition, out var text) && 955 if (TryGetInnerText(xCondition, out var text) &&
956 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName)) 956 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName))
957 { 957 {
958 element.Add(new XAttribute("Condition", text)); 958 element.Add(new XAttribute("Condition", text));
959 xCondition.Remove(); 959 xCondition.Remove();
@@ -971,7 +971,7 @@ namespace WixToolset.Converters
971 if (null != attribute) 971 if (null != attribute)
972 { 972 {
973 var shortName = attribute.Value; 973 var shortName = attribute.Value;
974 if (this.OnError(ConverterTestType.AssignDirectoryNameFromShortName, element, "The directory ShortName attribute is being renamed to Name since Name wasn't specified for value '{0}'", shortName)) 974 if (this.OnInformation(ConverterTestType.AssignDirectoryNameFromShortName, element, "The directory ShortName attribute is being renamed to Name since Name wasn't specified for value '{0}'", shortName))
975 { 975 {
976 element.Add(new XAttribute("Name", shortName)); 976 element.Add(new XAttribute("Name", shortName));
977 attribute.Remove(); 977 attribute.Remove();
@@ -982,7 +982,7 @@ namespace WixToolset.Converters
982 var id = element.Attribute("Id")?.Value; 982 var id = element.Attribute("Id")?.Value;
983 983
984 if (id == "TARGETDIR" && 984 if (id == "TARGETDIR" &&
985 this.OnError(ConverterTestType.TargetDirDeprecated, element, "The TARGETDIR directory should not longer be explicitly defined. Remove the Directory element with Id attribute 'TARGETDIR'.")) 985 this.OnInformation(ConverterTestType.TargetDirDeprecated, element, "The TARGETDIR directory should not longer be explicitly defined. Remove the Directory element with Id attribute 'TARGETDIR'."))
986 { 986 {
987 var parentElement = element.Parent; 987 var parentElement = element.Parent;
988 988
@@ -1007,7 +1007,7 @@ namespace WixToolset.Converters
1007 } 1007 }
1008 else if (id != null && 1008 else if (id != null &&
1009 WindowsInstallerStandard.IsStandardDirectory(id) && 1009 WindowsInstallerStandard.IsStandardDirectory(id) &&
1010 this.OnError(ConverterTestType.DefiningStandardDirectoryDeprecated, element, "Standard directories such as '{0}' should no longer be defined using the Directory element. Use the StandardDirectory element instead.", id)) 1010 this.OnInformation(ConverterTestType.DefiningStandardDirectoryDeprecated, element, "Standard directories such as '{0}' should no longer be defined using the Directory element. Use the StandardDirectory element instead.", id))
1011 { 1011 {
1012 element.Name = StandardDirectoryElementName; 1012 element.Name = StandardDirectoryElementName;
1013 1013
@@ -1022,7 +1022,7 @@ namespace WixToolset.Converters
1022 { 1022 {
1023 var xAbsent = element.Attribute("Absent"); 1023 var xAbsent = element.Attribute("Absent");
1024 if (xAbsent != null && 1024 if (xAbsent != null &&
1025 this.OnError(ConverterTestType.FeatureAbsentAttributeReplaced, element, "The Feature element's Absent attribute has been replaced with the AllowAbsent attribute. Use the 'AllowAbsent' attribute instead.")) 1025 this.OnInformation(ConverterTestType.FeatureAbsentAttributeReplaced, element, "The Feature element's Absent attribute has been replaced with the AllowAbsent attribute. Use the 'AllowAbsent' attribute instead."))
1026 { 1026 {
1027 if (xAbsent.Value == "disallow") 1027 if (xAbsent.Value == "disallow")
1028 { 1028 {
@@ -1035,12 +1035,12 @@ namespace WixToolset.Converters
1035 if (xAllowAdvertise != null) 1035 if (xAllowAdvertise != null)
1036 { 1036 {
1037 if ((xAllowAdvertise.Value == "system" || xAllowAdvertise.Value == "allow") && 1037 if ((xAllowAdvertise.Value == "system" || xAllowAdvertise.Value == "allow") &&
1038 this.OnError(ConverterTestType.FeatureAllowAdvertiseValueDeprecated, element, "The AllowAdvertise attribute's '{0}' value is deprecated. Set the value to 'yes' instead.", xAllowAdvertise.Value)) 1038 this.OnInformation(ConverterTestType.FeatureAllowAdvertiseValueDeprecated, element, "The AllowAdvertise attribute's '{0}' value is deprecated. Set the value to 'yes' instead.", xAllowAdvertise.Value))
1039 { 1039 {
1040 xAllowAdvertise.Value = "yes"; 1040 xAllowAdvertise.Value = "yes";
1041 } 1041 }
1042 else if (xAllowAdvertise.Value == "disallow" && 1042 else if (xAllowAdvertise.Value == "disallow" &&
1043 this.OnError(ConverterTestType.FeatureAllowAdvertiseValueDeprecated, element, "The AllowAdvertise attribute's '{0}' value is deprecated. Remove the value instead.", xAllowAdvertise.Value)) 1043 this.OnInformation(ConverterTestType.FeatureAllowAdvertiseValueDeprecated, element, "The AllowAdvertise attribute's '{0}' value is deprecated. Remove the value instead.", xAllowAdvertise.Value))
1044 { 1044 {
1045 xAllowAdvertise.Remove(); 1045 xAllowAdvertise.Remove();
1046 } 1046 }
@@ -1052,7 +1052,7 @@ namespace WixToolset.Converters
1052 var level = xCondition.Attribute("Level")?.Value; 1052 var level = xCondition.Attribute("Level")?.Value;
1053 if (!String.IsNullOrEmpty(level) && 1053 if (!String.IsNullOrEmpty(level) &&
1054 TryGetInnerText(xCondition, out var text) && 1054 TryGetInnerText(xCondition, out var text) &&
1055 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Level' element instead.", xCondition.Name.LocalName)) 1055 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Level' element instead.", xCondition.Name.LocalName))
1056 { 1056 {
1057 xCondition.AddAfterSelf(new XElement(LevelElementName, 1057 xCondition.AddAfterSelf(new XElement(LevelElementName,
1058 new XAttribute("Value", level), 1058 new XAttribute("Value", level),
@@ -1078,7 +1078,7 @@ namespace WixToolset.Converters
1078 { 1078 {
1079 var name = Path.GetFileName(attribute.Value); 1079 var name = Path.GetFileName(attribute.Value);
1080 1080
1081 if (this.OnError(ConverterTestType.AssignAnonymousFileId, element, "The file id is being updated to '{0}' to ensure it remains the same as the v3 default", name)) 1081 if (this.OnInformation(ConverterTestType.AssignAnonymousFileId, element, "The file id is being updated to '{0}' to ensure it remains the same as the v3 default", name))
1082 { 1082 {
1083 IEnumerable<XAttribute> attributes = element.Attributes().ToList(); 1083 IEnumerable<XAttribute> attributes = element.Attributes().ToList();
1084 element.RemoveAttributes(); 1084 element.RemoveAttributes();
@@ -1099,7 +1099,7 @@ namespace WixToolset.Converters
1099 1099
1100 if (!String.IsNullOrEmpty(message) && 1100 if (!String.IsNullOrEmpty(message) &&
1101 TryGetInnerText(xCondition, out var text) && 1101 TryGetInnerText(xCondition, out var text) &&
1102 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName)) 1102 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName))
1103 { 1103 {
1104 xCondition.AddAfterSelf(new XElement(LaunchElementName, 1104 xCondition.AddAfterSelf(new XElement(LaunchElementName,
1105 new XAttribute("Condition", text), 1105 new XAttribute("Condition", text),
@@ -1133,7 +1133,7 @@ namespace WixToolset.Converters
1133 var attribute = element.Attribute(attributeName); 1133 var attribute = element.Attribute(attributeName);
1134 1134
1135 if (attribute != null && 1135 if (attribute != null &&
1136 this.OnError(ConverterTestType.RenameExePackageCommandToArguments, element, "The {0} element {1} attribute has been renamed {2}.", element.Name.LocalName, attribute.Name.LocalName, newName)) 1136 this.OnInformation(ConverterTestType.RenameExePackageCommandToArguments, element, "The {0} element {1} attribute has been renamed {2}.", element.Name.LocalName, attribute.Name.LocalName, newName))
1137 { 1137 {
1138 element.Add(new XAttribute(newName, attribute.Value)); 1138 element.Add(new XAttribute(newName, attribute.Value));
1139 attribute.Remove(); 1139 attribute.Remove();
@@ -1147,7 +1147,7 @@ namespace WixToolset.Converters
1147 if (xCondition != null) 1147 if (xCondition != null)
1148 { 1148 {
1149 if (TryGetInnerText(xCondition, out var text) && 1149 if (TryGetInnerText(xCondition, out var text) &&
1150 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName)) 1150 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName))
1151 { 1151 {
1152 element.Add(new XAttribute("Condition", text)); 1152 element.Add(new XAttribute("Condition", text));
1153 xCondition.Remove(); 1153 xCondition.Remove();
@@ -1160,7 +1160,7 @@ namespace WixToolset.Converters
1160 private void ConvertModuleElement(XElement element) 1160 private void ConvertModuleElement(XElement element)
1161 { 1161 {
1162 if (element.Attribute("Guid") == null // skip already-converted Module elements 1162 if (element.Attribute("Guid") == null // skip already-converted Module elements
1163 && this.OnError(ConverterTestType.ModuleAndPackageRenamed, element, "The Module and Package elements have been renamed and reorganized for simplicity.")) 1163 && this.OnInformation(ConverterTestType.ModuleAndPackageRenamed, element, "The Module and Package elements have been renamed and reorganized for simplicity."))
1164 { 1164 {
1165 var xModule = element; 1165 var xModule = element;
1166 1166
@@ -1172,7 +1172,7 @@ namespace WixToolset.Converters
1172 var xInstallerVersion = xSummaryInformation.Attribute("InstallerVersion"); 1172 var xInstallerVersion = xSummaryInformation.Attribute("InstallerVersion");
1173 if (this.SourceVersion < 4 && xInstallerVersion == null) 1173 if (this.SourceVersion < 4 && xInstallerVersion == null)
1174 { 1174 {
1175 this.OnError(ConverterTestType.InstallerVersionBehaviorChange, element, "Breaking change: The default value for Package/@InstallerVersion has been changed to '500' regardless of build platform. If you need a lower version, set it manually in the Module element."); 1175 this.OnInformation(ConverterTestType.InstallerVersionBehaviorChange, element, "Breaking change: The default value for Package/@InstallerVersion has been changed to '500' regardless of build platform. If you need a lower version, set it manually in the Module element.");
1176 } 1176 }
1177 1177
1178 RemoveAttribute(xSummaryInformation, "AdminImage"); 1178 RemoveAttribute(xSummaryInformation, "AdminImage");
@@ -1205,7 +1205,7 @@ namespace WixToolset.Converters
1205 var id = element.Attribute("Id"); 1205 var id = element.Attribute("Id");
1206 if (id != null && id.Value == "*") 1206 if (id != null && id.Value == "*")
1207 { 1207 {
1208 if (this.OnError(ConverterTestType.AutoGuidUnnecessary, element, "Using '*' for the Product Id attribute is unnecessary. Remove the attribute to remove the redundancy.")) 1208 if (this.OnInformation(ConverterTestType.AutoGuidUnnecessary, element, "Using '*' for the Product Id attribute is unnecessary. Remove the attribute to remove the redundancy."))
1209 { 1209 {
1210 id.Remove(); 1210 id.Remove();
1211 } 1211 }
@@ -1218,7 +1218,7 @@ namespace WixToolset.Converters
1218 1218
1219 if (!String.IsNullOrEmpty(message) && 1219 if (!String.IsNullOrEmpty(message) &&
1220 TryGetInnerText(xCondition, out var text) && 1220 TryGetInnerText(xCondition, out var text) &&
1221 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName)) 1221 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName))
1222 { 1222 {
1223 xCondition.AddAfterSelf(new XElement(LaunchElementName, 1223 xCondition.AddAfterSelf(new XElement(LaunchElementName,
1224 new XAttribute("Condition", text), 1224 new XAttribute("Condition", text),
@@ -1235,7 +1235,7 @@ namespace WixToolset.Converters
1235 xMediaTemplate.Remove(); 1235 xMediaTemplate.Remove();
1236 } 1236 }
1237 1237
1238 if (this.OnError(ConverterTestType.ProductAndPackageRenamed, element, "The Product and Package elements have been renamed and reorganized for simplicity.")) 1238 if (this.OnInformation(ConverterTestType.ProductAndPackageRenamed, element, "The Product and Package elements have been renamed and reorganized for simplicity."))
1239 { 1239 {
1240 var xPackage = element; 1240 var xPackage = element;
1241 xPackage.Name = PackageElementName; 1241 xPackage.Name = PackageElementName;
@@ -1248,7 +1248,7 @@ namespace WixToolset.Converters
1248 var xInstallerVersion = xSummaryInformation.Attribute("InstallerVersion"); 1248 var xInstallerVersion = xSummaryInformation.Attribute("InstallerVersion");
1249 if (this.SourceVersion < 4 && xInstallerVersion == null) 1249 if (this.SourceVersion < 4 && xInstallerVersion == null)
1250 { 1250 {
1251 this.OnError(ConverterTestType.InstallerVersionBehaviorChange, element, "Breaking change: The default value for Package/@InstallerVersion has been changed to '500' regardless of build platform. If you need a lower version, set it manually in the Package element."); 1251 this.OnInformation(ConverterTestType.InstallerVersionBehaviorChange, element, "Breaking change: The default value for Package/@InstallerVersion has been changed to '500' regardless of build platform. If you need a lower version, set it manually in the Package element.");
1252 } 1252 }
1253 1253
1254 if (xSummaryInformation.Attribute("Compressed") == null) 1254 if (xSummaryInformation.Attribute("Compressed") == null)
@@ -1497,7 +1497,7 @@ namespace WixToolset.Converters
1497 } 1497 }
1498 1498
1499 if (!String.IsNullOrEmpty(newElementName) 1499 if (!String.IsNullOrEmpty(newElementName)
1500 && this.OnError(ConverterTestType.ReferencesReplaced, element, "UI, custom action, and property reference {0} has been replaced with strongly-typed element.", id)) 1500 && this.OnInformation(ConverterTestType.ReferencesReplaced, element, "UI, custom action and property reference {0} have been replaced with strongly-typed elements.", id))
1501 { 1501 {
1502 element.AddAfterSelf(new XElement(WixUtilNamespace + newElementName)); 1502 element.AddAfterSelf(new XElement(WixUtilNamespace + newElementName));
1503 element.Remove(); 1503 element.Remove();
@@ -1510,7 +1510,7 @@ namespace WixToolset.Converters
1510 1510
1511 var xCondition = element.Attribute("Condition"); 1511 var xCondition = element.Attribute("Condition");
1512 if (xCondition?.Value == "1" && 1512 if (xCondition?.Value == "1" &&
1513 this.OnError(ConverterTestType.PublishConditionOneUnnecessary, element, "Adding Condition='1' on {0} elements is no longer necessary. Remove the Condition attribute.", xCondition.Name.LocalName)) 1513 this.OnInformation(ConverterTestType.PublishConditionOneUnnecessary, element, "Adding Condition='1' on {0} elements is no longer necessary. Remove the Condition attribute.", xCondition.Name.LocalName))
1514 { 1514 {
1515 xCondition.Remove(); 1515 xCondition.Remove();
1516 } 1516 }
@@ -1523,7 +1523,7 @@ namespace WixToolset.Converters
1523 var xAction = element.Attribute("Action"); 1523 var xAction = element.Attribute("Action");
1524 1524
1525 if (xAction != null 1525 if (xAction != null
1526 && this.OnError(ConverterTestType.RegistryKeyActionObsolete, element, "The RegistryKey element's Action attribute is obsolete. Action='create' will be converted to ForceCreateOnInstall='yes'. Action='createAndRemoveOnUninstall' will be converted to ForceCreateOnInstall='yes' and ForceDeleteOnUninstall='yes'.")) 1526 && this.OnInformation(ConverterTestType.RegistryKeyActionObsolete, element, "The RegistryKey element's Action attribute is obsolete. Action='create' will be converted to ForceCreateOnInstall='yes'. Action='createAndRemoveOnUninstall' will be converted to ForceCreateOnInstall='yes' and ForceDeleteOnUninstall='yes'."))
1527 { 1527 {
1528 switch (xAction?.Value) 1528 switch (xAction?.Value)
1529 { 1529 {
@@ -1545,7 +1545,7 @@ namespace WixToolset.Converters
1545 var xParent = element.Parent; 1545 var xParent = element.Parent;
1546 1546
1547 if (xParent.Name == ExePackageElementName && 1547 if (xParent.Name == ExePackageElementName &&
1548 this.OnError(ConverterTestType.RemotePayloadRenamed, element, "The RemotePayload element has been renamed. Use the 'ExePackagePayload' instead.")) 1548 this.OnInformation(ConverterTestType.RemotePayloadRenamed, element, "The RemotePayload element has been renamed. Use the 'ExePackagePayload' instead."))
1549 { 1549 {
1550 element.Name = ExePackagePayloadElementName; 1550 element.Name = ExePackagePayloadElementName;
1551 } 1551 }
@@ -1557,7 +1557,7 @@ namespace WixToolset.Converters
1557 1557
1558 var xName = xParent.Attribute("Name"); 1558 var xName = xParent.Attribute("Name");
1559 if (xName != null && 1559 if (xName != null &&
1560 this.OnError(ConverterTestType.NameAttributeMovedToRemotePayload, xParent, "The Name attribute must be specified on the child XxxPackagePayload element when using a remote payload.")) 1560 this.OnInformation(ConverterTestType.NameAttributeMovedToRemotePayload, xParent, "The Name attribute must be specified on the child XxxPackagePayload element when using a remote payload."))
1561 { 1561 {
1562 element.SetAttributeValue("Name", xName.Value); 1562 element.SetAttributeValue("Name", xName.Value);
1563 xName.Remove(); 1563 xName.Remove();
@@ -1565,7 +1565,7 @@ namespace WixToolset.Converters
1565 1565
1566 var xDownloadUrl = xParent.Attribute("DownloadUrl"); 1566 var xDownloadUrl = xParent.Attribute("DownloadUrl");
1567 if (xDownloadUrl != null && 1567 if (xDownloadUrl != null &&
1568 this.OnError(ConverterTestType.DownloadUrlAttributeMovedToRemotePayload, xParent, "The DownloadUrl attribute must be specified on the child XxxPackagePayload element when using a remote payload.")) 1568 this.OnInformation(ConverterTestType.DownloadUrlAttributeMovedToRemotePayload, xParent, "The DownloadUrl attribute must be specified on the child XxxPackagePayload element when using a remote payload."))
1569 { 1569 {
1570 element.SetAttributeValue("DownloadUrl", xDownloadUrl.Value); 1570 element.SetAttributeValue("DownloadUrl", xDownloadUrl.Value);
1571 xDownloadUrl.Remove(); 1571 xDownloadUrl.Remove();
@@ -1573,12 +1573,12 @@ namespace WixToolset.Converters
1573 1573
1574 var xCompressed = xParent.Attribute("Compressed"); 1574 var xCompressed = xParent.Attribute("Compressed");
1575 if (xCompressed != null && 1575 if (xCompressed != null &&
1576 this.OnError(ConverterTestType.CompressedAttributeUnnecessaryForRemotePayload, xParent, "The Compressed attribute should not be specified when using a remote payload.")) 1576 this.OnInformation(ConverterTestType.CompressedAttributeUnnecessaryForRemotePayload, xParent, "The Compressed attribute should not be specified when using a remote payload."))
1577 { 1577 {
1578 xCompressed.Remove(); 1578 xCompressed.Remove();
1579 } 1579 }
1580 1580
1581 this.OnError(ConverterTestType.BurnHashAlgorithmChanged, element, "The hash algorithm for bundles changed from SHA1 to SHA512."); 1581 this.OnInformation(ConverterTestType.BurnHashAlgorithmChanged, element, "The hash algorithm for bundles changed from SHA1 to SHA512.");
1582 1582
1583 this.RemoveAttributeIfPresent(element, "CertificatePublicKey", ConverterTestType.BundleSignatureValidationObsolete, "The {0} element contains obsolete '{1}' attribute. Signature validation is no longer supported. The attribute will be removed."); 1583 this.RemoveAttributeIfPresent(element, "CertificatePublicKey", ConverterTestType.BundleSignatureValidationObsolete, "The {0} element contains obsolete '{1}' attribute. Signature validation is no longer supported. The attribute will be removed.");
1584 this.RemoveAttributeIfPresent(element, "CertificateThumbprint", ConverterTestType.BundleSignatureValidationObsolete, "The {0} element contains obsolete '{1}' attribute. Signature validation is no longer supported. The attribute will be removed."); 1584 this.RemoveAttributeIfPresent(element, "CertificateThumbprint", ConverterTestType.BundleSignatureValidationObsolete, "The {0} element contains obsolete '{1}' attribute. Signature validation is no longer supported. The attribute will be removed.");
@@ -1617,7 +1617,7 @@ namespace WixToolset.Converters
1617 } 1617 }
1618 1618
1619 if (element.Parent.Name == ComponentElementName && 1619 if (element.Parent.Name == ComponentElementName &&
1620 this.OnError(ConverterTestType.IntegratedDependencyNamespace, element, "The Provides element has been integrated into the WiX v4 namespace. Add the 'Check' attribute from the WixDependency.wixext to match v3 runtime behavior.")) 1620 this.OnInformation(ConverterTestType.IntegratedDependencyNamespace, element, "The Provides element has been integrated into the WiX v4 namespace. Add the 'Check' attribute from the WixDependency.wixext to match v3 runtime behavior."))
1621 { 1621 {
1622 element.Add(new XAttribute(DependencyCheckAttributeName, "yes")); 1622 element.Add(new XAttribute(DependencyCheckAttributeName, "yes"));
1623 } 1623 }
@@ -1625,14 +1625,14 @@ namespace WixToolset.Converters
1625 1625
1626 private void ConvertRequiresElement(XElement element) 1626 private void ConvertRequiresElement(XElement element)
1627 { 1627 {
1628 if (this.OnError(ConverterTestType.IntegratedDependencyNamespace, element, "The Requires element has been integrated into the WiX v4 namespace. Remove the namespace.")) 1628 if (this.OnInformation(ConverterTestType.IntegratedDependencyNamespace, element, "The Requires element has been integrated into the WiX v4 namespace. Remove the namespace."))
1629 { 1629 {
1630 element.Name = RequiresElementName; 1630 element.Name = RequiresElementName;
1631 } 1631 }
1632 1632
1633 if (element.Parent.Name == ProvidesElementName && 1633 if (element.Parent.Name == ProvidesElementName &&
1634 element.Parent.Parent?.Name == ComponentElementName && 1634 element.Parent.Parent?.Name == ComponentElementName &&
1635 this.OnError(ConverterTestType.IntegratedDependencyNamespace, element, "The Requires element has been integrated into the WiX v4 namespace. Add the 'Enforce' attribute from the WixDependency.wixext to match v3 runtime behavior.")) 1635 this.OnInformation(ConverterTestType.IntegratedDependencyNamespace, element, "The Requires element has been integrated into the WiX v4 namespace. Add the 'Enforce' attribute from the WixDependency.wixext to match v3 runtime behavior."))
1636 { 1636 {
1637 element.Add(new XAttribute(DependencyEnforceAttributeName, "yes")); 1637 element.Add(new XAttribute(DependencyEnforceAttributeName, "yes"));
1638 } 1638 }
@@ -1640,14 +1640,14 @@ namespace WixToolset.Converters
1640 1640
1641 private void ConvertRequiresRefElement(XElement element) 1641 private void ConvertRequiresRefElement(XElement element)
1642 { 1642 {
1643 if (this.OnError(ConverterTestType.IntegratedDependencyNamespace, element, "The RequiresRef element has been integrated into the WiX v4 namespace. Remove the namespace.")) 1643 if (this.OnInformation(ConverterTestType.IntegratedDependencyNamespace, element, "The RequiresRef element has been integrated into the WiX v4 namespace. Remove the namespace."))
1644 { 1644 {
1645 element.Name = RequiresRefElementName; 1645 element.Name = RequiresRefElementName;
1646 } 1646 }
1647 1647
1648 if (element.Parent.Name == ProvidesElementName && 1648 if (element.Parent.Name == ProvidesElementName &&
1649 element.Parent.Parent?.Name == ComponentElementName && 1649 element.Parent.Parent?.Name == ComponentElementName &&
1650 this.OnError(ConverterTestType.IntegratedDependencyNamespace, element, "The RequiresRef element has been integrated into the WiX v4 namespace. Add the 'Enforce' attribute from the WixDependency.wixext to match v3 runtime behavior.")) 1650 this.OnInformation(ConverterTestType.IntegratedDependencyNamespace, element, "The RequiresRef element has been integrated into the WiX v4 namespace. Add the 'Enforce' attribute from the WixDependency.wixext to match v3 runtime behavior."))
1651 { 1651 {
1652 element.Add(new XAttribute(DependencyEnforceAttributeName, "yes")); 1652 element.Add(new XAttribute(DependencyEnforceAttributeName, "yes"));
1653 } 1653 }
@@ -1658,7 +1658,7 @@ namespace WixToolset.Converters
1658 var suppressSignatureValidation = element.Attribute("SuppressSignatureValidation"); 1658 var suppressSignatureValidation = element.Attribute("SuppressSignatureValidation");
1659 1659
1660 if (null != suppressSignatureValidation 1660 if (null != suppressSignatureValidation
1661 && this.OnError(ConverterTestType.BundleSignatureValidationObsolete, element, "The chain package element contains obsolete '{0}' attribute. Signature validation is no longer supported. The attribute will be removed.", suppressSignatureValidation.Name)) 1661 && this.OnInformation(ConverterTestType.BundleSignatureValidationObsolete, element, "The chain package element contains obsolete '{0}' attribute. Signature validation is no longer supported. The attribute will be removed.", suppressSignatureValidation.Name))
1662 { 1662 {
1663 suppressSignatureValidation.Remove(); 1663 suppressSignatureValidation.Remove();
1664 } 1664 }
@@ -1666,7 +1666,7 @@ namespace WixToolset.Converters
1666 1666
1667 private void ConvertTagElement(XElement element) 1667 private void ConvertTagElement(XElement element)
1668 { 1668 {
1669 if (this.OnError(ConverterTestType.TagElementRenamed, element, "The Tag element has been renamed. Use the 'SoftwareTag' element instead.")) 1669 if (this.OnInformation(ConverterTestType.TagElementRenamed, element, "The Tag element has been renamed. Use the 'SoftwareTag' element instead."))
1670 { 1670 {
1671 element.Name = SoftwareTagElementName; 1671 element.Name = SoftwareTagElementName;
1672 } 1672 }
@@ -1678,7 +1678,7 @@ namespace WixToolset.Converters
1678 1678
1679 private void ConvertTagRefElement(XElement element) 1679 private void ConvertTagRefElement(XElement element)
1680 { 1680 {
1681 if (this.OnError(ConverterTestType.TagRefElementRenamed, element, "The TagRef element has been renamed. Use the 'SoftwareTagRef' element instead.")) 1681 if (this.OnInformation(ConverterTestType.TagRefElementRenamed, element, "The TagRef element has been renamed. Use the 'SoftwareTagRef' element instead."))
1682 { 1682 {
1683 element.Name = SoftwareTagRefElementName; 1683 element.Name = SoftwareTagRefElementName;
1684 } 1684 }
@@ -1711,7 +1711,7 @@ namespace WixToolset.Converters
1711 private void ConvertCustomActionElement(XElement xCustomAction) 1711 private void ConvertCustomActionElement(XElement xCustomAction)
1712 { 1712 {
1713 var xBinaryKey = xCustomAction.Attribute("BinaryKey"); 1713 var xBinaryKey = xCustomAction.Attribute("BinaryKey");
1714 if (xBinaryKey != null && this.OnError(ConverterTestType.CustomActionKeysAreNowRefs, xCustomAction, "The CustomAction attributes have been renamed from BinaryKey and FileKey to BinaryRef and FileRef.")) 1714 if (xBinaryKey != null && this.OnInformation(ConverterTestType.CustomActionKeysAreNowRefs, xCustomAction, "The CustomAction attributes have been renamed from BinaryKey and FileKey to BinaryRef and FileRef."))
1715 { 1715 {
1716 xCustomAction.SetAttributeValue("BinaryRef", xBinaryKey.Value); 1716 xCustomAction.SetAttributeValue("BinaryRef", xBinaryKey.Value);
1717 xBinaryKey.Remove(); 1717 xBinaryKey.Remove();
@@ -1719,7 +1719,7 @@ namespace WixToolset.Converters
1719 } 1719 }
1720 1720
1721 var xFileKey = xCustomAction.Attribute("FileKey"); 1721 var xFileKey = xCustomAction.Attribute("FileKey");
1722 if (xFileKey != null && this.OnError(ConverterTestType.CustomActionKeysAreNowRefs, xCustomAction, "The CustomAction attributes have been renamed from BinaryKey and FileKey to BinaryRef and FileRef.")) 1722 if (xFileKey != null && this.OnInformation(ConverterTestType.CustomActionKeysAreNowRefs, xCustomAction, "The CustomAction attributes have been renamed from BinaryKey and FileKey to BinaryRef and FileRef."))
1723 { 1723 {
1724 xCustomAction.SetAttributeValue("FileRef", xFileKey.Value); 1724 xCustomAction.SetAttributeValue("FileRef", xFileKey.Value);
1725 xFileKey.Remove(); 1725 xFileKey.Remove();
@@ -1727,7 +1727,7 @@ namespace WixToolset.Converters
1727 1727
1728 if (xBinaryKey?.Value == "WixCA" || xBinaryKey?.Value == "UtilCA") 1728 if (xBinaryKey?.Value == "WixCA" || xBinaryKey?.Value == "UtilCA")
1729 { 1729 {
1730 if (this.OnError(ConverterTestType.WixCABinaryIdRenamed, xCustomAction, "The WixCA custom action DLL Binary table id has been renamed. Use the id 'Wix4UtilCA_X86' instead.")) 1730 if (this.OnInformation(ConverterTestType.WixCABinaryIdRenamed, xCustomAction, "The WixCA custom action DLL Binary table id has been renamed. Use the id 'Wix4UtilCA_X86' instead."))
1731 { 1731 {
1732 xBinaryKey.Value = "Wix4UtilCA_X86"; 1732 xBinaryKey.Value = "Wix4UtilCA_X86";
1733 } 1733 }
@@ -1735,7 +1735,7 @@ namespace WixToolset.Converters
1735 1735
1736 if (xBinaryKey?.Value == "WixCA_x64" || xBinaryKey?.Value == "UtilCA_x64") 1736 if (xBinaryKey?.Value == "WixCA_x64" || xBinaryKey?.Value == "UtilCA_x64")
1737 { 1737 {
1738 if (this.OnError(ConverterTestType.WixCABinaryIdRenamed, xCustomAction, "The WixCA_x64 custom action DLL Binary table id has been renamed. Use the id 'Wix4UtilCA_X64' instead.")) 1738 if (this.OnInformation(ConverterTestType.WixCABinaryIdRenamed, xCustomAction, "The WixCA_x64 custom action DLL Binary table id has been renamed. Use the id 'Wix4UtilCA_X64' instead."))
1739 { 1739 {
1740 xBinaryKey.Value = "Wix4UtilCA_X64"; 1740 xBinaryKey.Value = "Wix4UtilCA_X64";
1741 } 1741 }
@@ -1745,7 +1745,7 @@ namespace WixToolset.Converters
1745 1745
1746 if (xDllEntry?.Value == "CAQuietExec" || xDllEntry?.Value == "CAQuietExec64") 1746 if (xDllEntry?.Value == "CAQuietExec" || xDllEntry?.Value == "CAQuietExec64")
1747 { 1747 {
1748 if (this.OnError(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The CAQuietExec and CAQuietExec64 custom action ids have been renamed. Use the ids 'WixQuietExec' and 'WixQuietExec64' instead.")) 1748 if (this.OnInformation(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The CAQuietExec and CAQuietExec64 custom action ids have been renamed. Use the ids 'WixQuietExec' and 'WixQuietExec64' instead."))
1749 { 1749 {
1750 xDllEntry.Value = xDllEntry.Value.Replace("CAQuietExec", "WixQuietExec"); 1750 xDllEntry.Value = xDllEntry.Value.Replace("CAQuietExec", "WixQuietExec");
1751 } 1751 }
@@ -1755,7 +1755,7 @@ namespace WixToolset.Converters
1755 1755
1756 if (xProperty?.Value == "QtExecCmdLine" || xProperty?.Value == "QtExec64CmdLine") 1756 if (xProperty?.Value == "QtExecCmdLine" || xProperty?.Value == "QtExec64CmdLine")
1757 { 1757 {
1758 if (this.OnError(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The QtExecCmdLine and QtExec64CmdLine property ids have been renamed. Use the ids 'WixQuietExecCmdLine' and 'WixQuietExec64CmdLine' instead.")) 1758 if (this.OnInformation(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The QtExecCmdLine and QtExec64CmdLine property ids have been renamed. Use the ids 'WixQuietExecCmdLine' and 'WixQuietExec64CmdLine' instead."))
1759 { 1759 {
1760 xProperty.Value = xProperty.Value.Replace("QtExec", "WixQuietExec"); 1760 xProperty.Value = xProperty.Value.Replace("QtExec", "WixQuietExec");
1761 } 1761 }
@@ -1765,7 +1765,7 @@ namespace WixToolset.Converters
1765 1765
1766 if (xScript != null && TryGetInnerText(xCustomAction, out var scriptText)) 1766 if (xScript != null && TryGetInnerText(xCustomAction, out var scriptText))
1767 { 1767 {
1768 if (this.OnError(ConverterTestType.InnerTextDeprecated, xCustomAction, "Using {0} element text is deprecated. Extract the text to a file and use the 'ScriptSourceFile' attribute to reference it.", xCustomAction.Name.LocalName)) 1768 if (this.OnInformation(ConverterTestType.InnerTextDeprecated, xCustomAction, "Using {0} element text is deprecated. Extract the text to a file and use the 'ScriptSourceFile' attribute to reference it.", xCustomAction.Name.LocalName))
1769 { 1769 {
1770 var scriptFolder = Path.GetDirectoryName(this.SourceFile) ?? String.Empty; 1770 var scriptFolder = Path.GetDirectoryName(this.SourceFile) ?? String.Empty;
1771 var id = xCustomAction.Attribute("Id")?.Value ?? Guid.NewGuid().ToString("N"); 1771 var id = xCustomAction.Attribute("Id")?.Value ?? Guid.NewGuid().ToString("N");
@@ -1789,13 +1789,13 @@ namespace WixToolset.Converters
1789 if (xType == null) 1789 if (xType == null)
1790 { 1790 {
1791 if (WasImplicitlyStringTyped(xValue?.Value) && 1791 if (WasImplicitlyStringTyped(xValue?.Value) &&
1792 this.OnError(ConverterTestType.AssignVariableTypeFormatted, xVariable, "The \"string\" variable type now denotes a literal string. Use \"formatted\" to keep the previous behavior.")) 1792 this.OnInformation(ConverterTestType.AssignVariableTypeFormatted, xVariable, "The \"string\" variable type now denotes a literal string. Use \"formatted\" to keep the previous behavior."))
1793 { 1793 {
1794 xVariable.Add(new XAttribute("Type", "formatted")); 1794 xVariable.Add(new XAttribute("Type", "formatted"));
1795 } 1795 }
1796 } 1796 }
1797 else if (xType.Value == "string" && 1797 else if (xType.Value == "string" &&
1798 this.OnError(ConverterTestType.AssignVariableTypeFormatted, xVariable, "The \"string\" variable type now denotes a literal string. Use \"formatted\" to keep the previous behavior.")) 1798 this.OnInformation(ConverterTestType.AssignVariableTypeFormatted, xVariable, "The \"string\" variable type now denotes a literal string. Use \"formatted\" to keep the previous behavior."))
1799 { 1799 {
1800 xType.Value = "formatted"; 1800 xType.Value = "formatted";
1801 } 1801 }
@@ -1808,7 +1808,7 @@ namespace WixToolset.Converters
1808 1808
1809 if (xId.Value == "QtExecCmdTimeout") 1809 if (xId.Value == "QtExecCmdTimeout")
1810 { 1810 {
1811 this.OnError(ConverterTestType.QtExecCmdTimeoutAmbiguous, xProperty, "QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout."); 1811 this.OnInformation(ConverterTestType.QtExecCmdTimeoutAmbiguous, xProperty, "QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout.");
1812 } 1812 }
1813 1813
1814 this.ConvertInnerTextToAttribute(xProperty, "Value"); 1814 this.ConvertInnerTextToAttribute(xProperty, "Value");
@@ -1823,7 +1823,7 @@ namespace WixToolset.Converters
1823 var inheritable = element.Parent.Name == CreateFolderElementName; 1823 var inheritable = element.Parent.Name == CreateFolderElementName;
1824 if (!inheritable) 1824 if (!inheritable)
1825 { 1825 {
1826 if (this.OnError(ConverterTestType.AssignPermissionExInheritable, element, "The PermissionEx Inheritable attribute is being set to 'no' to ensure it remains the same as the v3 default.")) 1826 if (this.OnInformation(ConverterTestType.AssignPermissionExInheritable, element, "The PermissionEx Inheritable attribute is being set to 'no' to ensure it remains the same as the v3 default."))
1827 { 1827 {
1828 element.Add(new XAttribute("Inheritable", "no")); 1828 element.Add(new XAttribute("Inheritable", "no"));
1829 } 1829 }
@@ -1854,7 +1854,7 @@ namespace WixToolset.Converters
1854 /// <returns>The converted element.</returns> 1854 /// <returns>The converted element.</returns>
1855 private void ConvertElementWithoutNamespace(XElement element) 1855 private void ConvertElementWithoutNamespace(XElement element)
1856 { 1856 {
1857 if (this.OnError(ConverterTestType.XmlnsMissing, element, "The xmlns attribute is missing. It must be present with a value of '{0}'.", WixNamespace.NamespaceName)) 1857 if (this.OnInformation(ConverterTestType.XmlnsMissing, element, "The xmlns attribute is missing. It must be present with a value of '{0}'.", WixNamespace.NamespaceName))
1858 { 1858 {
1859 element.Name = WixNamespace.GetName(element.Name.LocalName); 1859 element.Name = WixNamespace.GetName(element.Name.LocalName);
1860 1860
@@ -1870,7 +1870,7 @@ namespace WixToolset.Converters
1870 private void ConvertInnerTextToAttribute(XElement element, string attributeName) 1870 private void ConvertInnerTextToAttribute(XElement element, string attributeName)
1871 { 1871 {
1872 if (TryGetInnerText(element, out var text) && 1872 if (TryGetInnerText(element, out var text) &&
1873 this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}' attribute instead.", element.Name.LocalName, attributeName)) 1873 this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}' attribute instead.", element.Name.LocalName, attributeName))
1874 { 1874 {
1875 element.Add(new XAttribute(attributeName, text)); 1875 element.Add(new XAttribute(attributeName, text));
1876 RemoveChildren(element); 1876 RemoveChildren(element);
@@ -1880,7 +1880,7 @@ namespace WixToolset.Converters
1880 void RemoveAttributeIfPresent(XElement element, string attributeName, ConverterTestType type, string format) 1880 void RemoveAttributeIfPresent(XElement element, string attributeName, ConverterTestType type, string format)
1881 { 1881 {
1882 var xAttribute = element.Attribute(attributeName); 1882 var xAttribute = element.Attribute(attributeName);
1883 if (null != xAttribute && this.OnError(type, element, format, element.Name.LocalName, xAttribute.Name)) 1883 if (null != xAttribute && this.OnInformation(type, element, format, element.Name.LocalName, xAttribute.Name))
1884 { 1884 {
1885 xAttribute.Remove(); 1885 xAttribute.Remove();
1886 } 1886 }
@@ -1889,7 +1889,7 @@ namespace WixToolset.Converters
1889 private void RenameWin64ToBitness(XElement element) 1889 private void RenameWin64ToBitness(XElement element)
1890 { 1890 {
1891 var win64 = element.Attribute("Win64"); 1891 var win64 = element.Attribute("Win64");
1892 if (win64 != null && this.OnError(ConverterTestType.Win64AttributeRenamed, element, "The {0} element's Win64 attribute has been renamed. Use the Bitness attribute instead.", element.Name.LocalName)) 1892 if (win64 != null && this.OnInformation(ConverterTestType.Win64AttributeRenamed, element, "The {0} element's Win64 attribute has been renamed. Use the Bitness attribute instead.", element.Name.LocalName))
1893 { 1893 {
1894 var value = this.UpdateWin64ValueToBitnessValue(win64); 1894 var value = this.UpdateWin64ValueToBitnessValue(win64);
1895 element.Add(new XAttribute("Bitness", value)); 1895 element.Add(new XAttribute("Bitness", value));
@@ -1917,7 +1917,7 @@ namespace WixToolset.Converters
1917 } 1917 }
1918 1918
1919 if (!String.IsNullOrEmpty(replacement) && 1919 if (!String.IsNullOrEmpty(replacement) &&
1920 this.OnError(ConverterTestType.BundlePackageCacheAttributeValueObsolete, element, "The chain package element 'Cache' attribute contains obsolete '{0}' value. The value should be '{1}' instead.", cacheValue, replacement)) 1920 this.OnInformation(ConverterTestType.BundlePackageCacheAttributeValueObsolete, element, "The chain package element 'Cache' attribute contains obsolete '{0}' value. The value should be '{1}' instead.", cacheValue, replacement))
1921 { 1921 {
1922 cacheAttribute.SetValue(replacement); 1922 cacheAttribute.SetValue(replacement);
1923 } 1923 }
@@ -2068,7 +2068,7 @@ namespace WixToolset.Converters
2068 foreach (var declaration in declarations) 2068 foreach (var declaration in declarations)
2069 { 2069 {
2070 if (namespaces.Contains(declaration.Value) && 2070 if (namespaces.Contains(declaration.Value) &&
2071 this.OnError(ConverterTestType.RemoveUnusedNamespaces, declaration, "The namespace '{0}' is not used. Remove unused namespaces.", declaration.Value)) 2071 this.OnInformation(ConverterTestType.RemoveUnusedNamespaces, declaration, "The namespace '{0}' is not used. Remove unused namespaces.", declaration.Value))
2072 { 2072 {
2073 declaration.Remove(); 2073 declaration.Remove();
2074 } 2074 }
@@ -2093,14 +2093,55 @@ namespace WixToolset.Converters
2093 return false; 2093 return false;
2094 } 2094 }
2095 2095
2096 // Increase the error count. 2096 // Increase the message count.
2097 this.Errors++; 2097 this.Messages++;
2098 2098
2099 var sourceLine = (null == node) ? new SourceLineNumber(this.SourceFile ?? "wix.exe") : new SourceLineNumber(this.SourceFile, ((IXmlLineInfo)node).LineNumber); 2099 var sourceLine = (null == node) ? new SourceLineNumber(this.SourceFile ?? "wix.exe") : new SourceLineNumber(this.SourceFile, ((IXmlLineInfo)node).LineNumber);
2100 var warning = this.ErrorsAsWarnings.Contains(converterTestType); 2100 var warning = this.ErrorsAsWarnings.Contains(converterTestType);
2101 var display = String.Format(CultureInfo.CurrentCulture, message, args); 2101
2102 var msg = new Message(
2103 sourceLine,
2104 warning ? MessageLevel.Warning : MessageLevel.Error,
2105 (int)converterTestType,
2106 "{0} ({1})",
2107 String.Format(CultureInfo.CurrentCulture, message, args),
2108 converterTestType.ToString());
2109
2110 this.Messaging.Write(msg);
2111
2112 return true;
2113 }
2114
2115 /// <summary>
2116 /// Output an information message to the console.
2117 /// </summary>
2118 /// <param name="converterTestType">The type of converter test.</param>
2119 /// <param name="node">The node that caused the error.</param>
2120 /// <param name="message">Detailed error message.</param>
2121 /// <param name="args">Additional formatted string arguments.</param>
2122 /// <returns>Returns true indicating that action should be taken on this error, and false if it should be ignored.</returns>
2123 private bool OnInformation(ConverterTestType converterTestType, XObject node, string message, params object[] args)
2124 {
2125 // Ignore the error if explicitly ignored or outside the range of the current operation.
2126 if (this.IgnoreErrors.Contains(converterTestType) ||
2127 (this.Operation == ConvertOperation.Convert && converterTestType < ConverterTestType.EndIgnoreInConvert) ||
2128 (this.Operation == ConvertOperation.Format && converterTestType > ConverterTestType.BeginIgnoreInFormat))
2129 {
2130 return false;
2131 }
2132
2133 // Increase the message count.
2134 this.Messages++;
2135
2136 var sourceLine = (null == node) ? new SourceLineNumber(this.SourceFile ?? "wix.exe") : new SourceLineNumber(this.SourceFile, ((IXmlLineInfo)node).LineNumber);
2102 2137
2103 var msg = new Message(sourceLine, warning ? MessageLevel.Warning : MessageLevel.Error, (int)converterTestType, "{0} ({1})", display, converterTestType.ToString()); 2138 var msg = new Message(
2139 sourceLine,
2140 MessageLevel.Information,
2141 (int)converterTestType,
2142 "[Converted] {0} ({1})",
2143 String.Format(CultureInfo.CurrentCulture, message, args),
2144 converterTestType.ToString());
2104 2145
2105 this.Messaging.Write(msg); 2146 this.Messaging.Write(msg);
2106 2147