private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo) { // maybeWritten == 'ref' argument. var isRef = valueUsageInfo == ValueUsageInfo.ReadableWritableReference; _currentAnalysisData.OnWriteReferenceFound(symbol, operation, maybeWritten: isRef, isRef); ProcessPossibleDelegateCreationAssignment(symbol, operation); }
private static ReferenceInfoMap CreateReferenceInfo(ValueUsageInfo valueUsageInfo) { var referenceInfoMap = ReferenceInfoMap.Empty; if (valueUsageInfo != ValueUsageInfo.None) { referenceInfoMap = referenceInfoMap.Add(nameof(ValueUsageInfo), valueUsageInfo.ToLocalizableValues()); } return(referenceInfoMap); }
private bool TryRemove(ISymbol memberSymbol, out ValueUsageInfo valueUsageInfo) { lock (_gate) { if (_symbolValueUsageStateMap.TryGetValue(memberSymbol, out valueUsageInfo)) { _symbolValueUsageStateMap.Remove(memberSymbol); return(true); } return(false); } }
private void OnSymbolUsage(ISymbol memberSymbol, ValueUsageInfo usageInfo) { Debug.Assert(IsCandidateSymbol(memberSymbol)); lock (_gate) { // Update the usage info for the memberSymbol if (_symbolValueUsageStateMap.TryGetValue(memberSymbol, out var currentUsageInfo)) { usageInfo = currentUsageInfo | usageInfo; } _symbolValueUsageStateMap[memberSymbol] = usageInfo; } }
public static ImmutableArray <string> ToLocalizableValues(this ValueUsageInfo valueUsageInfo) { if (valueUsageInfo == ValueUsageInfo.None) { return(ImmutableArray <string> .Empty); } var builder = ArrayBuilder <string> .GetInstance(); foreach (ValueUsageInfo value in Enum.GetValues(typeof(ValueUsageInfo))) { if (value.IsSingleBitSet() && (valueUsageInfo & value) != 0) { builder.Add(value.ToLocalizableString()); } } return(builder.ToImmutableAndFree()); }
public static string ToLocalizableString(this ValueUsageInfo value) { // We don't support localizing value combinations. Debug.Assert(value.IsSingleBitSet()); switch (value) { case ValueUsageInfo.Read: return(WorkspacesResources.ValueUsageInfo_Read); case ValueUsageInfo.Write: return(WorkspacesResources.ValueUsageInfo_Write); case ValueUsageInfo.Reference: return(WorkspacesResources.ValueUsageInfo_Reference); case ValueUsageInfo.Name: return(WorkspacesResources.ValueUsageInfo_Name); default: Debug.Fail($"Unhandled value: '{value.ToString()}'"); return(value.ToString()); } }
public static bool IsWrittenTo(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & ValueUsageInfo.Write) != 0;
public static bool IsReadFrom(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & ValueUsageInfo.Read) != 0;
public static SymbolUsageInfo Create(ValueUsageInfo valueUsageInfo) => new(valueUsageInfo, typeOrNamespaceUsageInfoOpt : null);
public static SymbolUsageInfo Create(ValueUsageInfo valueUsageInfo) =>
private static ReferenceInfoMap GetOrCreateReferenceInfo(ValueUsageInfo valueUsageInfo) => s_valueUsageInfoToReferenceInfoMap.GetOrAdd(valueUsageInfo, v => CreateReferenceInfo(v));
internal SourceReferenceItem(DefinitionItem definition, DocumentSpan sourceSpan, ValueUsageInfo valueUsageInfo) : this(definition, sourceSpan, GetOrCreateReferenceInfo(valueUsageInfo)) { IsWrittenTo = valueUsageInfo.IsWrittenTo(); }
public static bool IsNameOnly(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & ValueUsageInfo.Name) != 0;
internal ReferenceLocation(Document document, IAliasSymbol alias, Location location, bool isImplicit, ValueUsageInfo valueUsageInfo, CandidateReason candidateReason) : this() { this.Document = document; this.Alias = alias; this.Location = location; this.IsImplicit = isImplicit; this.ValueUsageInfo = valueUsageInfo; this.CandidateReason = candidateReason; }
public static bool ContainsNonReadWriteRef(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & ValueUsageInfo.NonReadWriteRef) != 0;
public static bool ContainsWriteOrWritableRef(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & (ValueUsageInfo.Write | ValueUsageInfo.WritableRef)) != 0;
public static bool ContainsReadOrReadableRef(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & (ValueUsageInfo.Read | ValueUsageInfo.ReadableRef)) != 0;
public static bool IsReference(this ValueUsageInfo valueUsageInfo) => (valueUsageInfo & ValueUsageInfo.Reference) != 0;
public static bool IsSingleBitSet(this ValueUsageInfo valueUsageInfo) => valueUsageInfo != ValueUsageInfo.None && (valueUsageInfo & (valueUsageInfo - 1)) == 0;