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);
            }
        }
 protected abstract void StopTrackingAbstractValue(AbstractLocation location);
 protected abstract void SetAbstractValue(AbstractLocation location, TAbstractAnalysisValue value);
 protected abstract TAbstractAnalysisValue GetAbstractValue(AbstractLocation location);