Пример #1
0
        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);
            }
        }
Пример #3
0
        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);
        }