File: Diagnostic\ExternalFileLocation.cs
Web Access
Project: src\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis)
// 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.
 
using System;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis
{
    /// <summary>
    /// A program location in source code.
    /// </summary>
    internal sealed class ExternalFileLocation : Location, IEquatable<ExternalFileLocation?>
    {
        private readonly TextSpan _sourceSpan;
        private readonly FileLinePositionSpan _lineSpan, _mappedLineSpan;
 
        internal ExternalFileLocation(string filePath, TextSpan sourceSpan, LinePositionSpan lineSpan)
        {
            _sourceSpan = sourceSpan;
            _lineSpan = new FileLinePositionSpan(filePath, lineSpan);
            _mappedLineSpan = _lineSpan;
        }
 
        internal ExternalFileLocation(string filePath, TextSpan sourceSpan, LinePositionSpan lineSpan, string mappedFilePath, LinePositionSpan mappedLineSpan)
        {
            _sourceSpan = sourceSpan;
            _lineSpan = new FileLinePositionSpan(filePath, lineSpan);
            _mappedLineSpan = new FileLinePositionSpan(mappedFilePath, mappedLineSpan, hasMappedPath: true);
        }
 
        public override TextSpan SourceSpan
        {
            get
            {
                return _sourceSpan;
            }
        }
 
        public override FileLinePositionSpan GetLineSpan()
        {
            return _lineSpan;
        }
 
        public override FileLinePositionSpan GetMappedLineSpan()
        {
            return _mappedLineSpan;
        }
 
        public override LocationKind Kind
        {
            get
            {
                return LocationKind.ExternalFile;
            }
        }
 
        public override bool Equals(object? obj)
        {
            return this.Equals(obj as ExternalFileLocation);
        }
 
        public bool Equals(ExternalFileLocation? obj)
        {
            if (ReferenceEquals(obj, this))
            {
                return true;
            }
 
            return obj != null
                && _sourceSpan == obj._sourceSpan
                && _lineSpan.Equals(obj._lineSpan)
                && _mappedLineSpan.Equals(obj._mappedLineSpan);
        }
 
        public override int GetHashCode()
        {
            return Hash.Combine(_lineSpan.GetHashCode(),
                Hash.Combine(_mappedLineSpan.GetHashCode(), _sourceSpan.GetHashCode()));
        }
    }
}