From d180bc6df297422f189ffd08a0dd558bfbeba1ca Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 15 Jan 2023 19:17:29 -0600 Subject: Add netfx:DotNetCoreSdkFeatureBandSearch. 7058 --- src/ext/NetFx/wixext/NetFxCompiler.cs | 190 +++++++++++++++++++-- .../NetFxNetCoreSearchSdkFeatureBandSymbol.cs | 71 ++++++++ .../wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs | 25 +-- .../NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs | 7 +- 4 files changed, 260 insertions(+), 33 deletions(-) create mode 100644 src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkFeatureBandSymbol.cs (limited to 'src/ext/NetFx/wixext') diff --git a/src/ext/NetFx/wixext/NetFxCompiler.cs b/src/ext/NetFx/wixext/NetFxCompiler.cs index 7a37cf90..c40bc77b 100644 --- a/src/ext/NetFx/wixext/NetFxCompiler.cs +++ b/src/ext/NetFx/wixext/NetFxCompiler.cs @@ -55,6 +55,12 @@ namespace WixToolset.Netfx case "DotNetCoreSdkSearchRef": this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); break; + case "DotNetCoreSdkFeatureBandSearch": + this.ParseDotNetCoreSdkFeatureBandSearchElement(intermediate, section, element); + break; + case "DotNetCoreSdkFeatureBandSearchRef": + this.ParseDotNetCoreSdkFeatureBandSearchRefElement(intermediate, section, element); + break; case "DotNetCompatibilityCheck": this.ParseDotNetCompatibilityCheckElement(intermediate, section, element); break; @@ -81,6 +87,12 @@ namespace WixToolset.Netfx case "DotNetCoreSdkSearchRef": this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); break; + case "DotNetCoreSdkFeatureBandSearch": + this.ParseDotNetCoreSdkFeatureBandSearchElement(intermediate, section, element); + break; + case "DotNetCoreSdkFeatureBandSearchRef": + this.ParseDotNetCoreSdkFeatureBandSearchRefElement(intermediate, section, element); + break; default: this.ParseHelper.UnexpectedElement(parentElement, element); break; @@ -267,8 +279,8 @@ namespace WixToolset.Netfx string variable = null; string condition = null; string after = null; - NetCoreSdkSearchPlatform? platform = null; - string version = null; + NetCoreSearchPlatform? platform = null; + var majorVersion = CompilerConstants.IntegerNotSet; foreach (var attrib in element.Attributes()) { @@ -293,22 +305,22 @@ namespace WixToolset.Netfx switch (platformValue) { case "arm64": - platform = NetCoreSdkSearchPlatform.Arm64; + platform = NetCoreSearchPlatform.Arm64; break; case "x64": - platform = NetCoreSdkSearchPlatform.X64; + platform = NetCoreSearchPlatform.X64; break; case "x86": - platform = NetCoreSdkSearchPlatform.X86; + platform = NetCoreSearchPlatform.X86; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86")); break; } break; - case "Version": + case "MajorVersion": // .NET Core had a different deployment strategy before .NET Core 3.0 which would require different detection logic. - version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); + majorVersion = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 3, Int32.MaxValue); break; default: this.ParseHelper.UnexpectedAttribute(element, attrib); @@ -331,16 +343,13 @@ namespace WixToolset.Netfx this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform")); } - - if (String.IsNullOrEmpty(version)) + if (majorVersion == CompilerConstants.IntegerNotSet) { - this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version")); + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "MajorVersion")); } - - var ver = Version.Parse(version); - if (ver.Major == 4) + else if (majorVersion == 4) { - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*")); + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "MajorVersion", "4", "3", "5+")); } this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); @@ -358,7 +367,7 @@ namespace WixToolset.Netfx section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id) { Platform = platform.Value, - Version = version, + MajorVersion = majorVersion, }); } } @@ -391,6 +400,157 @@ namespace WixToolset.Netfx this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); } + private void ParseDotNetCoreSdkFeatureBandSearchElement(Intermediate intermediate, IntermediateSection section, XElement element) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + string variable = null; + string condition = null; + string after = null; + NetCoreSearchPlatform? platform = null; + string version = null; + var majorVersion = 0; + var minorVersion = 0; + var patchVersion = 0; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + break; + case "Variable": + variable = this.ParseHelper.GetAttributeBundleVariableNameValue(sourceLineNumbers, attrib); + break; + case "Condition": + condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "After": + after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "Platform": + var platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + switch (platformValue) + { + case "arm64": + platform = NetCoreSearchPlatform.Arm64; + break; + case "x64": + platform = NetCoreSearchPlatform.X64; + break; + case "x86": + platform = NetCoreSearchPlatform.X86; + break; + default: + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86")); + break; + } + break; + case "Version": + version = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (id == null) + { + id = this.ParseHelper.CreateIdentifier("dncsfbs", variable, condition, after); + } + + if (!platform.HasValue) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform")); + } + + if (String.IsNullOrEmpty(version)) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version")); + } + else + { + if (!Version.TryParse(version, out var featureBandVersion)) + { + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "x.x.x00")); + } + else + { + majorVersion = featureBandVersion.Major; + minorVersion = featureBandVersion.Minor; + patchVersion = featureBandVersion.Build; + + if ((patchVersion % 100) != 0 || featureBandVersion.Revision != -1) + { + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "x.x.x00")); + } + + if (majorVersion == 4) + { + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*")); + } + } + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4NetfxBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64); + if (bundleExtensionId == null) + { + this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName)); + } + + if (!this.Messaging.EncounteredError) + { + this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId); + + section.AddSymbol(new NetFxNetCoreSdkFeatureBandSearchSymbol(sourceLineNumbers, id) + { + Platform = platform.Value, + MajorVersion = majorVersion, + MinorVersion = minorVersion, + PatchVersion = patchVersion, + }); + } + } + + private void ParseDotNetCoreSdkFeatureBandSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, refId); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + } + /// /// Parses a NativeImage element. /// diff --git a/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkFeatureBandSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkFeatureBandSymbol.cs new file mode 100644 index 00000000..ad80f9d2 --- /dev/null +++ b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkFeatureBandSymbol.cs @@ -0,0 +1,71 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Netfx +{ + using WixToolset.Data; + using WixToolset.Netfx.Symbols; + + public static partial class NetfxSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition NetFxNetCoreSdkFeatureBandSearch = new IntermediateSymbolDefinition( + NetfxSymbolDefinitionType.NetFxNetCoreSdkFeatureBandSearch.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.Platform), IntermediateFieldType.Number), + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.MajorVersion), IntermediateFieldType.Number), + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.MinorVersion), IntermediateFieldType.Number), + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.PatchVersion), IntermediateFieldType.Number), + }, + typeof(NetFxNetCoreSdkFeatureBandSearchSymbol)); + } +} + +namespace WixToolset.Netfx.Symbols +{ + using WixToolset.Data; + + public enum NetFxNetCoreSdkFeatureBandSearchSymbolFields + { + Platform, + MajorVersion, + MinorVersion, + PatchVersion, + } + + public class NetFxNetCoreSdkFeatureBandSearchSymbol : IntermediateSymbol + { + public NetFxNetCoreSdkFeatureBandSearchSymbol() : base(NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, null, null) + { + } + + public NetFxNetCoreSdkFeatureBandSearchSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, sourceLineNumber, id) + { + } + + public IntermediateField this[NetFxNetCoreSdkFeatureBandSearchSymbolFields index] => this.Fields[(int)index]; + + public NetCoreSearchPlatform Platform + { + get => (NetCoreSearchPlatform)this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.Platform].AsNumber(); + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.Platform, (int)value); + } + + public int MajorVersion + { + get => this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MajorVersion].AsNumber(); + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MajorVersion, value); + } + + public int MinorVersion + { + get => this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MinorVersion].AsNumber(); + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MinorVersion, value); + } + + public int PatchVersion + { + get => this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.PatchVersion].AsNumber(); + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.PatchVersion, value); + } + } +} diff --git a/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs index 86b750ea..a368068e 100644 --- a/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs +++ b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs @@ -12,9 +12,9 @@ namespace WixToolset.Netfx new[] { new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Platform), IntermediateFieldType.Number), - new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Version), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.MajorVersion), IntermediateFieldType.Number), }, - typeof(NetFxNetCoreSearchSymbol)); + typeof(NetFxNetCoreSdkSearchSymbol)); } } @@ -22,21 +22,12 @@ namespace WixToolset.Netfx.Symbols { using WixToolset.Data; - - public enum NetCoreSdkSearchPlatform - { - X86, - X64, - Arm64, - } - public enum NetFxNetCoreSdkSearchSymbolFields { Platform, - Version, + MajorVersion, } - public class NetFxNetCoreSdkSearchSymbol : IntermediateSymbol { public NetFxNetCoreSdkSearchSymbol() : base(NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, null, null) @@ -49,16 +40,16 @@ namespace WixToolset.Netfx.Symbols public IntermediateField this[NetFxNetCoreSdkSearchSymbolFields index] => this.Fields[(int)index]; - public NetCoreSdkSearchPlatform Platform + public NetCoreSearchPlatform Platform { - get => (NetCoreSdkSearchPlatform)this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Platform].AsNumber(); + get => (NetCoreSearchPlatform)this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Platform].AsNumber(); set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Platform, (int)value); } - public string Version + public int MajorVersion { - get => this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Version].AsString(); - set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Version, value); + get => this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.MajorVersion].AsNumber(); + set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.MajorVersion, value); } } } diff --git a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs index 00c52f9e..1db4f647 100644 --- a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs +++ b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs @@ -10,8 +10,9 @@ namespace WixToolset.Netfx { NetFxNativeImage, NetFxNetCoreSearch, - NetFxNetCoreSdkSearch, NetFxDotNetCompatibilityCheck, + NetFxNetCoreSdkSearch, + NetFxNetCoreSdkFeatureBandSearch, } public static partial class NetfxSymbolDefinitions @@ -41,6 +42,9 @@ namespace WixToolset.Netfx case NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch: return NetfxSymbolDefinitions.NetFxNetCoreSdkSearch; + case NetfxSymbolDefinitionType.NetFxNetCoreSdkFeatureBandSearch: + return NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch; + case NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck: return NetfxSymbolDefinitions.NetFxDotNetCompatibilityCheck; @@ -53,6 +57,7 @@ namespace WixToolset.Netfx { NetFxNetCoreSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag); NetFxNetCoreSdkSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag); + NetFxNetCoreSdkFeatureBandSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag); } } } -- cgit v1.2.3-55-g6feb