From 2bb37beda887d120a0ddabf874ad25357101faa1 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 1 Nov 2017 10:59:45 -0700 Subject: Update to WiX Intermediate Representation --- .../Link/FindEntrySectionAndLoadSymbolsCommand.cs | 81 +++++++++++----------- 1 file changed, 40 insertions(+), 41 deletions(-) (limited to 'src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs') diff --git a/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs b/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs index effb06e4..00613ca1 100644 --- a/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs +++ b/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs @@ -1,6 +1,6 @@ // 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.Link +namespace WixToolset.Core.Link { using System; using System.Collections.Generic; @@ -9,13 +9,13 @@ namespace WixToolset.Link internal class FindEntrySectionAndLoadSymbolsCommand : ICommand { - private IEnumerable
sections; - - public FindEntrySectionAndLoadSymbolsCommand(IEnumerable
sections) + public FindEntrySectionAndLoadSymbolsCommand(IEnumerable sections) { - this.sections = sections; + this.Sections = sections; } + private IEnumerable Sections { get; } + /// /// Sets the expected entry output type, based on output file extension provided to the linker. /// @@ -24,13 +24,16 @@ namespace WixToolset.Link /// /// Gets the located entry section after the command is executed. /// - public Section EntrySection { get; private set; } + public IntermediateSection EntrySection { get; private set; } /// /// Gets the collection of loaded symbols. /// public IDictionary Symbols { get; private set; } + /// + /// Gets the collection of possibly conflicting symbols. + /// public IEnumerable PossiblyConflictingSymbols { get; private set; } public void Execute() @@ -38,22 +41,22 @@ namespace WixToolset.Link Dictionary symbols = new Dictionary(); HashSet possibleConflicts = new HashSet(); - SectionType expectedEntrySectionType; - if (!Enum.TryParse(this.ExpectedOutputType.ToString(), out expectedEntrySectionType)) + if (!Enum.TryParse(this.ExpectedOutputType.ToString(), out SectionType expectedEntrySectionType)) { expectedEntrySectionType = SectionType.Unknown; } - foreach (Section section in this.sections) + foreach (var section in this.Sections) { // Try to find the one and only entry section. if (SectionType.Product == section.Type || SectionType.Module == section.Type || SectionType.PatchCreation == section.Type || SectionType.Patch == section.Type || SectionType.Bundle == section.Type) { - if (SectionType.Unknown != expectedEntrySectionType && section.Type != expectedEntrySectionType) - { - string outputExtension = Output.GetExtension(this.ExpectedOutputType); - Messaging.Instance.OnMessage(WixWarnings.UnexpectedEntrySection(section.SourceLineNumbers, section.Type.ToString(), expectedEntrySectionType.ToString(), outputExtension)); - } + // TODO: remove this? + //if (SectionType.Unknown != expectedEntrySectionType && section.Type != expectedEntrySectionType) + //{ + // string outputExtension = Output.GetExtension(this.ExpectedOutputType); + // Messaging.Instance.OnMessage(WixWarnings.UnexpectedEntrySection(section.SourceLineNumbers, section.Type.ToString(), expectedEntrySectionType.ToString(), outputExtension)); + //} if (null == this.EntrySection) { @@ -61,42 +64,38 @@ namespace WixToolset.Link } else { - Messaging.Instance.OnMessage(WixErrors.MultipleEntrySections(this.EntrySection.SourceLineNumbers, this.EntrySection.Id, section.Id)); - Messaging.Instance.OnMessage(WixErrors.MultipleEntrySections2(section.SourceLineNumbers)); + Messaging.Instance.OnMessage(WixErrors.MultipleEntrySections(this.EntrySection.Tuples.FirstOrDefault()?.SourceLineNumbers, this.EntrySection.Id, section.Id)); + Messaging.Instance.OnMessage(WixErrors.MultipleEntrySections2(section.Tuples.FirstOrDefault()?.SourceLineNumbers)); } } // Load all the symbols from the section's tables that create symbols. - foreach (Table table in section.Tables.Where(t => t.Definition.CreateSymbols)) + foreach (var row in section.Tuples.Where(t => t.Id != null)) { - foreach (Row row in table.Rows) - { - Symbol symbol = new Symbol(row); + var symbol = new Symbol(section, row); - Symbol existingSymbol; - if (!symbols.TryGetValue(symbol.Name, out existingSymbol)) + if (!symbols.TryGetValue(symbol.Name, out var existingSymbol)) + { + symbols.Add(symbol.Name, symbol); + } + else // uh-oh, duplicate symbols. + { + // If the duplicate symbols are both private directories, there is a chance that they + // point to identical tuples. Identical directory tuples are redundant and will not cause + // conflicts. + if (AccessModifier.Private == existingSymbol.Access && AccessModifier.Private == symbol.Access && + TupleDefinitionType.Directory == existingSymbol.Row.Definition.Type && existingSymbol.Row.IsIdentical(symbol.Row)) { - symbols.Add(symbol.Name, symbol); + // Ensure identical symbol's tuple is marked redundant to ensure (should the tuple be + // referenced into the final output) it will not add duplicate primary keys during + // the .IDT importing. + //symbol.Row.Redundant = true; - TODO: remove this + existingSymbol.AddRedundant(symbol); } - else // uh-oh, duplicate symbols. + else { - // If the duplicate symbols are both private directories, there is a chance that they - // point to identical rows. Identical directory rows are redundant and will not cause - // conflicts. - if (AccessModifier.Private == existingSymbol.Access && AccessModifier.Private == symbol.Access && - "Directory" == existingSymbol.Row.Table.Name && existingSymbol.Row.IsIdentical(symbol.Row)) - { - // Ensure identical symbol's row is marked redundant to ensure (should the row be - // referenced into the final output) it will not add duplicate primary keys during - // the .IDT importing. - symbol.Row.Redundant = true; - existingSymbol.AddRedundant(symbol); - } - else - { - existingSymbol.AddPossibleConflict(symbol); - possibleConflicts.Add(existingSymbol); - } + existingSymbol.AddPossibleConflict(symbol); + possibleConflicts.Add(existingSymbol); } } } -- cgit v1.2.3-55-g6feb