<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="AddReferenceFromRuntimeForTests"
          AfterTargets="ResolveAssemblyReferences"
          Condition="'$(IsTestProject)'=='true' AND '@(ReferenceFromRuntime)' != ''">
    <ItemGroup>
      <!-- tests can use anything from the RuntimePath -->
      <ReferencePath Include="@(ReferenceFromRuntime->'$(RuntimePath)%(Identity).dll')" />
      <ReferenceCopyLocalPaths Condition="'%(ReferenceFromRuntime.Private)' == 'true'" Include="@(ReferenceFromRuntime->'$(RuntimePath)%(Identity).dll')" />
    </ItemGroup>
  </Target>

  <Target Name="AddRuntimeProjectReference"
          BeforeTargets="AddProjectReferencesDynamically"
          Condition="'$(IsTestProject)'!='true' AND '@(ReferenceFromRuntime)' != ''">
    <Error Condition="('$(IsReferenceAssembly)' != 'true' OR '$(AllowReferenceFromRuntime)' == 'true') AND '$(RuntimeProjectFile)' == ''" Text="RuntimeProjectFile must be specified when using ReferenceFromRuntime from source projects." />
    <Error Condition="'$(IsReferenceAssembly)' == 'true' AND '$(AllowReferenceFromRuntime)' != 'true'" Text="ReferenceFromRuntime may not be used from reference assemblies." />

    <ItemGroup>
      <ProjectReference Include="$(RuntimeProjectFile)">
        <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
        <OutputItemType>_referencePathFromRuntime</OutputItemType>
      </ProjectReference>
    </ItemGroup>
  </Target>

  <Target Name="FilterReferenceFromRuntime"
          AfterTargets="ResolveProjectReferences"
          Condition="'$(IsTestProject)'!='true' AND '@(ReferenceFromRuntime)' != ''">
    <ItemGroup>
      <!-- transform to filename in order to intersect -->
      <_referencePathFromRuntimeByFileName Include="@(_referencePathFromRuntime->'%(FileName)')" Condition="'%(_referencePathFromRuntime.Extension)' == '.dll'" >
        <ReferencePath>%(Identity)</ReferencePath>
      </_referencePathFromRuntimeByFileName>

      <!-- intersect with ReferenceFromRuntime -->
      <_filteredReferencePathFromRuntimeByFileName Include="@(_referencePathFromRuntimeByFileName)"
          Condition="'@(_referencePathFromRuntimeByFileName)' == '@(ReferenceFromRuntime)' AND '%(Identity)' != ''" />

      <_remainingReferenceFromRuntime Include="@(ReferenceFromRuntime)" Exclude="@(_filteredReferencePathFromRuntimeByFileName)" />

      <!-- Fallback and check for native images for the references as well -->
      <_remainingReferenceFromRuntimeWithNI Include="@(_remainingReferenceFromRuntime->'%(Identity).ni')">
        <OriginalReferenceFromRuntime>%(Identity)</OriginalReferenceFromRuntime>
      </_remainingReferenceFromRuntimeWithNI>

      <_filteredReferencePathFromRuntimeByFileName Include="@(_referencePathFromRuntimeByFileName)"
          Condition="'@(_referencePathFromRuntimeByFileName)' == '@(_remainingReferenceFromRuntimeWithNI)' AND '%(Identity)' != ''" />

      <_missingReferenceFromRuntime Include="@(_remainingReferenceFromRuntimeWithNI)" Exclude="@(_filteredReferencePathFromRuntimeByFileName)" />

      <!-- transform back to path -->
      <ReferencePath Include="@(_filteredReferencePathFromRuntimeByFileName->'%(ReferencePath)')" />
    </ItemGroup>

    <Error Condition="'@(_missingReferenceFromRuntime)' != ''"
           Text="Could not resolve ReferenceFromRuntime item(s) '%(_missingReferenceFromRuntime.OriginalReferenceFromRuntime)' from '$(RuntimeProjectFile)'." />
  </Target>
</Project>