public static FrameworkedHintPath ReconstructHintPath(
      string assemblyFilePath,
      PackageIdentity oldPackageIdentity,
      PackageReference newestPackage,
      Reference reference )
        {
            var parts = assemblyFilePath.Split( Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar ).ToList();

              var newFramework = parts.Select( NuGetFramework.Parse ).FirstOrDefault( f => !f.IsUnsupported );

              var hintParts = reference.HintPath.Split( Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar ).ToList();

              var oldFramework = hintParts.Select( NuGetFramework.Parse ).FirstOrDefault( f => !f.IsUnsupported );

              List<string> resultPath = new List<string>();

              for ( int i = hintParts.Count - 1; i >= 0; i-- ) {
            if ( hintParts[i].StartsWith( "$" ) ) {
              resultPath.Add( hintParts[i] );
            }
            else if ( hintParts[i].Equals( oldPackageIdentity.ToFolderName() ) ) {
              resultPath.Add( newestPackage.ToFolderName() );
            }
            else if ( oldFramework != null && newFramework != null && hintParts[i].Equals( oldFramework.GetShortFolderName(), StringComparison.OrdinalIgnoreCase ) ) {
              resultPath.Add( newFramework.GetShortFolderName() );
            }
            else {
              resultPath.Add( hintParts[i] );
            }
              }

              resultPath.Reverse();

              return new FrameworkedHintPath {
            Framework = newFramework,
            HintPath = Path.Combine( resultPath.ToArray() )
              };
        }