From c5190ae74ab8fe13609362efce88fa4b8cc24f34 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sat, 30 Dec 2017 17:09:15 -0800 Subject: Fix resolution of localizations that are embedded in intermediates --- src/WixToolset.Core/Resolver.cs | 81 ++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 37 deletions(-) (limited to 'src/WixToolset.Core/Resolver.cs') diff --git a/src/WixToolset.Core/Resolver.cs b/src/WixToolset.Core/Resolver.cs index 1b72e3d0..c2d5cc87 100644 --- a/src/WixToolset.Core/Resolver.cs +++ b/src/WixToolset.Core/Resolver.cs @@ -25,48 +25,42 @@ namespace WixToolset.Core public IEnumerable BindPaths { get; set; } - public Intermediate IntermediateRepresentation { get; set; } - public string IntermediateFolder { get; set; } - public IEnumerable Localizations { get; set; } + public Intermediate IntermediateRepresentation { get; set; } - private IMessaging Messaging { get; set; } + public IEnumerable Localizations { get; set; } public ResolveResult Execute() { - this.Messaging = this.ServiceProvider.GetService(); - - var localizer = new Localizer(this.Messaging, this.Localizations); - - var variableResolver = new WixVariableResolver(this.Messaging, localizer); - this.PopulateVariableResolver(variableResolver); + var extensionManager = this.ServiceProvider.GetService(); var context = this.ServiceProvider.GetService(); - context.Messaging = this.Messaging; + context.Messaging = this.ServiceProvider.GetService(); context.BindPaths = this.BindPaths; - context.Extensions = this.ServiceProvider.GetService().Create(); + context.Extensions = extensionManager.Create(); + context.ExtensionData = extensionManager.Create(); context.IntermediateFolder = this.IntermediateFolder; context.IntermediateRepresentation = this.IntermediateRepresentation; - context.WixVariableResolver = variableResolver; + context.Localizations = this.Localizations; + context.VariableResolver = new WixVariableResolver(context.Messaging); - // Preresolve. - // foreach (IResolverExtension extension in context.Extensions) { extension.PreResolve(context); } - // Resolve. - // - this.LocalizeUI(context); + ResolveResult resolveResult = null; + try + { + PopulateVariableResolver(context); - var resolveResult = this.Resolve(localizer.Codepage, context); + this.LocalizeUI(context); - if (resolveResult != null) + resolveResult = this.Resolve(context); + } + finally { - // Postresolve. - // foreach (IResolverExtension extension in context.Extensions) { extension.PostResolve(resolveResult); @@ -76,7 +70,7 @@ namespace WixToolset.Core return resolveResult; } - private ResolveResult Resolve(int codepage, IResolveContext context) + private ResolveResult Resolve(IResolveContext context) { var buildingPatch = context.IntermediateRepresentation.Sections.Any(s => s.Type == SectionType.Patch); @@ -87,7 +81,7 @@ namespace WixToolset.Core var command = new ResolveFieldsCommand(); command.Messaging = context.Messaging; command.BuildingPatch = buildingPatch; - command.BindVariableResolver = context.WixVariableResolver; + command.VariableResolver = context.VariableResolver; command.BindPaths = context.BindPaths; command.Extensions = context.Extensions; command.FilesWithEmbeddedFiles = filesWithEmbeddedFiles; @@ -122,7 +116,7 @@ namespace WixToolset.Core return new ResolveResult { - Codepage = codepage, + Codepage = context.VariableResolver.Codepage, ExpectedEmbeddedFiles = expectedEmbeddedFiles, DelayedFields = delayedFields, IntermediateRepresentation = context.IntermediateRepresentation @@ -140,7 +134,7 @@ namespace WixToolset.Core { string dialog = row.Dialog; - if (context.WixVariableResolver.TryGetLocalizedControl(dialog, null, out LocalizedControl localizedControl)) + if (context.VariableResolver.TryGetLocalizedControl(dialog, null, out LocalizedControl localizedControl)) { if (CompilerConstants.IntegerNotSet != localizedControl.X) { @@ -176,7 +170,7 @@ namespace WixToolset.Core string dialog = row.Dialog_; string control = row.Control; - if (context.WixVariableResolver.TryGetLocalizedControl(dialog, control, out LocalizedControl localizedControl)) + if (context.VariableResolver.TryGetLocalizedControl(dialog, control, out LocalizedControl localizedControl)) { if (CompilerConstants.IntegerNotSet != localizedControl.X) { @@ -209,21 +203,34 @@ namespace WixToolset.Core } } - private void PopulateVariableResolver(WixVariableResolver resolver) + private static void PopulateVariableResolver(IResolveContext context) { - // Gather all the wix variables. - var wixVariableTuples = this.IntermediateRepresentation.Sections.SelectMany(s => s.Tuples).OfType(); - foreach (var tuple in wixVariableTuples) + var creator = context.ServiceProvider.GetService(); + + var localizations = context.Localizations.Concat(context.IntermediateRepresentation.Localizations).ToList(); + + // Add localizations from the extensions with data. + foreach (var data in context.ExtensionData) { - try - { - resolver.AddVariable(tuple.WixVariable, tuple.Value, tuple.Overridable); - } - catch (ArgumentException) + var library = data.GetLibrary(creator); + + if (library?.Localizations != null) { - this.Messaging.Write(ErrorMessages.WixVariableCollision(tuple.SourceLineNumbers, tuple.WixVariable)); + localizations.AddRange(library.Localizations); } } + + foreach (var localization in localizations) + { + context.VariableResolver.AddLocalization(localization); + } + + // Gather all the wix variables. + var wixVariableTuples = context.IntermediateRepresentation.Sections.SelectMany(s => s.Tuples).OfType(); + foreach (var tuple in wixVariableTuples) + { + context.VariableResolver.AddVariable(tuple.SourceLineNumbers, tuple.WixVariable, tuple.Value, tuple.Overridable); + } } } } -- cgit v1.2.3-55-g6feb