<!--
 ***********************************************************************************************
 Microsoft.CodeCoverage.targets

 WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
           created a backup copy.  Incorrect changes to this file will make it
           impossible to load or build your test projects from the command-line or the IDE.

 Copyright (c) Microsoft. All rights reserved.
 ***********************************************************************************************
-->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- This target required to enable /collect:"Code Coverage" in "dotnet publish" scenario with "dotnet vstest".
       E.g: Release pipelines where user/project nuget cache not available on current machine. -->
  <Target Name="CopyTraceDataCollectorArtifacts" AfterTargets="ComputeFilesToPublish">

    <ItemGroup>
      <TraceDataCollectorArtifacts Include="$(MSBuildThisFileDirectory)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(TraceDataCollectorArtifacts)" DestinationFolder="$(PublishDir)%(RecursiveDir)" />

  </Target>

  <PropertyGroup Condition="'$(NETCoreSdkVersion)' != ''">
    <_msCoverageSdkNETCoreSdkVersion>$(NETCoreSdkVersion)</_msCoverageSdkNETCoreSdkVersion>
    <_msCoverageSdkNETCoreSdkVersion Condition="$(_msCoverageSdkNETCoreSdkVersion.Contains('-'))">$(_msCoverageSdkNETCoreSdkVersion.Split('-')[0])</_msCoverageSdkNETCoreSdkVersion>
    <_msCoverageSdkMinVersionWithDependencyTarget>6.0.100</_msCoverageSdkMinVersionWithDependencyTarget>
    <_msCoverageSourceRootTargetName>MsCoverageGetPathMap</_msCoverageSourceRootTargetName>
    <_msCoverageSourceRootTargetName Condition="'$([System.Version]::Parse($(_msCoverageSdkNETCoreSdkVersion)).CompareTo($([System.Version]::Parse($(_msCoverageSdkMinVersionWithDependencyTarget)))))' &gt;= '0' ">InitializeSourceRootMappedPaths</_msCoverageSourceRootTargetName>
  </PropertyGroup>

  <!-- This target required to store deterministic sources mapping.
       It is modified version of https://github.com/coverlet-coverage/coverlet/blob/d1ca364b7dbff38abce0457d94c4ce1b7e3a4cd9/src/coverlet.collector/build/coverlet.collector.targets#L35 -->
  <Target Condition="'$(NETCoreSdkVersion)' != ''" Name="MsCoverageReferencedPathMaps" BeforeTargets="CoreCompile" DependsOnTargets="ResolveProjectReferences" >
    <MSBuild Projects="@(AnnotatedProjects->'%(FullPath)')"
             Targets="$(_msCoverageSourceRootTargetName)"
             Properties="TargetFramework=%(AnnotatedProjects.NearestTargetFramework)"
             SkipNonexistentTargets="true">
      <Output TaskParameter="TargetOutputs"
              ItemName="_msCoverageLocalTopLevelSourceRoot" />
    </MSBuild>
    <ItemGroup>
      <_msCoverageByProject Include="@(_msCoverageLocalTopLevelSourceRoot->'%(MSBuildSourceProjectFile)')" OriginalPath="%(Identity)" />
      <_msCoverageMapping Include="@(_msCoverageByProject->'%(Identity)|%(OriginalPath)=%(MappedPath)')" />
    </ItemGroup>
    <PropertyGroup>
      <_msCoverageSourceRootMappingFilePath>$([MSBuild]::EnsureTrailingSlash('$(OutputPath)')).msCoverageSourceRootsMapping_$(AssemblyName)</_msCoverageSourceRootMappingFilePath>
    </PropertyGroup>
    <WriteLinesToFile File="$(_msCoverageSourceRootMappingFilePath)" Lines="@(_msCoverageMapping)"
                      Overwrite="true" Encoding="Unicode"
                      Condition="'@(_msCoverageMapping)'!=''"
                      WriteOnlyWhenDifferent="true" />
    <ItemGroup>
      <FileWrites Include="$(_msCoverageSourceRootMappingFilePath)" Condition="'@(_msCoverageMapping)'!=''" />
    </ItemGroup>
  </Target>
</Project>
