aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-06-25 14:43:50 -0700
committerRob Mensching <rob@firegiant.com>2020-06-25 14:50:31 -0700
commit38afa9e7bc7eacc021f8805f607368a05751e3c3 (patch)
tree803b0a8d9a06a7d6f7c4df408437017ae21a883e /src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
parent8968578d50858721317d410549a9f9b5c62bf1f7 (diff)
downloadwix-38afa9e7bc7eacc021f8805f607368a05751e3c3.tar.gz
wix-38afa9e7bc7eacc021f8805f607368a05751e3c3.tar.bz2
wix-38afa9e7bc7eacc021f8805f607368a05751e3c3.zip
The Great Tuple to Symbol Rename (tm)
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs344
1 files changed, 172 insertions, 172 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
index a5055209..7f43da9a 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
@@ -7,12 +7,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind
7 using System.Globalization; 7 using System.Globalization;
8 using System.Linq; 8 using System.Linq;
9 using WixToolset.Data; 9 using WixToolset.Data;
10 using WixToolset.Data.Tuples; 10 using WixToolset.Data.Symbols;
11 using WixToolset.Data.WindowsInstaller; 11 using WixToolset.Data.WindowsInstaller;
12 using WixToolset.Extensibility.Services; 12 using WixToolset.Extensibility.Services;
13 13
14 /// <summary> 14 /// <summary>
15 /// Set sequence numbers for all the actions and create tuples in the output object. 15 /// Set sequence numbers for all the actions and create symbols in the output object.
16 /// </summary> 16 /// </summary>
17 internal class SequenceActionsCommand 17 internal class SequenceActionsCommand
18 { 18 {
@@ -32,38 +32,38 @@ namespace WixToolset.Core.WindowsInstaller.Bind
32 32
33 public void Execute() 33 public void Execute()
34 { 34 {
35 var requiredActionTuples = new Dictionary<string, WixActionTuple>(); 35 var requiredActionSymbols = new Dictionary<string, WixActionSymbol>();
36 36
37 // Get the standard actions required based on tuples in the section. 37 // Get the standard actions required based on symbols in the section.
38 var overridableActionTuples = this.GetRequiredStandardActions(); 38 var overridableActionSymbols = this.GetRequiredStandardActions();
39 39
40 // Index all the action tuples and look for collisions. 40 // Index all the action symbols and look for collisions.
41 foreach (var actionTuple in this.Section.Tuples.OfType<WixActionTuple>()) 41 foreach (var actionSymbol in this.Section.Symbols.OfType<WixActionSymbol>())
42 { 42 {
43 if (actionTuple.Overridable) // overridable action 43 if (actionSymbol.Overridable) // overridable action
44 { 44 {
45 if (overridableActionTuples.TryGetValue(actionTuple.Id.Id, out var collidingActionTuple)) 45 if (overridableActionSymbols.TryGetValue(actionSymbol.Id.Id, out var collidingActionSymbol))
46 { 46 {
47 this.Messaging.Write(ErrorMessages.OverridableActionCollision(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action)); 47 this.Messaging.Write(ErrorMessages.OverridableActionCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action));
48 if (null != collidingActionTuple.SourceLineNumbers) 48 if (null != collidingActionSymbol.SourceLineNumbers)
49 { 49 {
50 this.Messaging.Write(ErrorMessages.OverridableActionCollision2(collidingActionTuple.SourceLineNumbers)); 50 this.Messaging.Write(ErrorMessages.OverridableActionCollision2(collidingActionSymbol.SourceLineNumbers));
51 } 51 }
52 } 52 }
53 else 53 else
54 { 54 {
55 overridableActionTuples.Add(actionTuple.Id.Id, actionTuple); 55 overridableActionSymbols.Add(actionSymbol.Id.Id, actionSymbol);
56 } 56 }
57 } 57 }
58 else // unsequenced or sequenced action. 58 else // unsequenced or sequenced action.
59 { 59 {
60 // Unsequenced action (allowed for certain standard actions). 60 // Unsequenced action (allowed for certain standard actions).
61 if (null == actionTuple.Before && null == actionTuple.After && !actionTuple.Sequence.HasValue) 61 if (null == actionSymbol.Before && null == actionSymbol.After && !actionSymbol.Sequence.HasValue)
62 { 62 {
63 if (WindowsInstallerStandard.TryGetStandardAction(actionTuple.Id.Id, out var standardAction)) 63 if (WindowsInstallerStandard.TryGetStandardAction(actionSymbol.Id.Id, out var standardAction))
64 { 64 {
65 // Populate the sequence from the standard action 65 // Populate the sequence from the standard action
66 actionTuple.Sequence = standardAction.Sequence; 66 actionSymbol.Sequence = standardAction.Sequence;
67 } 67 }
68 else // not a supported unscheduled action. 68 else // not a supported unscheduled action.
69 { 69 {
@@ -71,109 +71,109 @@ namespace WixToolset.Core.WindowsInstaller.Bind
71 } 71 }
72 } 72 }
73 73
74 if (requiredActionTuples.TryGetValue(actionTuple.Id.Id, out var collidingActionTuple)) 74 if (requiredActionSymbols.TryGetValue(actionSymbol.Id.Id, out var collidingActionSymbol))
75 { 75 {
76 this.Messaging.Write(ErrorMessages.ActionCollision(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action)); 76 this.Messaging.Write(ErrorMessages.ActionCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action));
77 if (null != collidingActionTuple.SourceLineNumbers) 77 if (null != collidingActionSymbol.SourceLineNumbers)
78 { 78 {
79 this.Messaging.Write(ErrorMessages.ActionCollision2(collidingActionTuple.SourceLineNumbers)); 79 this.Messaging.Write(ErrorMessages.ActionCollision2(collidingActionSymbol.SourceLineNumbers));
80 } 80 }
81 } 81 }
82 else 82 else
83 { 83 {
84 requiredActionTuples.Add(actionTuple.Id.Id, actionTuple); 84 requiredActionSymbols.Add(actionSymbol.Id.Id, actionSymbol);
85 } 85 }
86 } 86 }
87 } 87 }
88 88
89 // Add the overridable action tuples that are not overridden to the required action tuples. 89 // Add the overridable action symbols that are not overridden to the required action symbols.
90 foreach (var actionTuple in overridableActionTuples.Values) 90 foreach (var actionSymbol in overridableActionSymbols.Values)
91 { 91 {
92 if (!requiredActionTuples.ContainsKey(actionTuple.Id.Id)) 92 if (!requiredActionSymbols.ContainsKey(actionSymbol.Id.Id))
93 { 93 {
94 requiredActionTuples.Add(actionTuple.Id.Id, actionTuple); 94 requiredActionSymbols.Add(actionSymbol.Id.Id, actionSymbol);
95 } 95 }
96 } 96 }
97 97
98 // Suppress the required actions that are overridable. 98 // Suppress the required actions that are overridable.
99 foreach (var suppressActionTuple in this.Section.Tuples.OfType<WixSuppressActionTuple>()) 99 foreach (var suppressActionSymbol in this.Section.Symbols.OfType<WixSuppressActionSymbol>())
100 { 100 {
101 var key = suppressActionTuple.Id.Id; 101 var key = suppressActionSymbol.Id.Id;
102 102
103 // If there is an overridable tuple to suppress; suppress it. There is no warning if there 103 // If there is an overridable symbol to suppress; suppress it. There is no warning if there
104 // is no action to suppress because the action may be suppressed from a merge module in 104 // is no action to suppress because the action may be suppressed from a merge module in
105 // the binder. 105 // the binder.
106 if (requiredActionTuples.TryGetValue(key, out var requiredActionTuple)) 106 if (requiredActionSymbols.TryGetValue(key, out var requiredActionSymbol))
107 { 107 {
108 if (requiredActionTuple.Overridable) 108 if (requiredActionSymbol.Overridable)
109 { 109 {
110 this.Messaging.Write(WarningMessages.SuppressAction(suppressActionTuple.SourceLineNumbers, suppressActionTuple.Action, suppressActionTuple.SequenceTable.ToString())); 110 this.Messaging.Write(WarningMessages.SuppressAction(suppressActionSymbol.SourceLineNumbers, suppressActionSymbol.Action, suppressActionSymbol.SequenceTable.ToString()));
111 if (null != requiredActionTuple.SourceLineNumbers) 111 if (null != requiredActionSymbol.SourceLineNumbers)
112 { 112 {
113 this.Messaging.Write(WarningMessages.SuppressAction2(requiredActionTuple.SourceLineNumbers)); 113 this.Messaging.Write(WarningMessages.SuppressAction2(requiredActionSymbol.SourceLineNumbers));
114 } 114 }
115 115
116 requiredActionTuples.Remove(key); 116 requiredActionSymbols.Remove(key);
117 } 117 }
118 else // suppressing a non-overridable action tuple 118 else // suppressing a non-overridable action symbol
119 { 119 {
120 this.Messaging.Write(ErrorMessages.SuppressNonoverridableAction(suppressActionTuple.SourceLineNumbers, suppressActionTuple.SequenceTable.ToString(), suppressActionTuple.Action)); 120 this.Messaging.Write(ErrorMessages.SuppressNonoverridableAction(suppressActionSymbol.SourceLineNumbers, suppressActionSymbol.SequenceTable.ToString(), suppressActionSymbol.Action));
121 if (null != requiredActionTuple.SourceLineNumbers) 121 if (null != requiredActionSymbol.SourceLineNumbers)
122 { 122 {
123 this.Messaging.Write(ErrorMessages.SuppressNonoverridableAction2(requiredActionTuple.SourceLineNumbers)); 123 this.Messaging.Write(ErrorMessages.SuppressNonoverridableAction2(requiredActionSymbol.SourceLineNumbers));
124 } 124 }
125 } 125 }
126 } 126 }
127 } 127 }
128 128
129 // Build up dependency trees of the relatively scheduled actions. 129 // Build up dependency trees of the relatively scheduled actions.
130 // Use ToList() to create a copy of the required action tuples so that new tuples can 130 // Use ToList() to create a copy of the required action symbols so that new symbols can
131 // be added while enumerating. 131 // be added while enumerating.
132 foreach (var actionTuple in requiredActionTuples.Values.ToList()) 132 foreach (var actionSymbol in requiredActionSymbols.Values.ToList())
133 { 133 {
134 if (!actionTuple.Sequence.HasValue) 134 if (!actionSymbol.Sequence.HasValue)
135 { 135 {
136 // check for standard actions that don't have a sequence number in a merge module 136 // check for standard actions that don't have a sequence number in a merge module
137 if (SectionType.Module == this.Section.Type && WindowsInstallerStandard.IsStandardAction(actionTuple.Action)) 137 if (SectionType.Module == this.Section.Type && WindowsInstallerStandard.IsStandardAction(actionSymbol.Action))
138 { 138 {
139 this.Messaging.Write(ErrorMessages.StandardActionRelativelyScheduledInModule(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action)); 139 this.Messaging.Write(ErrorMessages.StandardActionRelativelyScheduledInModule(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action));
140 } 140 }
141 141
142 this.SequenceActionTuple(actionTuple, requiredActionTuples); 142 this.SequenceActionSymbol(actionSymbol, requiredActionSymbols);
143 } 143 }
144 else if (SectionType.Module == this.Section.Type && 0 < actionTuple.Sequence && !WindowsInstallerStandard.IsStandardAction(actionTuple.Action)) // check for custom actions and dialogs that have a sequence number 144 else if (SectionType.Module == this.Section.Type && 0 < actionSymbol.Sequence && !WindowsInstallerStandard.IsStandardAction(actionSymbol.Action)) // check for custom actions and dialogs that have a sequence number
145 { 145 {
146 this.Messaging.Write(ErrorMessages.CustomActionSequencedInModule(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action)); 146 this.Messaging.Write(ErrorMessages.CustomActionSequencedInModule(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action));
147 } 147 }
148 } 148 }
149 149
150 // Look for standard actions with sequence restrictions that aren't necessarily scheduled based 150 // Look for standard actions with sequence restrictions that aren't necessarily scheduled based
151 // on the presence of a particular table. 151 // on the presence of a particular table.
152 if (requiredActionTuples.ContainsKey("InstallExecuteSequence/DuplicateFiles") && !requiredActionTuples.ContainsKey("InstallExecuteSequence/InstallFiles")) 152 if (requiredActionSymbols.ContainsKey("InstallExecuteSequence/DuplicateFiles") && !requiredActionSymbols.ContainsKey("InstallExecuteSequence/InstallFiles"))
153 { 153 {
154 WindowsInstallerStandard.TryGetStandardAction("InstallExecuteSequence/InstallFiles", out var standardAction); 154 WindowsInstallerStandard.TryGetStandardAction("InstallExecuteSequence/InstallFiles", out var standardAction);
155 requiredActionTuples.Add(standardAction.Id.Id, standardAction); 155 requiredActionSymbols.Add(standardAction.Id.Id, standardAction);
156 } 156 }
157 157
158 // Schedule actions. 158 // Schedule actions.
159 List<WixActionTuple> scheduledActionTuples; 159 List<WixActionSymbol> scheduledActionSymbols;
160 if (SectionType.Module == this.Section.Type) 160 if (SectionType.Module == this.Section.Type)
161 { 161 {
162 scheduledActionTuples = requiredActionTuples.Values.ToList(); 162 scheduledActionSymbols = requiredActionSymbols.Values.ToList();
163 } 163 }
164 else 164 else
165 { 165 {
166 scheduledActionTuples = this.ScheduleActions(requiredActionTuples); 166 scheduledActionSymbols = this.ScheduleActions(requiredActionSymbols);
167 } 167 }
168 168
169 // Remove all existing WixActionTuples from the section then add the 169 // Remove all existing WixActionSymbols from the section then add the
170 // scheduled actions back to the section. Note: we add the indices in 170 // scheduled actions back to the section. Note: we add the indices in
171 // reverse order to make it easy to remove them from the list later. 171 // reverse order to make it easy to remove them from the list later.
172 var removeIndices = new List<int>(); 172 var removeIndices = new List<int>();
173 for (var i = this.Section.Tuples.Count - 1; i >= 0; --i) 173 for (var i = this.Section.Symbols.Count - 1; i >= 0; --i)
174 { 174 {
175 var tuple = this.Section.Tuples[i]; 175 var symbol = this.Section.Symbols[i];
176 if (tuple.Definition.Type == TupleDefinitionType.WixAction) 176 if (symbol.Definition.Type == SymbolDefinitionType.WixAction)
177 { 177 {
178 removeIndices.Add(i); 178 removeIndices.Add(i);
179 } 179 }
@@ -181,164 +181,164 @@ namespace WixToolset.Core.WindowsInstaller.Bind
181 181
182 foreach (var removeIndex in removeIndices) 182 foreach (var removeIndex in removeIndices)
183 { 183 {
184 this.Section.Tuples.RemoveAt(removeIndex); 184 this.Section.Symbols.RemoveAt(removeIndex);
185 } 185 }
186 186
187 foreach (var action in scheduledActionTuples) 187 foreach (var action in scheduledActionSymbols)
188 { 188 {
189 this.Section.AddTuple(action); 189 this.Section.AddSymbol(action);
190 } 190 }
191 } 191 }
192 192
193 private Dictionary<string, WixActionTuple> GetRequiredStandardActions() 193 private Dictionary<string, WixActionSymbol> GetRequiredStandardActions()
194 { 194 {
195 var overridableActionTuples = new Dictionary<string, WixActionTuple>(); 195 var overridableActionSymbols = new Dictionary<string, WixActionSymbol>();
196 196
197 var requiredActionIds = this.GetRequiredActionIds(); 197 var requiredActionIds = this.GetRequiredActionIds();
198 198
199 foreach (var actionId in requiredActionIds) 199 foreach (var actionId in requiredActionIds)
200 { 200 {
201 WindowsInstallerStandard.TryGetStandardAction(actionId, out var standardAction); 201 WindowsInstallerStandard.TryGetStandardAction(actionId, out var standardAction);
202 overridableActionTuples.Add(standardAction.Id.Id, standardAction); 202 overridableActionSymbols.Add(standardAction.Id.Id, standardAction);
203 } 203 }
204 204
205 return overridableActionTuples; 205 return overridableActionSymbols;
206 } 206 }
207 207
208 private List<WixActionTuple> ScheduleActions(Dictionary<string, WixActionTuple> requiredActionTuples) 208 private List<WixActionSymbol> ScheduleActions(Dictionary<string, WixActionSymbol> requiredActionSymbols)
209 { 209 {
210 var scheduledActionTuples = new List<WixActionTuple>(); 210 var scheduledActionSymbols = new List<WixActionSymbol>();
211 211
212 // Process each sequence table individually. 212 // Process each sequence table individually.
213 foreach (SequenceTable sequenceTable in Enum.GetValues(typeof(SequenceTable))) 213 foreach (SequenceTable sequenceTable in Enum.GetValues(typeof(SequenceTable)))
214 { 214 {
215 // Create a collection of just the action tuples in this sequence 215 // Create a collection of just the action symbols in this sequence
216 var sequenceActionTuples = requiredActionTuples.Values.Where(a => a.SequenceTable == sequenceTable).ToList(); 216 var sequenceActionSymbols = requiredActionSymbols.Values.Where(a => a.SequenceTable == sequenceTable).ToList();
217 217
218 // Schedule the absolutely scheduled actions (by sorting them by their sequence numbers). 218 // Schedule the absolutely scheduled actions (by sorting them by their sequence numbers).
219 var absoluteActionTuples = new List<WixActionTuple>(); 219 var absoluteActionSymbols = new List<WixActionSymbol>();
220 foreach (var actionTuple in sequenceActionTuples) 220 foreach (var actionSymbol in sequenceActionSymbols)
221 { 221 {
222 if (actionTuple.Sequence.HasValue) 222 if (actionSymbol.Sequence.HasValue)
223 { 223 {
224 // Look for sequence number collisions 224 // Look for sequence number collisions
225 foreach (var sequenceScheduledActionTuple in absoluteActionTuples) 225 foreach (var sequenceScheduledActionSymbol in absoluteActionSymbols)
226 { 226 {
227 if (sequenceScheduledActionTuple.Sequence == actionTuple.Sequence) 227 if (sequenceScheduledActionSymbol.Sequence == actionSymbol.Sequence)
228 { 228 {
229 this.Messaging.Write(WarningMessages.ActionSequenceCollision(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action, sequenceScheduledActionTuple.Action, actionTuple.Sequence ?? 0)); 229 this.Messaging.Write(WarningMessages.ActionSequenceCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action, sequenceScheduledActionSymbol.Action, actionSymbol.Sequence ?? 0));
230 if (null != sequenceScheduledActionTuple.SourceLineNumbers) 230 if (null != sequenceScheduledActionSymbol.SourceLineNumbers)
231 { 231 {
232 this.Messaging.Write(WarningMessages.ActionSequenceCollision2(sequenceScheduledActionTuple.SourceLineNumbers)); 232 this.Messaging.Write(WarningMessages.ActionSequenceCollision2(sequenceScheduledActionSymbol.SourceLineNumbers));
233 } 233 }
234 } 234 }
235 } 235 }
236 236
237 absoluteActionTuples.Add(actionTuple); 237 absoluteActionSymbols.Add(actionSymbol);
238 } 238 }
239 } 239 }
240 240
241 absoluteActionTuples.Sort((x, y) => (x.Sequence ?? 0).CompareTo(y.Sequence ?? 0)); 241 absoluteActionSymbols.Sort((x, y) => (x.Sequence ?? 0).CompareTo(y.Sequence ?? 0));
242 242
243 // Schedule the relatively scheduled actions (by resolving the dependency trees). 243 // Schedule the relatively scheduled actions (by resolving the dependency trees).
244 var previousUsedSequence = 0; 244 var previousUsedSequence = 0;
245 var relativeActionTuples = new List<WixActionTuple>(); 245 var relativeActionSymbols = new List<WixActionSymbol>();
246 for (int j = 0; j < absoluteActionTuples.Count; j++) 246 for (int j = 0; j < absoluteActionSymbols.Count; j++)
247 { 247 {
248 var absoluteActionTuple = absoluteActionTuples[j]; 248 var absoluteActionSymbol = absoluteActionSymbols[j];
249 249
250 // Get all the relatively scheduled action tuples occuring before and after this absolutely scheduled action tuple. 250 // Get all the relatively scheduled action symbols occuring before and after this absolutely scheduled action symbol.
251 var relativeActions = this.GetAllRelativeActionsForSequenceType(sequenceTable, absoluteActionTuple); 251 var relativeActions = this.GetAllRelativeActionsForSequenceType(sequenceTable, absoluteActionSymbol);
252 252
253 // Check for relatively scheduled actions occuring before/after a special action 253 // Check for relatively scheduled actions occuring before/after a special action
254 // (those actions with a negative sequence number). 254 // (those actions with a negative sequence number).
255 if (absoluteActionTuple.Sequence < 0 && (relativeActions.PreviousActions.Any() || relativeActions.NextActions.Any())) 255 if (absoluteActionSymbol.Sequence < 0 && (relativeActions.PreviousActions.Any() || relativeActions.NextActions.Any()))
256 { 256 {
257 // Create errors for all the before actions. 257 // Create errors for all the before actions.
258 foreach (var actionTuple in relativeActions.PreviousActions) 258 foreach (var actionSymbol in relativeActions.PreviousActions)
259 { 259 {
260 this.Messaging.Write(ErrorMessages.ActionScheduledRelativeToTerminationAction(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action, absoluteActionTuple.Action)); 260 this.Messaging.Write(ErrorMessages.ActionScheduledRelativeToTerminationAction(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action, absoluteActionSymbol.Action));
261 } 261 }
262 262
263 // Create errors for all the after actions. 263 // Create errors for all the after actions.
264 foreach (var actionTuple in relativeActions.NextActions) 264 foreach (var actionSymbol in relativeActions.NextActions)
265 { 265 {
266 this.Messaging.Write(ErrorMessages.ActionScheduledRelativeToTerminationAction(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action, absoluteActionTuple.Action)); 266 this.Messaging.Write(ErrorMessages.ActionScheduledRelativeToTerminationAction(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action, absoluteActionSymbol.Action));
267 } 267 }
268 268
269 // If there is source line information for the absolutely scheduled action display it 269 // If there is source line information for the absolutely scheduled action display it
270 if (absoluteActionTuple.SourceLineNumbers != null) 270 if (absoluteActionSymbol.SourceLineNumbers != null)
271 { 271 {
272 this.Messaging.Write(ErrorMessages.ActionScheduledRelativeToTerminationAction2(absoluteActionTuple.SourceLineNumbers)); 272 this.Messaging.Write(ErrorMessages.ActionScheduledRelativeToTerminationAction2(absoluteActionSymbol.SourceLineNumbers));
273 } 273 }
274 274
275 continue; 275 continue;
276 } 276 }
277 277
278 // Schedule the action tuples before this one. 278 // Schedule the action symbols before this one.
279 var unusedSequence = absoluteActionTuple.Sequence - 1; 279 var unusedSequence = absoluteActionSymbol.Sequence - 1;
280 for (var i = relativeActions.PreviousActions.Count - 1; i >= 0; i--) 280 for (var i = relativeActions.PreviousActions.Count - 1; i >= 0; i--)
281 { 281 {
282 var relativeActionTuple = relativeActions.PreviousActions[i]; 282 var relativeActionSymbol = relativeActions.PreviousActions[i];
283 283
284 // look for collisions 284 // look for collisions
285 if (unusedSequence == previousUsedSequence) 285 if (unusedSequence == previousUsedSequence)
286 { 286 {
287 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber(relativeActionTuple.SourceLineNumbers, relativeActionTuple.SequenceTable.ToString(), relativeActionTuple.Action, absoluteActionTuple.Action)); 287 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber(relativeActionSymbol.SourceLineNumbers, relativeActionSymbol.SequenceTable.ToString(), relativeActionSymbol.Action, absoluteActionSymbol.Action));
288 if (absoluteActionTuple.SourceLineNumbers != null) 288 if (absoluteActionSymbol.SourceLineNumbers != null)
289 { 289 {
290 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber2(absoluteActionTuple.SourceLineNumbers)); 290 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber2(absoluteActionSymbol.SourceLineNumbers));
291 } 291 }
292 292
293 unusedSequence++; 293 unusedSequence++;
294 } 294 }
295 295
296 relativeActionTuple.Sequence = unusedSequence; 296 relativeActionSymbol.Sequence = unusedSequence;
297 relativeActionTuples.Add(relativeActionTuple); 297 relativeActionSymbols.Add(relativeActionSymbol);
298 298
299 unusedSequence--; 299 unusedSequence--;
300 } 300 }
301 301
302 // Determine the next used action sequence number. 302 // Determine the next used action sequence number.
303 var nextUsedSequence = Int16.MaxValue + 1; 303 var nextUsedSequence = Int16.MaxValue + 1;
304 if (absoluteActionTuples.Count > j + 1) 304 if (absoluteActionSymbols.Count > j + 1)
305 { 305 {
306 nextUsedSequence = absoluteActionTuples[j + 1].Sequence ?? 0; 306 nextUsedSequence = absoluteActionSymbols[j + 1].Sequence ?? 0;
307 } 307 }
308 308
309 // Schedule the action tuples after this one. 309 // Schedule the action symbols after this one.
310 unusedSequence = absoluteActionTuple.Sequence + 1; 310 unusedSequence = absoluteActionSymbol.Sequence + 1;
311 for (var i = 0; i < relativeActions.NextActions.Count; i++) 311 for (var i = 0; i < relativeActions.NextActions.Count; i++)
312 { 312 {
313 var relativeActionTuple = relativeActions.NextActions[i]; 313 var relativeActionSymbol = relativeActions.NextActions[i];
314 314
315 if (unusedSequence == nextUsedSequence) 315 if (unusedSequence == nextUsedSequence)
316 { 316 {
317 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber(relativeActionTuple.SourceLineNumbers, relativeActionTuple.SequenceTable.ToString(), relativeActionTuple.Action, absoluteActionTuple.Action)); 317 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber(relativeActionSymbol.SourceLineNumbers, relativeActionSymbol.SequenceTable.ToString(), relativeActionSymbol.Action, absoluteActionSymbol.Action));
318 if (absoluteActionTuple.SourceLineNumbers != null) 318 if (absoluteActionSymbol.SourceLineNumbers != null)
319 { 319 {
320 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber2(absoluteActionTuple.SourceLineNumbers)); 320 this.Messaging.Write(ErrorMessages.NoUniqueActionSequenceNumber2(absoluteActionSymbol.SourceLineNumbers));
321 } 321 }
322 322
323 unusedSequence--; 323 unusedSequence--;
324 } 324 }
325 325
326 relativeActionTuple.Sequence = unusedSequence; 326 relativeActionSymbol.Sequence = unusedSequence;
327 relativeActionTuples.Add(relativeActionTuple); 327 relativeActionSymbols.Add(relativeActionSymbol);
328 328
329 unusedSequence++; 329 unusedSequence++;
330 } 330 }
331 331
332 // keep track of this sequence number as the previous used sequence number for the next iteration 332 // keep track of this sequence number as the previous used sequence number for the next iteration
333 previousUsedSequence = absoluteActionTuple.Sequence ?? 0; 333 previousUsedSequence = absoluteActionSymbol.Sequence ?? 0;
334 } 334 }
335 335
336 // add the absolutely and relatively scheduled actions to the list of scheduled actions 336 // add the absolutely and relatively scheduled actions to the list of scheduled actions
337 scheduledActionTuples.AddRange(absoluteActionTuples); 337 scheduledActionSymbols.AddRange(absoluteActionSymbols);
338 scheduledActionTuples.AddRange(relativeActionTuples); 338 scheduledActionSymbols.AddRange(relativeActionSymbols);
339 } 339 }
340 340
341 return scheduledActionTuples; 341 return scheduledActionSymbols;
342 } 342 }
343 343
344 private IEnumerable<string> GetRequiredActionIds() 344 private IEnumerable<string> GetRequiredActionIds()
@@ -396,16 +396,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind
396 set.Add("InstallUISequence/ValidateProductID"); 396 set.Add("InstallUISequence/ValidateProductID");
397 } 397 }
398 398
399 // Gather the required actions for each tuple type. 399 // Gather the required actions for each symbol type.
400 foreach (var tupleType in this.Section.Tuples.Select(t => t.Definition.Type).Distinct()) 400 foreach (var symbolType in this.Section.Symbols.Select(t => t.Definition.Type).Distinct())
401 { 401 {
402 switch (tupleType) 402 switch (symbolType)
403 { 403 {
404 case TupleDefinitionType.AppSearch: 404 case SymbolDefinitionType.AppSearch:
405 set.Add("InstallExecuteSequence/AppSearch"); 405 set.Add("InstallExecuteSequence/AppSearch");
406 set.Add("InstallUISequence/AppSearch"); 406 set.Add("InstallUISequence/AppSearch");
407 break; 407 break;
408 case TupleDefinitionType.CCPSearch: 408 case SymbolDefinitionType.CCPSearch:
409 set.Add("InstallExecuteSequence/AppSearch"); 409 set.Add("InstallExecuteSequence/AppSearch");
410 set.Add("InstallExecuteSequence/CCPSearch"); 410 set.Add("InstallExecuteSequence/CCPSearch");
411 set.Add("InstallExecuteSequence/RMCCPSearch"); 411 set.Add("InstallExecuteSequence/RMCCPSearch");
@@ -413,40 +413,40 @@ namespace WixToolset.Core.WindowsInstaller.Bind
413 set.Add("InstallUISequence/CCPSearch"); 413 set.Add("InstallUISequence/CCPSearch");
414 set.Add("InstallUISequence/RMCCPSearch"); 414 set.Add("InstallUISequence/RMCCPSearch");
415 break; 415 break;
416 case TupleDefinitionType.Class: 416 case SymbolDefinitionType.Class:
417 set.Add("AdvertiseExecuteSequence/RegisterClassInfo"); 417 set.Add("AdvertiseExecuteSequence/RegisterClassInfo");
418 set.Add("InstallExecuteSequence/RegisterClassInfo"); 418 set.Add("InstallExecuteSequence/RegisterClassInfo");
419 set.Add("InstallExecuteSequence/UnregisterClassInfo"); 419 set.Add("InstallExecuteSequence/UnregisterClassInfo");
420 break; 420 break;
421 case TupleDefinitionType.Complus: 421 case SymbolDefinitionType.Complus:
422 set.Add("InstallExecuteSequence/RegisterComPlus"); 422 set.Add("InstallExecuteSequence/RegisterComPlus");
423 set.Add("InstallExecuteSequence/UnregisterComPlus"); 423 set.Add("InstallExecuteSequence/UnregisterComPlus");
424 break; 424 break;
425 case TupleDefinitionType.CreateFolder: 425 case SymbolDefinitionType.CreateFolder:
426 set.Add("InstallExecuteSequence/CreateFolders"); 426 set.Add("InstallExecuteSequence/CreateFolders");
427 set.Add("InstallExecuteSequence/RemoveFolders"); 427 set.Add("InstallExecuteSequence/RemoveFolders");
428 break; 428 break;
429 case TupleDefinitionType.DuplicateFile: 429 case SymbolDefinitionType.DuplicateFile:
430 set.Add("InstallExecuteSequence/DuplicateFiles"); 430 set.Add("InstallExecuteSequence/DuplicateFiles");
431 set.Add("InstallExecuteSequence/RemoveDuplicateFiles"); 431 set.Add("InstallExecuteSequence/RemoveDuplicateFiles");
432 break; 432 break;
433 case TupleDefinitionType.Environment: 433 case SymbolDefinitionType.Environment:
434 set.Add("InstallExecuteSequence/WriteEnvironmentStrings"); 434 set.Add("InstallExecuteSequence/WriteEnvironmentStrings");
435 set.Add("InstallExecuteSequence/RemoveEnvironmentStrings"); 435 set.Add("InstallExecuteSequence/RemoveEnvironmentStrings");
436 break; 436 break;
437 case TupleDefinitionType.Extension: 437 case SymbolDefinitionType.Extension:
438 set.Add("AdvertiseExecuteSequence/RegisterExtensionInfo"); 438 set.Add("AdvertiseExecuteSequence/RegisterExtensionInfo");
439 set.Add("InstallExecuteSequence/RegisterExtensionInfo"); 439 set.Add("InstallExecuteSequence/RegisterExtensionInfo");
440 set.Add("InstallExecuteSequence/UnregisterExtensionInfo"); 440 set.Add("InstallExecuteSequence/UnregisterExtensionInfo");
441 break; 441 break;
442 case TupleDefinitionType.File: 442 case SymbolDefinitionType.File:
443 set.Add("InstallExecuteSequence/InstallFiles"); 443 set.Add("InstallExecuteSequence/InstallFiles");
444 set.Add("InstallExecuteSequence/RemoveFiles"); 444 set.Add("InstallExecuteSequence/RemoveFiles");
445 445
446 var foundFont = false; 446 var foundFont = false;
447 var foundSelfReg = false; 447 var foundSelfReg = false;
448 var foundBindPath = false; 448 var foundBindPath = false;
449 foreach (var file in this.Section.Tuples.OfType<FileTuple>()) 449 foreach (var file in this.Section.Symbols.OfType<FileSymbol>())
450 { 450 {
451 if (!foundFont && !String.IsNullOrEmpty(file.FontTitle)) 451 if (!foundFont && !String.IsNullOrEmpty(file.FontTitle))
452 { 452 {
@@ -469,83 +469,83 @@ namespace WixToolset.Core.WindowsInstaller.Bind
469 } 469 }
470 } 470 }
471 break; 471 break;
472 case TupleDefinitionType.IniFile: 472 case SymbolDefinitionType.IniFile:
473 set.Add("InstallExecuteSequence/WriteIniValues"); 473 set.Add("InstallExecuteSequence/WriteIniValues");
474 set.Add("InstallExecuteSequence/RemoveIniValues"); 474 set.Add("InstallExecuteSequence/RemoveIniValues");
475 break; 475 break;
476 case TupleDefinitionType.IsolatedComponent: 476 case SymbolDefinitionType.IsolatedComponent:
477 set.Add("InstallExecuteSequence/IsolateComponents"); 477 set.Add("InstallExecuteSequence/IsolateComponents");
478 break; 478 break;
479 case TupleDefinitionType.LaunchCondition: 479 case SymbolDefinitionType.LaunchCondition:
480 set.Add("InstallExecuteSequence/LaunchConditions"); 480 set.Add("InstallExecuteSequence/LaunchConditions");
481 set.Add("InstallUISequence/LaunchConditions"); 481 set.Add("InstallUISequence/LaunchConditions");
482 break; 482 break;
483 case TupleDefinitionType.MIME: 483 case SymbolDefinitionType.MIME:
484 set.Add("AdvertiseExecuteSequence/RegisterMIMEInfo"); 484 set.Add("AdvertiseExecuteSequence/RegisterMIMEInfo");
485 set.Add("InstallExecuteSequence/RegisterMIMEInfo"); 485 set.Add("InstallExecuteSequence/RegisterMIMEInfo");
486 set.Add("InstallExecuteSequence/UnregisterMIMEInfo"); 486 set.Add("InstallExecuteSequence/UnregisterMIMEInfo");
487 break; 487 break;
488 case TupleDefinitionType.MoveFile: 488 case SymbolDefinitionType.MoveFile:
489 set.Add("InstallExecuteSequence/MoveFiles"); 489 set.Add("InstallExecuteSequence/MoveFiles");
490 break; 490 break;
491 case TupleDefinitionType.Assembly: 491 case SymbolDefinitionType.Assembly:
492 set.Add("AdvertiseExecuteSequence/MsiPublishAssemblies"); 492 set.Add("AdvertiseExecuteSequence/MsiPublishAssemblies");
493 set.Add("InstallExecuteSequence/MsiPublishAssemblies"); 493 set.Add("InstallExecuteSequence/MsiPublishAssemblies");
494 set.Add("InstallExecuteSequence/MsiUnpublishAssemblies"); 494 set.Add("InstallExecuteSequence/MsiUnpublishAssemblies");
495 break; 495 break;
496 case TupleDefinitionType.MsiServiceConfig: 496 case SymbolDefinitionType.MsiServiceConfig:
497 case TupleDefinitionType.MsiServiceConfigFailureActions: 497 case SymbolDefinitionType.MsiServiceConfigFailureActions:
498 set.Add("InstallExecuteSequence/MsiConfigureServices"); 498 set.Add("InstallExecuteSequence/MsiConfigureServices");
499 break; 499 break;
500 case TupleDefinitionType.ODBCDataSource: 500 case SymbolDefinitionType.ODBCDataSource:
501 case TupleDefinitionType.ODBCTranslator: 501 case SymbolDefinitionType.ODBCTranslator:
502 case TupleDefinitionType.ODBCDriver: 502 case SymbolDefinitionType.ODBCDriver:
503 set.Add("InstallExecuteSequence/SetODBCFolders"); 503 set.Add("InstallExecuteSequence/SetODBCFolders");
504 set.Add("InstallExecuteSequence/InstallODBC"); 504 set.Add("InstallExecuteSequence/InstallODBC");
505 set.Add("InstallExecuteSequence/RemoveODBC"); 505 set.Add("InstallExecuteSequence/RemoveODBC");
506 break; 506 break;
507 case TupleDefinitionType.ProgId: 507 case SymbolDefinitionType.ProgId:
508 set.Add("AdvertiseExecuteSequence/RegisterProgIdInfo"); 508 set.Add("AdvertiseExecuteSequence/RegisterProgIdInfo");
509 set.Add("InstallExecuteSequence/RegisterProgIdInfo"); 509 set.Add("InstallExecuteSequence/RegisterProgIdInfo");
510 set.Add("InstallExecuteSequence/UnregisterProgIdInfo"); 510 set.Add("InstallExecuteSequence/UnregisterProgIdInfo");
511 break; 511 break;
512 case TupleDefinitionType.PublishComponent: 512 case SymbolDefinitionType.PublishComponent:
513 set.Add("AdvertiseExecuteSequence/PublishComponents"); 513 set.Add("AdvertiseExecuteSequence/PublishComponents");
514 set.Add("InstallExecuteSequence/PublishComponents"); 514 set.Add("InstallExecuteSequence/PublishComponents");
515 set.Add("InstallExecuteSequence/UnpublishComponents"); 515 set.Add("InstallExecuteSequence/UnpublishComponents");
516 break; 516 break;
517 case TupleDefinitionType.Registry: 517 case SymbolDefinitionType.Registry:
518 case TupleDefinitionType.RemoveRegistry: 518 case SymbolDefinitionType.RemoveRegistry:
519 set.Add("InstallExecuteSequence/WriteRegistryValues"); 519 set.Add("InstallExecuteSequence/WriteRegistryValues");
520 set.Add("InstallExecuteSequence/RemoveRegistryValues"); 520 set.Add("InstallExecuteSequence/RemoveRegistryValues");
521 break; 521 break;
522 case TupleDefinitionType.RemoveFile: 522 case SymbolDefinitionType.RemoveFile:
523 set.Add("InstallExecuteSequence/RemoveFiles"); 523 set.Add("InstallExecuteSequence/RemoveFiles");
524 break; 524 break;
525 case TupleDefinitionType.ServiceControl: 525 case SymbolDefinitionType.ServiceControl:
526 set.Add("InstallExecuteSequence/StartServices"); 526 set.Add("InstallExecuteSequence/StartServices");
527 set.Add("InstallExecuteSequence/StopServices"); 527 set.Add("InstallExecuteSequence/StopServices");
528 set.Add("InstallExecuteSequence/DeleteServices"); 528 set.Add("InstallExecuteSequence/DeleteServices");
529 break; 529 break;
530 case TupleDefinitionType.ServiceInstall: 530 case SymbolDefinitionType.ServiceInstall:
531 set.Add("InstallExecuteSequence/InstallServices"); 531 set.Add("InstallExecuteSequence/InstallServices");
532 break; 532 break;
533 case TupleDefinitionType.Shortcut: 533 case SymbolDefinitionType.Shortcut:
534 set.Add("AdvertiseExecuteSequence/CreateShortcuts"); 534 set.Add("AdvertiseExecuteSequence/CreateShortcuts");
535 set.Add("InstallExecuteSequence/CreateShortcuts"); 535 set.Add("InstallExecuteSequence/CreateShortcuts");
536 set.Add("InstallExecuteSequence/RemoveShortcuts"); 536 set.Add("InstallExecuteSequence/RemoveShortcuts");
537 break; 537 break;
538 case TupleDefinitionType.TypeLib: 538 case SymbolDefinitionType.TypeLib:
539 set.Add("InstallExecuteSequence/RegisterTypeLibraries"); 539 set.Add("InstallExecuteSequence/RegisterTypeLibraries");
540 set.Add("InstallExecuteSequence/UnregisterTypeLibraries"); 540 set.Add("InstallExecuteSequence/UnregisterTypeLibraries");
541 break; 541 break;
542 case TupleDefinitionType.Upgrade: 542 case SymbolDefinitionType.Upgrade:
543 set.Add("InstallExecuteSequence/FindRelatedProducts"); 543 set.Add("InstallExecuteSequence/FindRelatedProducts");
544 set.Add("InstallUISequence/FindRelatedProducts"); 544 set.Add("InstallUISequence/FindRelatedProducts");
545 545
546 // Only add the MigrateFeatureStates action if MigrateFeature attribute is set on 546 // Only add the MigrateFeatureStates action if MigrateFeature attribute is set on
547 // at least one UpgradeVersion element. 547 // at least one UpgradeVersion element.
548 if (this.Section.Tuples.OfType<UpgradeTuple>().Any(t => t.MigrateFeatures)) 548 if (this.Section.Symbols.OfType<UpgradeSymbol>().Any(t => t.MigrateFeatures))
549 { 549 {
550 set.Add("InstallExecuteSequence/MigrateFeatureStates"); 550 set.Add("InstallExecuteSequence/MigrateFeatureStates");
551 set.Add("InstallUISequence/MigrateFeatureStates"); 551 set.Add("InstallUISequence/MigrateFeatureStates");
@@ -557,7 +557,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
557 return set; 557 return set;
558 } 558 }
559 559
560 private IEnumerable<WixActionTuple> GetActions(SequenceTable sequence, string[] actionNames) 560 private IEnumerable<WixActionSymbol> GetActions(SequenceTable sequence, string[] actionNames)
561 { 561 {
562 foreach (var action in WindowsInstallerStandard.StandardActions()) 562 foreach (var action in WindowsInstallerStandard.StandardActions())
563 { 563 {
@@ -571,64 +571,64 @@ namespace WixToolset.Core.WindowsInstaller.Bind
571 /// <summary> 571 /// <summary>
572 /// Sequence an action before or after a standard action. 572 /// Sequence an action before or after a standard action.
573 /// </summary> 573 /// </summary>
574 /// <param name="actionTuple">The action tuple to be sequenced.</param> 574 /// <param name="actionSymbol">The action symbol to be sequenced.</param>
575 /// <param name="requiredActionTuples">Collection of actions which must be included.</param> 575 /// <param name="requiredActionSymbols">Collection of actions which must be included.</param>
576 private void SequenceActionTuple(WixActionTuple actionTuple, Dictionary<string, WixActionTuple> requiredActionTuples) 576 private void SequenceActionSymbol(WixActionSymbol actionSymbol, Dictionary<string, WixActionSymbol> requiredActionSymbols)
577 { 577 {
578 var after = false; 578 var after = false;
579 579
580 if (actionTuple.After != null) 580 if (actionSymbol.After != null)
581 { 581 {
582 after = true; 582 after = true;
583 } 583 }
584 else if (actionTuple.Before == null) 584 else if (actionSymbol.Before == null)
585 { 585 {
586 throw new InvalidOperationException("Found an action with no Sequence, Before, or After column set."); 586 throw new InvalidOperationException("Found an action with no Sequence, Before, or After column set.");
587 } 587 }
588 588
589 var parentActionName = (after ? actionTuple.After : actionTuple.Before); 589 var parentActionName = (after ? actionSymbol.After : actionSymbol.Before);
590 var parentActionKey = actionTuple.SequenceTable.ToString() + "/" + parentActionName; 590 var parentActionKey = actionSymbol.SequenceTable.ToString() + "/" + parentActionName;
591 591
592 if (!requiredActionTuples.TryGetValue(parentActionKey, out var parentActionTuple)) 592 if (!requiredActionSymbols.TryGetValue(parentActionKey, out var parentActionSymbol))
593 { 593 {
594 // If the missing parent action is a standard action (with a suggested sequence number), add it. 594 // If the missing parent action is a standard action (with a suggested sequence number), add it.
595 if (WindowsInstallerStandard.TryGetStandardAction(parentActionKey, out parentActionTuple)) 595 if (WindowsInstallerStandard.TryGetStandardAction(parentActionKey, out parentActionSymbol))
596 { 596 {
597 // Create a clone to avoid modifying the static copy of the object. 597 // Create a clone to avoid modifying the static copy of the object.
598 // TODO: consider this: parentActionTuple = parentActionTuple.Clone(); 598 // TODO: consider this: parentActionSymbol = parentActionSymbol.Clone();
599 599
600 requiredActionTuples.Add(parentActionTuple.Id.Id, parentActionTuple); 600 requiredActionSymbols.Add(parentActionSymbol.Id.Id, parentActionSymbol);
601 } 601 }
602 else 602 else
603 { 603 {
604 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, "Found an action with a non-existent {0} action: {1}.", (after ? "After" : "Before"), parentActionName)); 604 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, "Found an action with a non-existent {0} action: {1}.", (after ? "After" : "Before"), parentActionName));
605 } 605 }
606 } 606 }
607 else if (actionTuple == parentActionTuple || this.ContainsChildActionTuple(actionTuple, parentActionTuple)) // cycle detected 607 else if (actionSymbol == parentActionSymbol || this.ContainsChildActionSymbol(actionSymbol, parentActionSymbol)) // cycle detected
608 { 608 {
609 throw new WixException(ErrorMessages.ActionCircularDependency(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action, parentActionTuple.Action)); 609 throw new WixException(ErrorMessages.ActionCircularDependency(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action, parentActionSymbol.Action));
610 } 610 }
611 611
612 // Add this action to the appropriate list of dependent action tuples. 612 // Add this action to the appropriate list of dependent action symbols.
613 var relativeActions = this.GetRelativeActions(parentActionTuple); 613 var relativeActions = this.GetRelativeActions(parentActionSymbol);
614 var relatedTuples = (after ? relativeActions.NextActions : relativeActions.PreviousActions); 614 var relatedSymbols = (after ? relativeActions.NextActions : relativeActions.PreviousActions);
615 relatedTuples.Add(actionTuple); 615 relatedSymbols.Add(actionSymbol);
616 } 616 }
617 617
618 private bool ContainsChildActionTuple(WixActionTuple childTuple, WixActionTuple parentTuple) 618 private bool ContainsChildActionSymbol(WixActionSymbol childSymbol, WixActionSymbol parentSymbol)
619 { 619 {
620 var result = false; 620 var result = false;
621 621
622 if (this.RelativeActionsForActions.TryGetValue(childTuple.Id.Id, out var relativeActions)) 622 if (this.RelativeActionsForActions.TryGetValue(childSymbol.Id.Id, out var relativeActions))
623 { 623 {
624 result = relativeActions.NextActions.Any(a => a.SequenceTable == parentTuple.SequenceTable && a.Id.Id == parentTuple.Id.Id) || 624 result = relativeActions.NextActions.Any(a => a.SequenceTable == parentSymbol.SequenceTable && a.Id.Id == parentSymbol.Id.Id) ||
625 relativeActions.PreviousActions.Any(a => a.SequenceTable == parentTuple.SequenceTable && a.Id.Id == parentTuple.Id.Id); 625 relativeActions.PreviousActions.Any(a => a.SequenceTable == parentSymbol.SequenceTable && a.Id.Id == parentSymbol.Id.Id);
626 } 626 }
627 627
628 return result; 628 return result;
629 } 629 }
630 630
631 private RelativeActions GetRelativeActions(WixActionTuple action) 631 private RelativeActions GetRelativeActions(WixActionSymbol action)
632 { 632 {
633 if (!this.RelativeActionsForActions.TryGetValue(action.Id.Id, out var relativeActions)) 633 if (!this.RelativeActionsForActions.TryGetValue(action.Id.Id, out var relativeActions))
634 { 634 {
@@ -639,7 +639,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
639 return relativeActions; 639 return relativeActions;
640 } 640 }
641 641
642 private RelativeActions GetAllRelativeActionsForSequenceType(SequenceTable sequenceType, WixActionTuple action) 642 private RelativeActions GetAllRelativeActionsForSequenceType(SequenceTable sequenceType, WixActionSymbol action)
643 { 643 {
644 var relativeActions = new RelativeActions(); 644 var relativeActions = new RelativeActions();
645 645
@@ -653,7 +653,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
653 return relativeActions; 653 return relativeActions;
654 } 654 }
655 655
656 private void RecurseRelativeActionsForSequenceType(SequenceTable sequenceType, List<WixActionTuple> actions, List<WixActionTuple> visitedActions) 656 private void RecurseRelativeActionsForSequenceType(SequenceTable sequenceType, List<WixActionSymbol> actions, List<WixActionSymbol> visitedActions)
657 { 657 {
658 foreach (var action in actions.Where(a => a.SequenceTable == sequenceType)) 658 foreach (var action in actions.Where(a => a.SequenceTable == sequenceType))
659 { 659 {
@@ -673,9 +673,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
673 673
674 private class RelativeActions 674 private class RelativeActions
675 { 675 {
676 public List<WixActionTuple> PreviousActions { get; } = new List<WixActionTuple>(); 676 public List<WixActionSymbol> PreviousActions { get; } = new List<WixActionSymbol>();
677 677
678 public List<WixActionTuple> NextActions { get; } = new List<WixActionTuple>(); 678 public List<WixActionSymbol> NextActions { get; } = new List<WixActionSymbol>();
679 } 679 }
680 } 680 }
681} 681}