diff options
author | Rob Mensching <rob@firegiant.com> | 2024-03-08 13:58:11 -0800 |
---|---|---|
committer | Rob Mensching <rob@firegiant.com> | 2024-03-08 15:05:00 -0800 |
commit | 6a3a695b5ac3758fbf4a7836f65d7f85fdd121e0 (patch) | |
tree | 8e21f7eab15c0fe2ad91bc0ec06a5c147d9f4c2d | |
parent | d8c4f61e080a3950faf8fb46b0a5c849988fec8e (diff) | |
download | wix-6a3a695b5ac3758fbf4a7836f65d7f85fdd121e0.tar.gz wix-6a3a695b5ac3758fbf4a7836f65d7f85fdd121e0.tar.bz2 wix-6a3a695b5ac3758fbf4a7836f65d7f85fdd121e0.zip |
Ensure virtual symbols are included when overridden but not referenced
13 files changed, 322 insertions, 156 deletions
diff --git a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs index 610fd5ed..bcd7654f 100644 --- a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs +++ b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs | |||
@@ -125,7 +125,7 @@ namespace WixToolsetTest.UI | |||
125 | }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); | 125 | }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); |
126 | } | 126 | } |
127 | 127 | ||
128 | [Fact(Skip = "Linker problem")] | 128 | [Fact] |
129 | public void CanBuildUsingWixUIFeatureTree() | 129 | public void CanBuildUsingWixUIFeatureTree() |
130 | { | 130 | { |
131 | var folder = TestData.Get(@"TestData", "WixUI_FeatureTree"); | 131 | var folder = TestData.Get(@"TestData", "WixUI_FeatureTree"); |
@@ -161,7 +161,7 @@ namespace WixToolsetTest.UI | |||
161 | }, results.Where(r => r.StartsWith("InstallUISequence:AdvancedWelcome") || r.StartsWith("InstallUISequence:Welcome")).ToArray()); | 161 | }, results.Where(r => r.StartsWith("InstallUISequence:AdvancedWelcome") || r.StartsWith("InstallUISequence:Welcome")).ToArray()); |
162 | } | 162 | } |
163 | 163 | ||
164 | [Fact(Skip = "Linker problem")] | 164 | [Fact] |
165 | public void CanBuildWithWixUIInstallDirWithCustomizedEula() | 165 | public void CanBuildWithWixUIInstallDirWithCustomizedEula() |
166 | { | 166 | { |
167 | var folder = TestData.Get(@"TestData", "WixUI_InstallDir"); | 167 | var folder = TestData.Get(@"TestData", "WixUI_InstallDir"); |
@@ -274,7 +274,7 @@ namespace WixToolsetTest.UI | |||
274 | } | 274 | } |
275 | } | 275 | } |
276 | 276 | ||
277 | [Fact(Skip = "Linker problem")] | 277 | [Fact] |
278 | public void CanBuildUsingWixUIMondo() | 278 | public void CanBuildUsingWixUIMondo() |
279 | { | 279 | { |
280 | var folder = TestData.Get(@"TestData", "WixUI_Mondo"); | 280 | var folder = TestData.Get(@"TestData", "WixUI_Mondo"); |
@@ -307,7 +307,7 @@ namespace WixToolsetTest.UI | |||
307 | }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); | 307 | }, results.Where(result => result.StartsWith("ControlEvent:") && result.Contains("DoAction")).ToArray()); |
308 | WixAssert.CompareLineByLine(new[] | 308 | WixAssert.CompareLineByLine(new[] |
309 | { | 309 | { |
310 | "InstallUISequence:WelcomeDlg\tInstalled AND PATCH\t1295", | 310 | "InstallUISequence:WelcomeDlg\tNOT Installed OR PATCH\t1297", |
311 | }, results.Where(r => r.StartsWith("InstallUISequence:AdvancedWelcome") || r.StartsWith("InstallUISequence:Welcome")).ToArray()); | 311 | }, results.Where(r => r.StartsWith("InstallUISequence:AdvancedWelcome") || r.StartsWith("InstallUISequence:Welcome")).ToArray()); |
312 | } | 312 | } |
313 | 313 | ||
@@ -325,7 +325,7 @@ namespace WixToolsetTest.UI | |||
325 | }, results.Where(s => s.StartsWith("Control:ErrorDlg\tY")).Select(s => s.Split('\t')[9]).ToArray()); | 325 | }, results.Where(s => s.StartsWith("Control:ErrorDlg\tY")).Select(s => s.Split('\t')[9]).ToArray()); |
326 | } | 326 | } |
327 | 327 | ||
328 | [Fact(Skip = "Linker problem")] | 328 | [Fact] |
329 | public void CanBuildWithInstallDirAndRemovedDialog() | 329 | public void CanBuildWithInstallDirAndRemovedDialog() |
330 | { | 330 | { |
331 | var folder = TestData.Get(@"TestData", "InstallDir_NoLicense"); | 331 | var folder = TestData.Get(@"TestData", "InstallDir_NoLicense"); |
@@ -366,7 +366,7 @@ namespace WixToolsetTest.UI | |||
366 | }, results.Where(r => r.StartsWith("InstallUISequence:AdvancedWelcome") || r.StartsWith("InstallUISequence:Welcome")).ToArray()); | 366 | }, results.Where(r => r.StartsWith("InstallUISequence:AdvancedWelcome") || r.StartsWith("InstallUISequence:Welcome")).ToArray()); |
367 | } | 367 | } |
368 | 368 | ||
369 | [Fact(Skip = "Linker problem")] | 369 | [Fact] |
370 | public void CanBuildWithInstallDirAndAddedDialog() | 370 | public void CanBuildWithInstallDirAndAddedDialog() |
371 | { | 371 | { |
372 | var folder = TestData.Get(@"TestData", "InstallDir_SpecialDlg"); | 372 | var folder = TestData.Get(@"TestData", "InstallDir_SpecialDlg"); |
diff --git a/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs b/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs index f9d6ab59..8eaac27d 100644 --- a/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs +++ b/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs | |||
@@ -45,10 +45,9 @@ namespace WixToolset.Core.Link | |||
45 | public ISet<IntermediateSymbol> IdenticalDirectorySymbols { get; private set; } | 45 | public ISet<IntermediateSymbol> IdenticalDirectorySymbols { get; private set; } |
46 | 46 | ||
47 | /// <summary> | 47 | /// <summary> |
48 | /// Gets the collection of overridden symbols that should not be included | 48 | /// Gets the collection of symbols that are marked as overrides. |
49 | /// in the final output. | ||
50 | /// </summary> | 49 | /// </summary> |
51 | public ISet<IntermediateSymbol> OverriddenSymbols { get; private set; } | 50 | public IReadOnlyCollection<SymbolWithSection> OverrideSymbols { get; private set; } |
52 | 51 | ||
53 | public void Execute() | 52 | public void Execute() |
54 | { | 53 | { |
@@ -56,7 +55,6 @@ namespace WixToolset.Core.Link | |||
56 | var possibleConflicts = new HashSet<SymbolWithSection>(); | 55 | var possibleConflicts = new HashSet<SymbolWithSection>(); |
57 | var identicalDirectorySymbols = new HashSet<IntermediateSymbol>(); | 56 | var identicalDirectorySymbols = new HashSet<IntermediateSymbol>(); |
58 | var overrideSymbols = new List<SymbolWithSection>(); | 57 | var overrideSymbols = new List<SymbolWithSection>(); |
59 | var overriddenSymbols = new HashSet<IntermediateSymbol>(); | ||
60 | 58 | ||
61 | if (!Enum.TryParse(this.ExpectedOutputType.ToString(), out SectionType expectedEntrySectionType)) | 59 | if (!Enum.TryParse(this.ExpectedOutputType.ToString(), out SectionType expectedEntrySectionType)) |
62 | { | 60 | { |
@@ -92,34 +90,15 @@ namespace WixToolset.Core.Link | |||
92 | 90 | ||
93 | if (!symbolsByName.TryGetValue(fullName, out var existingSymbol)) | 91 | if (!symbolsByName.TryGetValue(fullName, out var existingSymbol)) |
94 | { | 92 | { |
95 | if (symbolWithSection.Access == AccessModifier.Override) | ||
96 | { | ||
97 | overrideSymbols.Add(symbolWithSection); | ||
98 | } | ||
99 | |||
100 | symbolsByName.Add(fullName, symbolWithSection); | 93 | symbolsByName.Add(fullName, symbolWithSection); |
101 | } | 94 | } |
102 | else // uh-oh, duplicate symbols. | 95 | else // duplicate symbol ids MAY be a problem, but not always (e.g. identical directories and virtual symbols that get overridden) so we do NOT report errors here. |
103 | { | 96 | { |
104 | if (AccessModifier.Virtual == existingSymbol.Access && AccessModifier.Override == symbolWithSection.Access) | ||
105 | { | ||
106 | symbolWithSection.OverrideVirtualSymbol(existingSymbol); | ||
107 | symbolsByName[fullName] = symbolWithSection; // replace the virtual symbol with the override symbol. | ||
108 | |||
109 | overrideSymbols.Add(symbolWithSection); | ||
110 | overriddenSymbols.Add(existingSymbol.Symbol); | ||
111 | } | ||
112 | else if (AccessModifier.Override == existingSymbol.Access && AccessModifier.Virtual == symbolWithSection.Access) | ||
113 | { | ||
114 | existingSymbol.OverrideVirtualSymbol(symbolWithSection); | ||
115 | |||
116 | overriddenSymbols.Add(symbolWithSection.Symbol); | ||
117 | } | ||
118 | // If the duplicate symbols are both private directories, there is a chance that they | 97 | // If the duplicate symbols are both private directories, there is a chance that they |
119 | // point to identical symbols. Identical directory symbols are redundant and will not cause | 98 | // point to identical symbols. Identical directory symbols are redundant and will not cause |
120 | // conflicts. | 99 | // conflicts. |
121 | else if (AccessModifier.Section == existingSymbol.Access && AccessModifier.Section == symbolWithSection.Access && | 100 | if (AccessModifier.Section == existingSymbol.Access && AccessModifier.Section == symbolWithSection.Access && |
122 | SymbolDefinitionType.Directory == existingSymbol.Symbol.Definition.Type && existingSymbol.Symbol.IsIdentical(symbolWithSection.Symbol)) | 101 | SymbolDefinitionType.Directory == existingSymbol.Symbol.Definition.Type && existingSymbol.Symbol.IsIdentical(symbolWithSection.Symbol)) |
123 | { | 102 | { |
124 | // Ensure identical symbols are tracked to ensure that only one symbol will end up in linked intermediate. | 103 | // Ensure identical symbols are tracked to ensure that only one symbol will end up in linked intermediate. |
125 | identicalDirectorySymbols.Add(existingSymbol.Symbol); | 104 | identicalDirectorySymbols.Add(existingSymbol.Symbol); |
@@ -129,25 +108,21 @@ namespace WixToolset.Core.Link | |||
129 | { | 108 | { |
130 | symbolWithSection.AddPossibleConflict(existingSymbol); | 109 | symbolWithSection.AddPossibleConflict(existingSymbol); |
131 | existingSymbol.AddPossibleConflict(symbolWithSection); | 110 | existingSymbol.AddPossibleConflict(symbolWithSection); |
132 | possibleConflicts.Add(symbolWithSection); | 111 | possibleConflicts.Add(existingSymbol); |
133 | } | 112 | } |
134 | } | 113 | } |
135 | } | ||
136 | } | ||
137 | 114 | ||
138 | // Ensure override symbols actually overrode a virtual symbol. | 115 | if (symbolWithSection.Access == AccessModifier.Override) |
139 | foreach (var symbolWithSection in overrideSymbols) | 116 | { |
140 | { | 117 | overrideSymbols.Add(symbolWithSection); |
141 | if (symbolWithSection.Overrides is null) | 118 | } |
142 | { | ||
143 | this.Messaging.Write(LinkerErrors.VirtualSymbolNotFoundForOverride(symbolWithSection.Symbol)); | ||
144 | } | 119 | } |
145 | } | 120 | } |
146 | 121 | ||
147 | this.SymbolsByName = symbolsByName; | 122 | this.SymbolsByName = symbolsByName; |
148 | this.PossibleConflicts = possibleConflicts; | 123 | this.PossibleConflicts = possibleConflicts; |
149 | this.IdenticalDirectorySymbols = identicalDirectorySymbols; | 124 | this.IdenticalDirectorySymbols = identicalDirectorySymbols; |
150 | this.OverriddenSymbols = overriddenSymbols; | 125 | this.OverrideSymbols = overrideSymbols; |
151 | } | 126 | } |
152 | } | 127 | } |
153 | } | 128 | } |
diff --git a/src/wix/WixToolset.Core/Link/ProcessConflictingSymbolsCommand.cs b/src/wix/WixToolset.Core/Link/ProcessConflictingSymbolsCommand.cs new file mode 100644 index 00000000..556a24d7 --- /dev/null +++ b/src/wix/WixToolset.Core/Link/ProcessConflictingSymbolsCommand.cs | |||
@@ -0,0 +1,159 @@ | |||
1 | // 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. | ||
2 | |||
3 | namespace WixToolset.Core.Link | ||
4 | { | ||
5 | using System.Collections.Generic; | ||
6 | using System.Linq; | ||
7 | using WixToolset.Data; | ||
8 | using WixToolset.Data.Symbols; | ||
9 | using WixToolset.Extensibility.Services; | ||
10 | |||
11 | internal class ProcessConflictingSymbolsCommand | ||
12 | { | ||
13 | public ProcessConflictingSymbolsCommand(IMessaging messaging, IReadOnlyCollection<SymbolWithSection> possibleConflicts, IReadOnlyCollection<SymbolWithSection> overrideSymbols, ISet<IntermediateSection> resolvedSections) | ||
14 | { | ||
15 | this.Messaging = messaging; | ||
16 | this.PossibleConflicts = possibleConflicts; | ||
17 | this.OverrideSymbols = overrideSymbols; | ||
18 | this.ResolvedSections = resolvedSections; | ||
19 | } | ||
20 | |||
21 | private IMessaging Messaging { get; } | ||
22 | |||
23 | private IReadOnlyCollection<SymbolWithSection> PossibleConflicts { get; } | ||
24 | |||
25 | private ISet<IntermediateSection> ResolvedSections { get; } | ||
26 | |||
27 | private IReadOnlyCollection<SymbolWithSection> OverrideSymbols { get; } | ||
28 | |||
29 | /// <summary> | ||
30 | /// Gets the collection of overridden symbols that should not be included | ||
31 | /// in the final output. | ||
32 | /// </summary> | ||
33 | public ISet<IntermediateSymbol> OverriddenSymbols { get; private set; } | ||
34 | |||
35 | public void Execute() | ||
36 | { | ||
37 | var overriddenSymbols = new HashSet<IntermediateSymbol>(); | ||
38 | |||
39 | foreach (var symbolWithConflicts in this.PossibleConflicts) | ||
40 | { | ||
41 | var conflicts = YieldReferencedConflicts(symbolWithConflicts, this.ResolvedSections).ToList(); | ||
42 | |||
43 | if (conflicts.Count > 1) | ||
44 | { | ||
45 | IEnumerable<SymbolWithSection> reportDuplicates; | ||
46 | |||
47 | var virtualConflicts = conflicts.Where(s => s.Access == AccessModifier.Virtual).ToList(); | ||
48 | |||
49 | // No virtual symbols, just plain old duplicate errors. This is the easy case. | ||
50 | if (virtualConflicts.Count == 0) | ||
51 | { | ||
52 | var first = conflicts[0]; | ||
53 | reportDuplicates = conflicts.Skip(1); | ||
54 | |||
55 | var referencingSourceLineNumber = first.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
56 | |||
57 | this.Messaging.Write(LinkerErrors.DuplicateSymbol(first.Symbol, referencingSourceLineNumber)); | ||
58 | } | ||
59 | else // there are virtual symbols, which complicates conflict resolution and may not be an error at all. | ||
60 | { | ||
61 | var firstVirtualSymbol = virtualConflicts[0]; | ||
62 | var overrideConflicts = conflicts.Where(s => s.Access == AccessModifier.Override).ToList(); | ||
63 | |||
64 | // If there is a single virtual symbol, there may be a single override symbol to make this a success case. | ||
65 | // All other scenarios are errors. | ||
66 | if (virtualConflicts.Count == 1) | ||
67 | { | ||
68 | var otherConflicts = conflicts.Where(s => s.Access != AccessModifier.Virtual && s.Access != AccessModifier.Override).ToList(); | ||
69 | |||
70 | if (otherConflicts.Count > 0) | ||
71 | { | ||
72 | var first = otherConflicts[0]; | ||
73 | var referencingSourceLineNumber = first.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
74 | |||
75 | reportDuplicates = virtualConflicts; | ||
76 | |||
77 | switch (first.Symbol) | ||
78 | { | ||
79 | case WixActionSymbol action: | ||
80 | this.Messaging.Write(LinkerErrors.VirtualSymbolMustBeOverridden(action)); | ||
81 | break; | ||
82 | default: | ||
83 | this.Messaging.Write(LinkerErrors.VirtualSymbolMustBeOverridden(first.Symbol, referencingSourceLineNumber)); | ||
84 | break; | ||
85 | } | ||
86 | } | ||
87 | else if (overrideConflicts.Count > 1) // multiple overrides report as normal duplicates. | ||
88 | { | ||
89 | var first = overrideConflicts[0]; | ||
90 | var referencingSourceLineNumber = first.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
91 | |||
92 | reportDuplicates = overrideConflicts.Skip(1); | ||
93 | |||
94 | this.Messaging.Write(LinkerErrors.DuplicateSymbol(first.Symbol, referencingSourceLineNumber)); | ||
95 | } | ||
96 | else // the single virtual symbol is overridden by a single override symbol. This is a success case. | ||
97 | { | ||
98 | var overrideSymbol = overrideConflicts[0]; | ||
99 | |||
100 | overriddenSymbols.Add(firstVirtualSymbol.Symbol); | ||
101 | |||
102 | reportDuplicates = Enumerable.Empty<SymbolWithSection>(); | ||
103 | } | ||
104 | } | ||
105 | else // multiple symbols are virtual, use the duplicate virtual symbol message. | ||
106 | { | ||
107 | var first = virtualConflicts[0]; | ||
108 | var referencingSourceLineNumber = first.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
109 | |||
110 | reportDuplicates = virtualConflicts.Skip(1); | ||
111 | |||
112 | this.Messaging.Write(LinkerErrors.DuplicateVirtualSymbol(first.Symbol, referencingSourceLineNumber)); | ||
113 | } | ||
114 | |||
115 | // Always point the override symbols at the first virtual symbol to prevent error being reported about missing overrides. | ||
116 | // There may have been errors reported above, but there was at least one virtual symbol to satisfy the overrides so we | ||
117 | // don't want extra errors in this case. | ||
118 | foreach (var overrideSymbol in overrideConflicts) | ||
119 | { | ||
120 | overrideSymbol.OverrideVirtualSymbol(firstVirtualSymbol); | ||
121 | } | ||
122 | } | ||
123 | |||
124 | foreach (var duplicate in reportDuplicates) | ||
125 | { | ||
126 | this.Messaging.Write(LinkerErrors.DuplicateSymbol2(duplicate.Symbol)); | ||
127 | } | ||
128 | } | ||
129 | } | ||
130 | |||
131 | // Ensure referenced override symbols actually overrode a virtual symbol. | ||
132 | foreach (var referencedOverrideSymbol in this.OverrideSymbols.Where(s => this.ResolvedSections.Contains(s.Section))) | ||
133 | { | ||
134 | if (referencedOverrideSymbol.Overrides is null) | ||
135 | { | ||
136 | this.Messaging.Write(LinkerErrors.VirtualSymbolNotFoundForOverride(referencedOverrideSymbol.Symbol)); | ||
137 | } | ||
138 | } | ||
139 | |||
140 | this.OverriddenSymbols = overriddenSymbols; | ||
141 | } | ||
142 | |||
143 | private static IEnumerable<SymbolWithSection> YieldReferencedConflicts(SymbolWithSection symbolWithConflicts, ISet<IntermediateSection> resolvedSections) | ||
144 | { | ||
145 | if (resolvedSections.Contains(symbolWithConflicts.Section)) | ||
146 | { | ||
147 | yield return symbolWithConflicts; | ||
148 | } | ||
149 | |||
150 | foreach (var possibleConflict in symbolWithConflicts.PossiblyConflicts) | ||
151 | { | ||
152 | if (resolvedSections.Contains(possibleConflict.Section)) | ||
153 | { | ||
154 | yield return possibleConflict; | ||
155 | } | ||
156 | } | ||
157 | } | ||
158 | } | ||
159 | } | ||
diff --git a/src/wix/WixToolset.Core/Link/ReportConflictingSymbolsCommand.cs b/src/wix/WixToolset.Core/Link/ReportConflictingSymbolsCommand.cs deleted file mode 100644 index b1db46a2..00000000 --- a/src/wix/WixToolset.Core/Link/ReportConflictingSymbolsCommand.cs +++ /dev/null | |||
@@ -1,92 +0,0 @@ | |||
1 | // 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. | ||
2 | |||
3 | namespace WixToolset.Core.Link | ||
4 | { | ||
5 | using System.Collections.Generic; | ||
6 | using System.Linq; | ||
7 | using WixToolset.Data; | ||
8 | using WixToolset.Data.Symbols; | ||
9 | using WixToolset.Extensibility.Services; | ||
10 | |||
11 | internal class ReportConflictingSymbolsCommand | ||
12 | { | ||
13 | public ReportConflictingSymbolsCommand(IMessaging messaging, IReadOnlyCollection<SymbolWithSection> possibleConflicts, ISet<IntermediateSection> resolvedSections) | ||
14 | { | ||
15 | this.Messaging = messaging; | ||
16 | this.PossibleConflicts = possibleConflicts; | ||
17 | this.ResolvedSections = resolvedSections; | ||
18 | } | ||
19 | |||
20 | private IMessaging Messaging { get; } | ||
21 | |||
22 | private IReadOnlyCollection<SymbolWithSection> PossibleConflicts { get; } | ||
23 | |||
24 | private ISet<IntermediateSection> ResolvedSections { get; } | ||
25 | |||
26 | public void Execute() | ||
27 | { | ||
28 | // Do a quick check if there are any possibly conflicting symbols. Hopefully the symbols with possible conflicts | ||
29 | // list is a very short list (empty should be the most common). | ||
30 | // | ||
31 | // If we have conflicts then we'll do a more costly check to see if the possible conflicting | ||
32 | // symbols are in sections we actually referenced. From the resulting set, show an error for each duplicate | ||
33 | // (aka: conflicting) symbol. | ||
34 | if (0 < this.PossibleConflicts.Count) | ||
35 | { | ||
36 | foreach (var referencedDuplicate in this.PossibleConflicts.Where(s => this.ResolvedSections.Contains(s.Section))) | ||
37 | { | ||
38 | var actuallyReferencedDuplicates = referencedDuplicate.PossiblyConflicts.Where(s => this.ResolvedSections.Contains(s.Section)).ToList(); | ||
39 | |||
40 | if (actuallyReferencedDuplicates.Count > 0) | ||
41 | { | ||
42 | var conflicts = actuallyReferencedDuplicates.Append(referencedDuplicate).ToList(); | ||
43 | var virtualConflicts = conflicts.Where(s => s.Access == AccessModifier.Virtual).ToList(); | ||
44 | var overrideConflicts = conflicts.Where(s => s.Access == AccessModifier.Override).ToList(); | ||
45 | var otherConflicts = conflicts.Where(s => s.Access != AccessModifier.Virtual && s.Access != AccessModifier.Override).ToList(); | ||
46 | |||
47 | IEnumerable<SymbolWithSection> reportDuplicates = actuallyReferencedDuplicates; | ||
48 | |||
49 | // If multiple symbols are virtual, use the duplicate virtual symbol message. | ||
50 | if (virtualConflicts.Count > 1) | ||
51 | { | ||
52 | var first = virtualConflicts[0]; | ||
53 | var referencingSourceLineNumber = first.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
54 | |||
55 | reportDuplicates = virtualConflicts.Skip(1); | ||
56 | |||
57 | this.Messaging.Write(LinkerErrors.DuplicateVirtualSymbol(first.Symbol, referencingSourceLineNumber)); | ||
58 | } | ||
59 | else if (virtualConflicts.Count == 1 && otherConflicts.Count > 0) | ||
60 | { | ||
61 | var first = otherConflicts[0]; | ||
62 | var referencingSourceLineNumber = first.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
63 | |||
64 | reportDuplicates = virtualConflicts; | ||
65 | |||
66 | switch (first.Symbol) | ||
67 | { | ||
68 | case WixActionSymbol action: | ||
69 | this.Messaging.Write(LinkerErrors.VirtualSymbolMustBeOverridden(action)); | ||
70 | break; | ||
71 | default: | ||
72 | this.Messaging.Write(LinkerErrors.VirtualSymbolMustBeOverridden(first.Symbol, referencingSourceLineNumber)); | ||
73 | break; | ||
74 | } | ||
75 | } | ||
76 | else | ||
77 | { | ||
78 | var referencingSourceLineNumber = referencedDuplicate.DirectReferences.FirstOrDefault()?.SourceLineNumbers; | ||
79 | |||
80 | this.Messaging.Write(LinkerErrors.DuplicateSymbol(referencedDuplicate.Symbol, referencingSourceLineNumber)); | ||
81 | } | ||
82 | |||
83 | foreach (var duplicate in reportDuplicates) | ||
84 | { | ||
85 | this.Messaging.Write(LinkerErrors.DuplicateSymbol2(duplicate.Symbol)); | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | } | ||
diff --git a/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs b/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs index 0e7a7a52..7a3c502a 100644 --- a/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs +++ b/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs | |||
@@ -76,6 +76,7 @@ namespace WixToolset.Core.Link | |||
76 | if (this.symbolsWithSections.TryGetValue(reference.SymbolicName, out var symbolWithSection)) | 76 | if (this.symbolsWithSections.TryGetValue(reference.SymbolicName, out var symbolWithSection)) |
77 | { | 77 | { |
78 | var accessible = this.DetermineAccessibleSymbols(section, symbolWithSection); | 78 | var accessible = this.DetermineAccessibleSymbols(section, symbolWithSection); |
79 | |||
79 | if (accessible.Count == 1) | 80 | if (accessible.Count == 1) |
80 | { | 81 | { |
81 | var accessibleSymbol = accessible[0]; | 82 | var accessibleSymbol = accessible[0]; |
@@ -91,7 +92,7 @@ namespace WixToolset.Core.Link | |||
91 | { | 92 | { |
92 | this.Messaging.Write(ErrorMessages.UnresolvedReference(reference.SourceLineNumbers, reference.SymbolicName, symbolWithSection.Access)); | 93 | this.Messaging.Write(ErrorMessages.UnresolvedReference(reference.SourceLineNumbers, reference.SymbolicName, symbolWithSection.Access)); |
93 | } | 94 | } |
94 | else // multiple symbols referenced creates conflicting symbols. | 95 | else // multiple accessible symbols referenced creates conflicting symbols. |
95 | { | 96 | { |
96 | // Remember the direct reference to the symbol for the error reporting later, | 97 | // Remember the direct reference to the symbol for the error reporting later, |
97 | // but do NOT continue resolving references found in these conflicting symbols. | 98 | // but do NOT continue resolving references found in these conflicting symbols. |
@@ -122,7 +123,7 @@ namespace WixToolset.Core.Link | |||
122 | } | 123 | } |
123 | 124 | ||
124 | /// <summary> | 125 | /// <summary> |
125 | /// Determine if the symbol and any of its duplicates are accessbile by referencing section. | 126 | /// Determine if the symbol and any of its duplicates are accessbile by the referencing section. |
126 | /// </summary> | 127 | /// </summary> |
127 | /// <param name="referencingSection">Section referencing the symbol.</param> | 128 | /// <param name="referencingSection">Section referencing the symbol.</param> |
128 | /// <param name="symbolWithSection">Symbol being referenced.</param> | 129 | /// <param name="symbolWithSection">Symbol being referenced.</param> |
@@ -130,17 +131,48 @@ namespace WixToolset.Core.Link | |||
130 | private List<SymbolWithSection> DetermineAccessibleSymbols(IntermediateSection referencingSection, SymbolWithSection symbolWithSection) | 131 | private List<SymbolWithSection> DetermineAccessibleSymbols(IntermediateSection referencingSection, SymbolWithSection symbolWithSection) |
131 | { | 132 | { |
132 | var accessibleSymbols = new List<SymbolWithSection>(); | 133 | var accessibleSymbols = new List<SymbolWithSection>(); |
134 | List<SymbolWithSection> virtualSymbols = null; | ||
133 | 135 | ||
134 | if (this.AccessibleSymbol(referencingSection, symbolWithSection)) | 136 | if (this.AccessibleSymbol(referencingSection, symbolWithSection)) |
135 | { | 137 | { |
136 | accessibleSymbols.Add(symbolWithSection); | 138 | AddSymbolToCorrectCollection(symbolWithSection, accessibleSymbols, ref virtualSymbols); |
137 | } | 139 | } |
138 | 140 | ||
139 | foreach (var dupe in symbolWithSection.PossiblyConflicts) | 141 | foreach (var dupe in symbolWithSection.PossiblyConflicts) |
140 | { | 142 | { |
141 | if (this.AccessibleSymbol(referencingSection, dupe)) | 143 | if (this.AccessibleSymbol(referencingSection, dupe)) |
142 | { | 144 | { |
143 | accessibleSymbols.Add(dupe); | 145 | AddSymbolToCorrectCollection(dupe, accessibleSymbols, ref virtualSymbols); |
146 | } | ||
147 | } | ||
148 | |||
149 | // If a virtual symbol is accessible we have some extra work to do. | ||
150 | if (virtualSymbols != null) | ||
151 | { | ||
152 | // If there are multiple virtual symbols accessible that's an error case so add them all and | ||
153 | // they'll be reported as conflicts later. | ||
154 | if (virtualSymbols.Count > 1) | ||
155 | { | ||
156 | accessibleSymbols.AddRange(virtualSymbols); | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | var overrode = false; | ||
161 | |||
162 | // If there are any override symbols, skip adding the virtual symbols because they are "overridden". | ||
163 | foreach (var overrideSymbol in accessibleSymbols.Where(symbol => symbol.Access == AccessModifier.Override)) | ||
164 | { | ||
165 | overrideSymbol.OverrideVirtualSymbol(virtualSymbols[0]); | ||
166 | |||
167 | overrode = true; | ||
168 | } | ||
169 | |||
170 | // If there are no overriding symbols, add the virtual symbol (there is only one but we'll add the collection just in case) | ||
171 | // so it will be reported as a conflict later. | ||
172 | if (!overrode) | ||
173 | { | ||
174 | accessibleSymbols.AddRange(virtualSymbols); | ||
175 | } | ||
144 | } | 176 | } |
145 | } | 177 | } |
146 | 178 | ||
@@ -148,6 +180,29 @@ namespace WixToolset.Core.Link | |||
148 | } | 180 | } |
149 | 181 | ||
150 | /// <summary> | 182 | /// <summary> |
183 | /// Add a symbol to the correct collection based on its access. | ||
184 | /// </summary> | ||
185 | /// <param name="symbolWithSection"></param> | ||
186 | /// <param name="accessibleSymbols">Collection of non-virtual symbol that was accessible.</param> | ||
187 | /// <param name="virtualSymbols">Collection of virtual symbol that was accessible</param> | ||
188 | private static void AddSymbolToCorrectCollection(SymbolWithSection symbolWithSection, List<SymbolWithSection> accessibleSymbols, ref List<SymbolWithSection> virtualSymbols) | ||
189 | { | ||
190 | if (symbolWithSection.Access == AccessModifier.Virtual) | ||
191 | { | ||
192 | if (virtualSymbols == null) | ||
193 | { | ||
194 | virtualSymbols = new List<SymbolWithSection>(); | ||
195 | } | ||
196 | |||
197 | virtualSymbols.Add(symbolWithSection); | ||
198 | } | ||
199 | else | ||
200 | { | ||
201 | accessibleSymbols.Add(symbolWithSection); | ||
202 | } | ||
203 | } | ||
204 | |||
205 | /// <summary> | ||
151 | /// Determine if a single symbol is accessible by the referencing section. | 206 | /// Determine if a single symbol is accessible by the referencing section. |
152 | /// </summary> | 207 | /// </summary> |
153 | /// <param name="referencingSection">Section referencing the symbol.</param> | 208 | /// <param name="referencingSection">Section referencing the symbol.</param> |
diff --git a/src/wix/WixToolset.Core/Linker.cs b/src/wix/WixToolset.Core/Linker.cs index a536c049..43a41eac 100644 --- a/src/wix/WixToolset.Core/Linker.cs +++ b/src/wix/WixToolset.Core/Linker.cs | |||
@@ -190,10 +190,13 @@ namespace WixToolset.Core | |||
190 | } | 190 | } |
191 | } | 191 | } |
192 | 192 | ||
193 | // Report duplicates that would ultimately end up being primary key collisions. | 193 | // Process conflicts that may be overridden virtual symbols (that's okay) or end up as primary key collisions (those need to be reported as errors). |
194 | ISet<IntermediateSymbol> overriddenSymbols; | ||
194 | { | 195 | { |
195 | var reportDupes = new ReportConflictingSymbolsCommand(this.Messaging, find.PossibleConflicts, resolve.ResolvedSections); | 196 | var reportDupes = new ProcessConflictingSymbolsCommand(this.Messaging, find.PossibleConflicts, find.OverrideSymbols, resolve.ResolvedSections); |
196 | reportDupes.Execute(); | 197 | reportDupes.Execute(); |
198 | |||
199 | overriddenSymbols = reportDupes.OverriddenSymbols; | ||
197 | } | 200 | } |
198 | 201 | ||
199 | if (this.Messaging.EncounteredError) | 202 | if (this.Messaging.EncounteredError) |
@@ -222,7 +225,7 @@ namespace WixToolset.Core | |||
222 | continue; | 225 | continue; |
223 | } | 226 | } |
224 | } | 227 | } |
225 | else if (find.OverriddenSymbols.Contains(symbol)) | 228 | else if (overriddenSymbols.Contains(symbol)) |
226 | { | 229 | { |
227 | // Skip the symbols that were overridden. | 230 | // Skip the symbols that were overridden. |
228 | continue; | 231 | continue; |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs index 5e40114f..13eb15be 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs | |||
@@ -63,6 +63,18 @@ namespace WixToolsetTest.CoreIntegration | |||
63 | } | 63 | } |
64 | 64 | ||
65 | [Fact] | 65 | [Fact] |
66 | public void CanCompileVirtualSymbolThatDoesNotGetOverridden() | ||
67 | { | ||
68 | var dirSymbols = BuildToGetDirectorySymbols("TestData", "AccessModifier", "VirtualSymbolThatDoesNotGetOverridden.wxs"); | ||
69 | WixAssert.CompareLineByLine(new[] | ||
70 | { | ||
71 | "virtual:ProgramFilesFolder:TARGETDIR:PFiles", | ||
72 | "virtual:TARGETDIR::SourceDir", | ||
73 | "virtual:TestFolder:ProgramFilesFolder:Used", | ||
74 | }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Access.AsString() + ":" + d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray()); | ||
75 | } | ||
76 | |||
77 | [Fact] | ||
66 | public void CannotCompileInvalidCrossFragmentReference() | 78 | public void CannotCompileInvalidCrossFragmentReference() |
67 | { | 79 | { |
68 | var errors = BuildForFailure("TestData", "AccessModifier", "InvalidCrossFragmentReference.wxs"); | 80 | var errors = BuildForFailure("TestData", "AccessModifier", "InvalidCrossFragmentReference.wxs"); |
@@ -78,8 +90,9 @@ namespace WixToolsetTest.CoreIntegration | |||
78 | var errors = BuildForFailure("TestData", "AccessModifier", "DuplicateCrossFragmentReference.wxs"); | 90 | var errors = BuildForFailure("TestData", "AccessModifier", "DuplicateCrossFragmentReference.wxs"); |
79 | WixAssert.CompareLineByLine(new[] | 91 | WixAssert.CompareLineByLine(new[] |
80 | { | 92 | { |
81 | "ln 12: Duplicate Directory with identifier 'TestFolder' referenced by <sourceFolder>\\DuplicateCrossFragmentReference.wxs(4). Ensure all your identifiers of a given type (Directory, File, etc.) are unique or use an access modifier to scope the identfier.", | 93 | "ln 8: Duplicate Directory with identifier 'TestFolder' referenced by <sourceFolder>\\DuplicateCrossFragmentReference.wxs(4). Ensure all your identifiers of a given type (Directory, File, etc.) are unique or use an access modifier to scope the identfier.", |
82 | "ln 8: Location of symbol related to previous error." | 94 | "ln 12: Location of symbol related to previous error.", |
95 | "ln 16: Location of symbol related to previous error." | ||
83 | }, errors); | 96 | }, errors); |
84 | } | 97 | } |
85 | 98 | ||
@@ -99,8 +112,8 @@ namespace WixToolsetTest.CoreIntegration | |||
99 | var errors = BuildForFailure("TestData", "AccessModifier", "DuplicatedOverrideVirtualSymbol.wxs"); | 112 | var errors = BuildForFailure("TestData", "AccessModifier", "DuplicatedOverrideVirtualSymbol.wxs"); |
100 | WixAssert.CompareLineByLine(new[] | 113 | WixAssert.CompareLineByLine(new[] |
101 | { | 114 | { |
102 | "ln 14: Duplicate Directory with identifier 'TestFolder' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", | 115 | "ln 6: Duplicate Directory with identifier 'TestFolder' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", |
103 | "ln 6: Location of symbol related to previous error." | 116 | "ln 14: Location of symbol related to previous error." |
104 | }, errors); | 117 | }, errors); |
105 | } | 118 | } |
106 | 119 | ||
@@ -132,8 +145,8 @@ namespace WixToolsetTest.CoreIntegration | |||
132 | var errors = BuildForFailure("TestData", "AccessModifier", "DuplicatePublicOverrideVirtualSymbol.wxs"); | 145 | var errors = BuildForFailure("TestData", "AccessModifier", "DuplicatePublicOverrideVirtualSymbol.wxs"); |
133 | WixAssert.CompareLineByLine(new[] | 146 | WixAssert.CompareLineByLine(new[] |
134 | { | 147 | { |
135 | "ln 14: Duplicate Directory with identifier 'TestFolder' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", | 148 | "ln 14: The Directory symbol 'TestFolder' conflicts with a virtual symbol. Use the 'override' access modifier to override the virtual symbol or use a different Id to avoid the conflict.", |
136 | "ln 6: Location of symbol related to previous error." | 149 | "ln 10: Location of symbol related to previous error." |
137 | }, errors); | 150 | }, errors); |
138 | } | 151 | } |
139 | 152 | ||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs index f735b53a..17c8db95 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs | |||
@@ -4,9 +4,9 @@ namespace WixToolsetTest.CoreIntegration | |||
4 | { | 4 | { |
5 | using System.IO; | 5 | using System.IO; |
6 | using System.Linq; | 6 | using System.Linq; |
7 | using WixInternal.Core.TestPackage; | ||
7 | using WixInternal.TestSupport; | 8 | using WixInternal.TestSupport; |
8 | using WixToolset.Core; | 9 | using WixToolset.Core; |
9 | using WixInternal.Core.TestPackage; | ||
10 | using WixToolset.Data; | 10 | using WixToolset.Data; |
11 | using WixToolset.Data.Symbols; | 11 | using WixToolset.Data.Symbols; |
12 | using WixToolset.Extensibility.Data; | 12 | using WixToolset.Extensibility.Data; |
@@ -101,7 +101,7 @@ namespace WixToolsetTest.CoreIntegration | |||
101 | [Fact] | 101 | [Fact] |
102 | public void VariableRedefinitionIsAWarning() | 102 | public void VariableRedefinitionIsAWarning() |
103 | { | 103 | { |
104 | var folder = TestData.Get(@"TestData\Variables"); | 104 | var folder = TestData.Get(@"TestData", "Variables"); |
105 | 105 | ||
106 | using (var fs = new DisposableFileSystem()) | 106 | using (var fs = new DisposableFileSystem()) |
107 | { | 107 | { |
@@ -121,8 +121,15 @@ namespace WixToolsetTest.CoreIntegration | |||
121 | 121 | ||
122 | result.AssertSuccess(); | 122 | result.AssertSuccess(); |
123 | 123 | ||
124 | var warning = result.Messages.Where(message => message.Id == (int)WarningMessages.Ids.VariableDeclarationCollision); | 124 | var warning = result.Messages.Where(m => m.Level == MessageLevel.Warning || m.Level == MessageLevel.Error) |
125 | Assert.Single(warning); | 125 | .Select(m => $"ln {m.SourceLineNumbers.LineNumber}: {m.Level.ToString().ToLowerInvariant()}: {m}".Replace(baseFolder, "<baseFolder>")) |
126 | .ToArray(); | ||
127 | WixAssert.CompareLineByLine(new[] | ||
128 | { | ||
129 | "ln 5: warning: The variable 'Bar' with value 'Baz' was previously declared with value 'Bar'.", | ||
130 | "ln 24: warning: It is no longer necessary to define the standard directory 'TARGETDIR'. Use the StandardDirectory element instead.", | ||
131 | "ln 25: warning: It is no longer necessary to define the standard directory 'ProgramFilesFolder'. Use the StandardDirectory element instead." | ||
132 | }, warning); | ||
126 | } | 133 | } |
127 | } | 134 | } |
128 | 135 | ||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs index 9931a45a..5b357994 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs | |||
@@ -102,10 +102,9 @@ namespace WixToolsetTest.CoreIntegration | |||
102 | .ToArray(); | 102 | .ToArray(); |
103 | WixAssert.CompareLineByLine(new[] | 103 | WixAssert.CompareLineByLine(new[] |
104 | { | 104 | { |
105 | "ln 8: Duplicate Registry with identifier 'regJnkjRU9YGaMJhQOqKmivWKf_VdY' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", | 105 | "ln 7: Duplicate Registry with identifier 'regJnkjRU9YGaMJhQOqKmivWKf_VdY' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", |
106 | "ln 7: Location of symbol related to previous error.", | 106 | "ln 8: Location of symbol related to previous error.", |
107 | "ln 9: Duplicate Registry with identifier 'regJnkjRU9YGaMJhQOqKmivWKf_VdY' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", | 107 | "ln 9: Location of symbol related to previous error." |
108 | "ln 7: Location of symbol related to previous error." | ||
109 | }, errors); | 108 | }, errors); |
110 | } | 109 | } |
111 | } | 110 | } |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs index f987fe13..73678cb6 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs | |||
@@ -11,4 +11,8 @@ | |||
11 | <Fragment> | 11 | <Fragment> |
12 | <Directory Id="TestFolder" Name="Dupe 2" /> | 12 | <Directory Id="TestFolder" Name="Dupe 2" /> |
13 | </Fragment> | 13 | </Fragment> |
14 | |||
15 | <Fragment> | ||
16 | <Directory Id="TestFolder" Name="Dupe 3" /> | ||
17 | </Fragment> | ||
14 | </Wix> | 18 | </Wix> |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs index 13f03040..9afec003 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs | |||
@@ -2,9 +2,22 @@ | |||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> |
3 | <Package Name="Override Virtual Symbol With Fragments" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | 3 | <Package Name="Override Virtual Symbol With Fragments" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> |
4 | <DirectoryRef Id="TestFolder" /> | 4 | <DirectoryRef Id="TestFolder" /> |
5 | |||
6 | <PropertyRef Id="A" /> | ||
7 | <PropertyRef Id="B" /> | ||
5 | </Package> | 8 | </Package> |
6 | 9 | ||
7 | <Fragment> | 10 | <Fragment> |
11 | <Property Id="A" Secure="true"/> | ||
12 | <DirectoryRef Id="TestFolder" /> | ||
13 | </Fragment> | ||
14 | |||
15 | <Fragment> | ||
16 | <Property Id="B" Secure="true"/> | ||
17 | <DirectoryRef Id="TestFolder" /> | ||
18 | </Fragment> | ||
19 | |||
20 | <Fragment> | ||
8 | <StandardDirectory Id="ProgramFilesFolder"> | 21 | <StandardDirectory Id="ProgramFilesFolder"> |
9 | <Directory Id="override TestFolder" Name="Override Test Folder Includes Another" /> | 22 | <Directory Id="override TestFolder" Name="Override Test Folder Includes Another" /> |
10 | <Directory Id="AlsoIncluded" Name="Also Included" /> | 23 | <Directory Id="AlsoIncluded" Name="Also Included" /> |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolThatDoesNotGetOverridden.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolThatDoesNotGetOverridden.wxs new file mode 100644 index 00000000..123b856d --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolThatDoesNotGetOverridden.wxs | |||
@@ -0,0 +1,30 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Package Name="Override Without Virtual Symbol" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | ||
4 | <PropertyRef Id="DoesGetReferenced" /> | ||
5 | </Package> | ||
6 | |||
7 | <Fragment> | ||
8 | <Property Id="DoesNotGetReferenced1" Value="Does Not Get Referenced" /> | ||
9 | |||
10 | <StandardDirectory Id="ProgramFilesFolder"> | ||
11 | <Directory Id="override TestFolder" Name="IsNotUsed1" /> | ||
12 | </StandardDirectory> | ||
13 | </Fragment> | ||
14 | |||
15 | <Fragment> | ||
16 | <Property Id="DoesNotGetReferenced2" Value="Does Not Get Referenced" /> | ||
17 | |||
18 | <StandardDirectory Id="ProgramFilesFolder"> | ||
19 | <Directory Id="override TestFolder" Name="IsNotUsed2" /> | ||
20 | </StandardDirectory> | ||
21 | </Fragment> | ||
22 | |||
23 | <Fragment> | ||
24 | <Property Id="DoesGetReferenced" Value="Is Referenced" /> | ||
25 | |||
26 | <StandardDirectory Id="ProgramFilesFolder"> | ||
27 | <Directory Id="virtual TestFolder" Name="Used" /> | ||
28 | </StandardDirectory> | ||
29 | </Fragment> | ||
30 | </Wix> | ||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs index bcbdb00f..d22676d4 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | <Fragment> | 23 | <Fragment> |
24 | <Directory Id="override TARGETDIR" Name="SourceDir"> | 24 | <Directory Id="override TARGETDIR" Name="SourceDir"> |
25 | <Directory Id="override ProgramFilesFolder"> | 25 | <Directory Id="ProgramFilesFolder"> |
26 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" /> | 26 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" /> |
27 | </Directory> | 27 | </Directory> |
28 | </Directory> | 28 | </Directory> |