|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#pragma warning disable 436 // The type 'RelativePathResolver' conflicts with imported type
using System;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq;
using Roslyn.Utilities;
using System.IO;
namespace Microsoft.CodeAnalysis
{
internal class RelativePathResolver : IEquatable<RelativePathResolver>
{
public ImmutableArray<string> SearchPaths { get; }
public string? BaseDirectory { get; }
/// <summary>
/// Initializes a new instance of the <see cref="RelativePathResolver"/> class.
/// </summary>
/// <param name="searchPaths">An ordered set of fully qualified
/// paths which are searched when resolving assembly names.</param>
/// <param name="baseDirectory">Directory used when resolving relative paths.</param>
public RelativePathResolver(ImmutableArray<string> searchPaths, string? baseDirectory)
{
Debug.Assert(searchPaths.All(PathUtilities.IsAbsolute));
Debug.Assert(baseDirectory == null || PathUtilities.GetPathKind(baseDirectory) == PathKind.Absolute);
SearchPaths = searchPaths;
BaseDirectory = baseDirectory;
}
public string? ResolvePath(string reference, string? baseFilePath)
{
string? resolvedPath = FileUtilities.ResolveRelativePath(reference, baseFilePath, BaseDirectory, SearchPaths, FileExists);
if (resolvedPath == null)
{
return null;
}
return FileUtilities.TryNormalizeAbsolutePath(resolvedPath);
}
protected virtual bool FileExists(string fullPath)
{
Debug.Assert(fullPath != null);
Debug.Assert(PathUtilities.IsAbsolute(fullPath));
return File.Exists(fullPath);
}
public RelativePathResolver WithSearchPaths(ImmutableArray<string> searchPaths) =>
new(searchPaths, BaseDirectory);
public RelativePathResolver WithBaseDirectory(string? baseDirectory) =>
new(SearchPaths, baseDirectory);
public bool Equals(RelativePathResolver? other) =>
other is not null && BaseDirectory == other.BaseDirectory && SearchPaths.SequenceEqual(other.SearchPaths);
public override int GetHashCode() =>
Hash.Combine(BaseDirectory, Hash.CombineValues(SearchPaths));
public override bool Equals(object? obj) => Equals(obj as RelativePathResolver);
}
}
|