From 7eab295351796e2b41c1805d027957e1a7d9ddc6 Mon Sep 17 00:00:00 2001
From: Rob Mensching <rob@firegiant.com>
Date: Mon, 1 Mar 2021 23:34:57 -0800
Subject: Correctly set the parent SourceLineNumber for include files

---
 src/WixToolset.Core/Preprocessor.cs                |  4 +--
 .../PreprocessorFixture.cs                         | 40 ++++++++++++++++++++++
 .../TestData/IncludePath/Package.wxs               |  2 +-
 .../TestData/IncludePath/PackageComponents.wxs     |  4 +--
 .../TestData/IncludePath/data/DontDoThis.wxi       |  6 ++++
 5 files changed, 50 insertions(+), 6 deletions(-)
 create mode 100644 src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/data/DontDoThis.wxi

(limited to 'src')

diff --git a/src/WixToolset.Core/Preprocessor.cs b/src/WixToolset.Core/Preprocessor.cs
index b111b291..81b17578 100644
--- a/src/WixToolset.Core/Preprocessor.cs
+++ b/src/WixToolset.Core/Preprocessor.cs
@@ -1351,7 +1351,7 @@ namespace WixToolset.Core
 
                 if (state.Context.CurrentSourceLineNumber.LineNumber != newLine)
                 {
-                    state.Context.CurrentSourceLineNumber = new SourceLineNumber(state.Context.CurrentSourceLineNumber.FileName, newLine);
+                    state.Context.CurrentSourceLineNumber = new SourceLineNumber(state.Context.CurrentSourceLineNumber.FileName, state.Context.CurrentSourceLineNumber.Parent, newLine);
                 }
             }
         }
@@ -1372,7 +1372,7 @@ namespace WixToolset.Core
 
             state.CurrentFileStack.Push(path);
             state.SourceStack.Push(state.Context.CurrentSourceLineNumber);
-            state.Context.CurrentSourceLineNumber = new SourceLineNumber(path);
+            state.Context.CurrentSourceLineNumber = new SourceLineNumber(path, state.Context.CurrentSourceLineNumber);
             state.IncludeNextStack.Push(true);
         }
 
diff --git a/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs b/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
index aad3ed73..89057991 100644
--- a/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
+++ b/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
@@ -8,6 +8,7 @@ namespace WixToolsetTest.CoreIntegration
     using WixToolset.Core;
     using WixToolset.Core.TestPackage;
     using WixToolset.Data;
+    using WixToolset.Data.Symbols;
     using WixToolset.Extensibility.Data;
     using Xunit;
 
@@ -39,6 +40,45 @@ namespace WixToolsetTest.CoreIntegration
             Assert.Null(includedFile.SourceLineNumbers.Parent);
         }
 
+        [Fact]
+        public void IncludeSourceLineNumbersPreserved()
+        {
+            var folder = TestData.Get(@"TestData\IncludePath");
+
+            using (var fs = new DisposableFileSystem())
+            {
+                var baseFolder = fs.GetFolder();
+                var intermediateFolder = Path.Combine(baseFolder, "obj");
+
+                var result = WixRunner.Execute(warningsAsErrors: false, new[]
+                {
+                    "build",
+                    Path.Combine(folder, "Package.wxs"),
+                    Path.Combine(folder, "PackageComponents.wxs"),
+                    "-loc", Path.Combine(folder, "Package.en-us.wxl"),
+                    "-includepath", Path.Combine(folder, "data"),
+                    "-bindpath", Path.Combine(folder, "data"),
+                    "-intermediateFolder", intermediateFolder,
+                    "-o", Path.Combine(baseFolder, @"bin\test.msi")
+                });
+
+                result.AssertSuccess();
+
+                using (var output = WixOutput.Read(Path.Combine(baseFolder, @"bin\test.wixpdb")))
+                {
+                    var intermediate = Intermediate.Load(output);
+                    var component = intermediate.Sections.Single().Symbols.OfType<ComponentSymbol>().Single();
+                    Assert.Equal(3, component.SourceLineNumbers.LineNumber);
+                    Assert.Equal(5, component.SourceLineNumbers.Parent.LineNumber);
+
+                    var encoded = component.SourceLineNumbers.GetEncoded();
+                    var decoded = SourceLineNumber.CreateFromEncoded(encoded);
+                    Assert.Equal(3, decoded.LineNumber);
+                    Assert.Equal(5, decoded.Parent.LineNumber);
+                }
+            }
+        }
+
         [Fact]
         /// <remarks>
         /// This test will fail on 32-bit operating systems because it depends on "CommonProgramFiles(x86)"
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/Package.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/Package.wxs
index 6269fe9d..48a38e85 100644
--- a/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/Package.wxs
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/Package.wxs
@@ -1,4 +1,4 @@
-<?include Package.wxi ?>
+<?include Package.wxi ?>
 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
   <Package Name="MsiPackage" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="no" InstallerVersion="200" Scope="perMachine">
     
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/PackageComponents.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/PackageComponents.wxs
index e26c4509..7a0485ed 100644
--- a/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/PackageComponents.wxs
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/PackageComponents.wxs
@@ -2,9 +2,7 @@
 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
   <Fragment>
     <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
-       <Component>
-         <File Source="test.txt" />
-       </Component>
+        <?include DontDoThis.wxi ?>
     </ComponentGroup>
   </Fragment>
 </Wix>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/data/DontDoThis.wxi b/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/data/DontDoThis.wxi
new file mode 100644
index 00000000..03885e3e
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/IncludePath/data/DontDoThis.wxi
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
+  <Component>
+    <File Source="test.txt" />
+  </Component>
+</Include>
-- 
cgit v1.2.3-55-g6feb