File: Differs\Differences.cs
Web Access
Project: src\src\Microsoft.Cci.Extensions\Microsoft.Cci.Extensions.csproj (Microsoft.Cci.Extensions)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Diagnostics.Contracts;
 
namespace Microsoft.Cci.Differs
{
    public class Difference
    {
        public Difference(object id, string message)
        {
            Contract.Requires(id != null);
            Contract.Requires(message != null);
 
            Id = GetIdFromObject(id);
            Message = message;
        }
 
        public string Id { get; private set; }
 
        public string Message { get; private set; }
 
        private static string GetIdFromObject(object obj)
        {
            Contract.Requires(obj != null);
 
            string id = obj as string;
            if (id != null)
                return id;
 
            Enum en = obj as Enum;
            if (en != null)
                return en.ToString();
 
            return obj.GetType().Name;
        }
 
        public override string ToString()
        {
            return string.Format("{0} : {1}", Id, Message);
        }
    }
 
    public class IncompatibleDifference : Difference
    {
        public IncompatibleDifference(object id, string message)
            : base(id, message)
        {
        }
    }
 
    public class TypeMismatchInCompatibleDifference : IncompatibleDifference
    {
        public TypeMismatchInCompatibleDifference(object id, string message, ITypeReference type1, ITypeReference type2)
            : base(id, message)
        {
            this.Type1 = type1;
            this.Type2 = type2;
        }
 
        public ITypeReference Type1 { get; private set; }
 
        public ITypeReference Type2 { get; private set; }
    }
 
    public class DifferenceWithContext<T> : Difference
    {
        public DifferenceWithContext(object id, string message, T context)
            : base(id, message)
        {
            Context = context;
        }
 
        public T Context { get; private set; }
    }
}