Correctly set the parent SourceLineNumber for include files
Rob Mensching committed
Mar 1, 2021 at 23:34 UTC
7eab295351796e2b41c1805d027957e1a7d9ddc6
5 files changed
+50
-6
src/WixToolset.Core/Preprocessor.cs
+2
-2
@@ -1351,7 +1351,7 @@ namespace WixToolset.Core
1351
1352
if (state.Context.CurrentSourceLineNumber.LineNumber != newLine)
1353
{
1354
- state.Context.CurrentSourceLineNumber = new SourceLineNumber(state.Context.CurrentSourceLineNumber.FileName, newLine);
1354
+ state.Context.CurrentSourceLineNumber = new SourceLineNumber(state.Context.CurrentSourceLineNumber.FileName, state.Context.CurrentSourceLineNumber.Parent, newLine);
1355
}
1356
}
1357
}
@@ -1372,7 +1372,7 @@ namespace WixToolset.Core
1372
1373
state.CurrentFileStack.Push(path);
1374
state.SourceStack.Push(state.Context.CurrentSourceLineNumber);
1375
- state.Context.CurrentSourceLineNumber = new SourceLineNumber(path);
1375
+ state.Context.CurrentSourceLineNumber = new SourceLineNumber(path, state.Context.CurrentSourceLineNumber);
1376
state.IncludeNextStack.Push(true);
1377
}
1378
src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
+40
@@ -8,6 +8,7 @@ namespace WixToolsetTest.CoreIntegration
8
using WixToolset.Core;
9
using WixToolset.Core.TestPackage;
10
using WixToolset.Data;
11
+ using WixToolset.Data.Symbols;
12
using WixToolset.Extensibility.Data;
13
using Xunit;
14
@@ -39,6 +40,45 @@ namespace WixToolsetTest.CoreIntegration
40
Assert.Null(includedFile.SourceLineNumbers.Parent);
41
}
42
43
+ [Fact]
44
+ public void IncludeSourceLineNumbersPreserved()
45
+ {
46
+ var folder = TestData.Get(@"TestData\IncludePath");
47
+
48
+ using (var fs = new DisposableFileSystem())
49
+ {
50
+ var baseFolder = fs.GetFolder();
51
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
52
+
53
+ var result = WixRunner.Execute(warningsAsErrors: false, new[]
54
+ {
55
+ "build",
56
+ Path.Combine(folder, "Package.wxs"),
57
+ Path.Combine(folder, "PackageComponents.wxs"),
58
+ "-loc", Path.Combine(folder, "Package.en-us.wxl"),
59
+ "-includepath", Path.Combine(folder, "data"),
60
+ "-bindpath", Path.Combine(folder, "data"),
61
+ "-intermediateFolder", intermediateFolder,
62
+ "-o", Path.Combine(baseFolder, @"bin\test.msi")
63
+ });
64
+
65
+ result.AssertSuccess();
66
+
67
+ using (var output = WixOutput.Read(Path.Combine(baseFolder, @"bin\test.wixpdb")))
68
+ {
69
+ var intermediate = Intermediate.Load(output);
70
+ var component = intermediate.Sections.Single().Symbols.OfType<ComponentSymbol>().Single();
71
+ Assert.Equal(3, component.SourceLineNumbers.LineNumber);
72
+ Assert.Equal(5, component.SourceLineNumbers.Parent.LineNumber);
73
+
74
+ var encoded = component.SourceLineNumbers.GetEncoded();
75
+ var decoded = SourceLineNumber.CreateFromEncoded(encoded);
76
+ Assert.Equal(3, decoded.LineNumber);
77
+ Assert.Equal(5, decoded.Parent.LineNumber);
78
+ }
79
+ }
80
+ }
81
+
82
[Fact]
83
/// <remarks>
84
/// This test will fail on 32-bit operating systems because it depends on "CommonProgramFiles(x86)"
src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/Package.wxs
+1
-1
@@ -1,4 +1,4 @@
1
-<?include Package.wxi ?>
1
+<?include Package.wxi ?>
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Package Name="MsiPackage" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="no" InstallerVersion="200" Scope="perMachine">
4
src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/PackageComponents.wxs
+1
-3
@@ -2,9 +2,7 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
5
- <Component>
6
- <File Source="test.txt" />
7
- </Component>
5
+ <?include DontDoThis.wxi ?>
6
</ComponentGroup>
7
</Fragment>
8
</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/data/DontDoThis.wxi
new
+6
@@ -0,0 +1,6 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Component>
4
+ <File Source="test.txt" />
5
+ </Component>
6
+</Include>