File: CodeGen\LocalConstantDefinition.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 System.Collections.Immutable;
using System.Diagnostics;
using System.Reflection.Metadata;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.CodeGen
{
    /// <summary>
    /// We need a CCI representation for local constants because they are emitted as locals in
    /// PDB scopes to improve the debugging experience (see LocalScopeProvider.GetConstantsInScope).
    /// </summary>
    internal sealed class LocalConstantDefinition : Cci.ILocalDefinition
    {
        public LocalConstantDefinition(
            string name,
            Location location,
            MetadataConstant compileTimeValue,
            ImmutableArray<bool> dynamicTransformFlags,
            ImmutableArray<string> tupleElementNames)
        {
            RoslynDebug.Assert(!RoslynString.IsNullOrEmpty(name));
            RoslynDebug.Assert(compileTimeValue != null);
 
            Name = name;
            Location = location;
            CompileTimeValue = compileTimeValue;
            DynamicTransformFlags = dynamicTransformFlags.NullToEmpty();
            TupleElementNames = tupleElementNames.NullToEmpty();
        }
 
        public string Name { get; }
 
        public Location Location { get; }
 
        public MetadataConstant CompileTimeValue { get; }
 
        public Cci.ITypeReference Type => CompileTimeValue.Type;
 
        public bool IsConstant => true;
 
        public ImmutableArray<Cci.ICustomModifier> CustomModifiers
            => ImmutableArray<Cci.ICustomModifier>.Empty;
 
        public bool IsModified => false;
 
        public bool IsPinned => false;
 
        public bool IsReference => false;
 
        public LocalSlotConstraints Constraints => LocalSlotConstraints.None;
 
        public LocalVariableAttributes PdbAttributes => LocalVariableAttributes.None;
 
        public ImmutableArray<bool> DynamicTransformFlags { get; }
 
        public ImmutableArray<string> TupleElementNames { get; }
 
        public int SlotIndex => -1;
 
        public byte[]? Signature => null;
 
        public LocalSlotDebugInfo SlotInfo
            => new LocalSlotDebugInfo(SynthesizedLocalKind.UserDefined, LocalDebugId.None);
    }
}