public AnalysisEntityFactory( Func <IOperation, PointsToAbstractValue> getPointsToAbstractValueOpt, Func <bool> getIsInsideObjectInitializer, INamedTypeSymbol containingTypeSymbol) { _getPointsToAbstractValueOpt = getPointsToAbstractValueOpt; _getIsInsideObjectInitializer = getIsInsideObjectInitializer; _analysisEntityMap = new Dictionary <IOperation, AnalysisEntity>(); _instanceLocationsForSymbols = new Dictionary <ISymbol, PointsToAbstractValue>(); var thisOrMeInstanceLocation = AbstractLocation.CreateThisOrMeLocation(containingTypeSymbol); var instanceLocation = PointsToAbstractValue.Create(thisOrMeInstanceLocation, mayBeNull: false); ThisOrMeInstance = AnalysisEntity.CreateThisOrMeInstance(containingTypeSymbol, instanceLocation); }
internal AnalysisEntityFactory( ControlFlowGraph controlFlowGraph, WellKnownTypeProvider wellKnownTypeProvider, Func <IOperation, PointsToAbstractValue>?getPointsToAbstractValue, Func <bool> getIsInsideAnonymousObjectInitializer, Func <IFlowCaptureOperation, bool> getIsLValueFlowCapture, INamedTypeSymbol containingTypeSymbol, AnalysisEntity?interproceduralInvocationInstance, AnalysisEntity?interproceduralThisOrMeInstanceForCaller, ImmutableStack <IOperation>?interproceduralCallStack, ImmutableDictionary <ISymbol, PointsToAbstractValue>?interproceduralCapturedVariablesMap, Func <IOperation, AnalysisEntity?>?interproceduralGetAnalysisEntityForFlowCapture, Func <ISymbol, ImmutableStack <IOperation>?> getInterproceduralCallStackForOwningSymbol) { _controlFlowGraph = controlFlowGraph; _wellKnownTypeProvider = wellKnownTypeProvider; _getPointsToAbstractValue = getPointsToAbstractValue; _getIsInsideAnonymousObjectInitializer = getIsInsideAnonymousObjectInitializer; _getIsLValueFlowCapture = getIsLValueFlowCapture; _interproceduralThisOrMeInstanceForCaller = interproceduralThisOrMeInstanceForCaller; _interproceduralCallStack = interproceduralCallStack; _interproceduralGetAnalysisEntityForFlowCapture = interproceduralGetAnalysisEntityForFlowCapture; _getInterproceduralCallStackForOwningSymbol = getInterproceduralCallStackForOwningSymbol; _analysisEntityMap = new Dictionary <IOperation, AnalysisEntity?>(); _tupleElementEntitiesMap = new Dictionary <ITupleOperation, ImmutableArray <AnalysisEntity> >(); _captureIdEntityMap = new Dictionary <CaptureId, AnalysisEntity>(); _captureIdCopyValueMap = new Dictionary <CaptureId, CopyAbstractValue>(); _instanceLocationsForSymbols = new Dictionary <ISymbol, PointsToAbstractValue>(); if (interproceduralCapturedVariablesMap != null) { _instanceLocationsForSymbols.AddRange(interproceduralCapturedVariablesMap); } if (interproceduralInvocationInstance != null) { ThisOrMeInstance = interproceduralInvocationInstance; } else { var thisOrMeInstanceLocation = AbstractLocation.CreateThisOrMeLocation(containingTypeSymbol, interproceduralCallStack); var instanceLocation = PointsToAbstractValue.Create(thisOrMeInstanceLocation, mayBeNull: false); ThisOrMeInstance = AnalysisEntity.CreateThisOrMeInstance(containingTypeSymbol, instanceLocation); } }
private PointsToAbstractValue EnsureLocation(PointsToAbstractValue instanceLocationOpt, ISymbol symbolOpt, AnalysisEntity parentOpt) { if (instanceLocationOpt == null && symbolOpt != null) { Debug.Assert(symbolOpt.Kind == SymbolKind.Local || symbolOpt.Kind == SymbolKind.Parameter || symbolOpt.IsStatic); if (!_instanceLocationsForSymbols.TryGetValue(symbolOpt, out instanceLocationOpt)) { if (parentOpt != null) { instanceLocationOpt = parentOpt.InstanceLocation; } else { var location = AbstractLocation.CreateSymbolLocation(symbolOpt); instanceLocationOpt = PointsToAbstractValue.Create(location, mayBeNull: false); } _instanceLocationsForSymbols.Add(symbolOpt, instanceLocationOpt); } } return(instanceLocationOpt); }