File: EvaluationContextBase.cs
Web Access
Project: src\src\ExpressionEvaluator\Core\Source\ExpressionCompiler\Microsoft.CodeAnalysis.ExpressionCompiler.csproj (Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler)
// 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 System.Collections.Generic;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using Microsoft.CodeAnalysis.CodeGen;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.VisualStudio.Debugger.Evaluation;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.ExpressionEvaluator
{
    internal abstract class EvaluationContextBase
    {
        internal static readonly AssemblyIdentity SystemIdentity = new AssemblyIdentity("System");
        internal static readonly AssemblyIdentity SystemCoreIdentity = new AssemblyIdentity("System.Core");
        internal static readonly AssemblyIdentity SystemLinqIdentity = new AssemblyIdentity("System.Linq");
        internal static readonly AssemblyIdentity SystemXmlIdentity = new AssemblyIdentity("System.Xml");
        internal static readonly AssemblyIdentity SystemXmlLinqIdentity = new AssemblyIdentity("System.Xml.Linq");
        internal static readonly AssemblyIdentity MicrosoftVisualBasicIdentity = new AssemblyIdentity("Microsoft.VisualBasic");
 
        internal abstract CompileResult? CompileExpression(
            string expr,
            DkmEvaluationFlags compilationFlags,
            ImmutableArray<Alias> aliases,
            DiagnosticBag diagnostics,
            out ResultProperties resultProperties,
            CompilationTestData? testData);
 
        internal abstract CompileResult? CompileAssignment(
            string target,
            string expr,
            ImmutableArray<Alias> aliases,
            DiagnosticBag diagnostics,
            out ResultProperties resultProperties,
            CompilationTestData? testData);
 
        internal abstract ReadOnlyCollection<byte> CompileGetLocals(
            ArrayBuilder<LocalAndMethod> locals,
            bool argumentsOnly,
            ImmutableArray<Alias> aliases,
            DiagnosticBag diagnostics,
            out string typeName,
            CompilationTestData? testData);
 
        internal string GetErrorMessageAndMissingAssemblyIdentities(
            DiagnosticBag diagnostics,
            DiagnosticFormatter formatter,
            CultureInfo? preferredUICulture,
            AssemblyIdentity linqLibrary,
            out bool useReferencedModulesOnly,
            out ImmutableArray<AssemblyIdentity> missingAssemblyIdentities)
        {
            var errors = diagnostics.AsEnumerable().Where(d => d.Severity == DiagnosticSeverity.Error);
            missingAssemblyIdentities = default;
            foreach (var error in errors)
            {
                missingAssemblyIdentities = this.GetMissingAssemblyIdentities(error, linqLibrary);
                if (!missingAssemblyIdentities.IsDefault)
                {
                    break;
                }
            }
 
            if (missingAssemblyIdentities.IsDefault)
            {
                missingAssemblyIdentities = ImmutableArray<AssemblyIdentity>.Empty;
            }
 
            useReferencedModulesOnly = errors.All(HasDuplicateTypesOrAssemblies);
 
            return GetErrorMessage(errors.First(), formatter, preferredUICulture);
        }
 
        internal static string GetErrorMessage(
            Diagnostic error,
            DiagnosticFormatter formatter,
            CultureInfo? preferredUICulture)
        {
            return (error is SimpleMessageDiagnostic simpleMessage)
                ? simpleMessage.GetMessage()
                : formatter.Format(error, preferredUICulture ?? CultureInfo.CurrentUICulture);
        }
 
        internal abstract bool HasDuplicateTypesOrAssemblies(Diagnostic diagnostic);
 
        internal abstract ImmutableArray<AssemblyIdentity> GetMissingAssemblyIdentities(Diagnostic diagnostic, AssemblyIdentity linqLibrary);
 
        // ILOffset == 0xffffffff indicates an instruction outside of IL.
        // Treat such values as the beginning of the IL.
        internal static int NormalizeILOffset(uint ilOffset)
        {
            return (ilOffset == uint.MaxValue) ? 0 : (int)ilOffset;
        }
 
        protected sealed class SimpleMessageDiagnostic : Diagnostic
        {
            private readonly string _message;
 
            internal SimpleMessageDiagnostic(string message)
            {
                _message = message;
            }
 
            public override IReadOnlyList<Location> AdditionalLocations
            {
                get { throw new NotImplementedException(); }
            }
 
            public override DiagnosticDescriptor Descriptor
            {
                get { throw new NotImplementedException(); }
            }
 
            public override string Id
            {
                get { throw new NotImplementedException(); }
            }
 
            public override Location Location
            {
                get { throw new NotImplementedException(); }
            }
 
            public override DiagnosticSeverity Severity
            {
                get { return DiagnosticSeverity.Error; }
            }
 
            public override DiagnosticSeverity DefaultSeverity
            {
                get { return DiagnosticSeverity.Error; }
            }
 
            public override bool IsSuppressed
            {
                get { return false; }
            }
 
            public override int WarningLevel
            {
                get { throw new NotImplementedException(); }
            }
 
            public override bool Equals(Diagnostic? obj)
            {
                throw new NotImplementedException();
            }
 
            public override int GetHashCode()
            {
                throw new NotImplementedException();
            }
 
            public override string GetMessage(IFormatProvider? formatProvider = null)
            {
                return _message;
            }
 
            internal override Diagnostic WithLocation(Location location)
            {
                throw new NotImplementedException();
            }
 
            internal override Diagnostic WithSeverity(DiagnosticSeverity severity)
            {
                throw new NotImplementedException();
            }
 
            internal override Diagnostic WithIsSuppressed(bool isSuppressed)
            {
                throw new NotImplementedException();
            }
        }
    }
}