コード例 #1
0
        public void Analyze(SymbolAnalysisContext context, PXContext pxContext, CodeAnalysisSettings settings, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            StartLongOperationWalker walker = new StartLongOperationWalker(context, pxContext, Descriptors.PX1054_PXGraphLongRunOperationDuringInitialization);

            foreach (GraphInitializerInfo initializer in pxGraph.Initializers)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(initializer.Node);
            }
        }
コード例 #2
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel graphModel)
        {
            var viewWithoutDelegatesNames = graphModel.Views.Where(view => !graphModel.ViewDelegatesByNames.ContainsKey(view.Symbol.Name))
                                            .Select(view => view.Symbol.Name)
                                            .ToList(capacity: graphModel.ViewsByNames.Count);

            if (viewWithoutDelegatesNames.Count == 0)
            {
                return;
            }

            var delegateCandidates = from method in graphModel.Symbol.GetMembers().OfType <IMethodSymbol>()
                                     where method.ContainingType.Equals(graphModel.Symbol) && !method.IsOverride &&
                                     (!graphModel.ViewDelegatesByNames.TryGetValue(method.Name, out var delegateInfo) || method != delegateInfo.Symbol) &&
                                     method.IsValidViewDelegate(pxContext) && !method.IsValidActionHandler(pxContext)
                                     select method;

            foreach (IMethodSymbol method in delegateCandidates)
            {
                if (viewWithoutDelegatesNames.Any(viewName => viewName == method.Name))
                {
                    continue;
                }

                string nearestViewName = FindNearestView(viewWithoutDelegatesNames, method);

                if (nearestViewName != null && !method.Locations.IsEmpty)
                {
                    var properties = ImmutableDictionary.CreateBuilder <string, string>();
                    properties.Add(ViewFieldNameProperty, nearestViewName);

                    context.ReportDiagnosticWithSuppressionCheck(
                        Diagnostic.Create(Descriptors.PX1005_TypoInViewDelegateName, method.Locations.First(), properties.ToImmutable(), nearestViewName),
                        pxContext.CodeAnalysisSettings);
                }
            }
        }
コード例 #3
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            foreach (var actionHandler in pxGraph.DeclaredActionHandlers)
            {
                context.CancellationToken.ThrowIfCancellationRequested();

                if (actionHandler.Symbol == null || actionHandler.Node == null)
                {
                    continue;
                }

                CheckActionHandler(context, pxContext, actionHandler.Symbol, actionHandler.Node, pxGraph.Type);
            }
        }
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            var dbQueriesWalker = new Walker(context, pxContext, Descriptors.PX1085_DatabaseQueriesInPXGraphInitialization);

            foreach (var initializer in pxGraph.Initializers)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                dbQueriesWalker.Visit(initializer.Node);
            }
        }
コード例 #5
0
 public virtual bool ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graph) => true;
コード例 #6
0
 bool IPXGraphAnalyzer.ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graph) =>
 graph?.Type == GraphType.PXGraphExtension;
コード例 #7
0
 public bool ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graphExtension) =>
 graphExtension?.Type == GraphType.PXGraphExtension &&
 graphExtension.IsActiveMethodInfo == null &&
 !graphExtension.Symbol.IsAbstract && !graphExtension.Symbol.IsStatic && !graphExtension.Symbol.IsGenericType;
コード例 #8
0
        private static ISymbol GetActionOrViewSymbolToNavigateTo(IMethodSymbol methodSymbol, PXGraphSemanticModel graphSemanticModel,
                                                                 PXContext context)
        {
            IEnumerable <ISymbol> candidates;

            if (methodSymbol.IsValidActionHandler(context))
            {
                candidates = from action in graphSemanticModel.Actions
                             where string.Equals(action.Symbol.Name, methodSymbol.Name, StringComparison.OrdinalIgnoreCase)
                             select action.Symbol;
            }
            else if (methodSymbol.IsValidViewDelegate(context))
            {
                candidates = from viewInfo in graphSemanticModel.Views
                             where string.Equals(viewInfo.Symbol.Name, methodSymbol.Name, StringComparison.OrdinalIgnoreCase)
                             select viewInfo.Symbol;
            }
            else
            {
                return(null);
            }

            if (candidates.IsSingle())
            {
                return(candidates.First());
            }
            else
            {
                return(candidates.Where(symbol => symbol.ContainingType == methodSymbol.ContainingType ||
                                        symbol.ContainingType.OriginalDefinition == methodSymbol.ContainingType.OriginalDefinition)
                       .FirstOrDefault());
            }
        }
		public override bool ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graph) => graph.IsProcessing;
コード例 #10
0
        public void Analyze(SymbolAnalysisContext context, PXContext pxContext, CodeAnalysisSettings settings, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var ownDelegatesDictionary = pxGraph.ViewDelegates
                                         .Where(d => pxGraph.Symbol.Equals(d.Symbol.ContainingType))
                                         .ToDictionary(d => d.Symbol.Name, d => d, StringComparer.OrdinalIgnoreCase);
            var ownRelatedViewsHashSet = pxGraph.Views
                                         .Where(v => ownDelegatesDictionary.ContainsKey(v.Symbol.Name) &&
                                                pxGraph.Symbol.Equals(v.Symbol.ContainingType))
                                         .Select(v => v.Symbol.Name)
                                         .ToImmutableHashSet(StringComparer.OrdinalIgnoreCase);
            var baseNonRedeclaredRelatedViewsBuilder = ImmutableHashSet <ISymbol> .Empty.ToBuilder();

            foreach (var view in pxGraph.Views)
            {
                for (var curView = view; curView != null; curView = curView.Base)
                {
                    if (ownDelegatesDictionary.ContainsKey(curView.Symbol.Name) &&
                        !pxGraph.Symbol.Equals(curView.Symbol.ContainingType) &&
                        !ownRelatedViewsHashSet.Contains(curView.Symbol.Name))
                    {
                        baseNonRedeclaredRelatedViewsBuilder.Add(curView.Symbol);
                    }
                }
            }

            var baseNonRedeclaredRelatedViewsHashSet = baseNonRedeclaredRelatedViewsBuilder.ToImmutable();

            foreach (var viewDelegate in ownDelegatesDictionary.Values)
            {
                var walker = new Walker(context, pxContext, baseNonRedeclaredRelatedViewsHashSet);

                walker.Visit(viewDelegate.Node);
            }
        }
コード例 #11
0
        private void NavigateToPXActionHandler(Document document, IWpfTextView textView, ISymbol actionSymbol, PXGraphSemanticModel graphSemanticModel,
                                               PXContext context)
        {
            if (!graphSemanticModel.ActionHandlersByNames.TryGetValue(actionSymbol.Name, out ActionHandlerInfo actionHandler))
            {
                return;
            }

            IWpfTextView textViewToNavigateTo = textView;

            if (!(actionHandler.Node is MethodDeclarationSyntax handlerNode) || handlerNode.SyntaxTree == null)
            {
                return;
            }

            if (handlerNode.SyntaxTree.FilePath != document.FilePath)
            {
                textViewToNavigateTo = OpenOtherDocumentForNavigationAndGetItsTextView(document, handlerNode.SyntaxTree);
            }

            if (textViewToNavigateTo == null)
            {
                return;
            }

            SetNewPositionInTextView(textViewToNavigateTo, handlerNode.Identifier.Span);
        }
コード例 #12
0
        public override void Analyze(SymbolAnalysisContext symbolContext, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            symbolContext.CancellationToken.ThrowIfCancellationRequested();
            var declaredActions = pxGraph.DeclaredActions.ToList();

            if (declaredActions.Count == 0 || symbolContext.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            PrimaryDacFinder primaryDacFinder = PrimaryDacFinder.Create(pxContext, pxGraph, symbolContext.CancellationToken);
            ITypeSymbol      primaryDAC       = primaryDacFinder?.FindPrimaryDAC();

            if (primaryDAC == null)
            {
                return;
            }

            ImmutableDictionary <string, string> diagnosticExtraData = null;

            foreach (ActionInfo action in declaredActions)
            {
                symbolContext.CancellationToken.ThrowIfCancellationRequested();

                if (CheckActionIsDeclaredForPrimaryDAC(action.Type, primaryDAC))
                {
                    continue;
                }

                diagnosticExtraData = diagnosticExtraData ??
                                      new Dictionary <string, string>
                {
                    { DiagnosticProperty.DacName, primaryDAC.Name },
                    { DiagnosticProperty.DacMetadataName, primaryDAC.GetCLRTypeNameFromType() }
                }
                .ToImmutableDictionary();

                RegisterDiagnosticForAction(action.Symbol, primaryDAC.Name, diagnosticExtraData, symbolContext, pxContext);
            }
        }
コード例 #13
0
        public override void Analyze(SymbolAnalysisContext symbolContext, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            symbolContext.CancellationToken.ThrowIfCancellationRequested();

            var actionHandlerWithBadSignature = from method in pxGraph.Symbol.GetMembers().OfType <IMethodSymbol>()
                                                where pxGraph.Symbol.Equals(method.ContainingType) &&
                                                CheckIfDiagnosticShouldBeRegisteredForMethod(method, pxContext) &&
                                                pxGraph.ActionsByNames.ContainsKey(method.Name)
                                                select method;

            foreach (IMethodSymbol method in actionHandlerWithBadSignature)
            {
                symbolContext.CancellationToken.ThrowIfCancellationRequested();
                Location methodLocation = method.Locations.FirstOrDefault();

                if (methodLocation != null)
                {
                    symbolContext.ReportDiagnosticWithSuppressionCheck(
                        Diagnostic.Create(Descriptors.PX1000_InvalidPXActionHandlerSignature, methodLocation),
                        pxContext.CodeAnalysisSettings);
                }
            }
        }
コード例 #14
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var walker = new WalkerForGraphAnalyzer(context, pxContext, Descriptors.PX1086_ThrowingSetupNotEnteredExceptionInLongRunningOperation);

            CheckProcessingDelegates(pxGraph, walker, context.CancellationToken);
            CheckLongOperationStartDelegates(pxGraph.Symbol, walker, pxContext, context.Compilation, context.CancellationToken);
        }
コード例 #15
0
        void IPXGraphAnalyzer.Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel graphOrGraphExtension)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            PXGraphEventSemanticModel graphOrGraphExtensionWithEvents =
                PXGraphEventSemanticModel.EnrichGraphModelWithEvents(graphOrGraphExtension, context.CancellationToken);

            foreach (EventType eventType in Enum.GetValues(typeof(EventType)))
            {
                if (eventType == EventType.None)
                {
                    continue;
                }

                AnalyzeGraphEventsForEventType(eventType, context, pxContext, graphOrGraphExtensionWithEvents);
            }
        }
コード例 #16
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var walker        = new WalkerForGraphAnalyzer(context, pxContext, Descriptors.PX1090_ThrowingSetupNotEnteredExceptionInActionHandlers);
            var delegateNodes = pxGraph.DeclaredActionHandlers
                                .Where(h => h.Node != null)
                                .Select(h => h.Node);

            foreach (var node in delegateNodes)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(node);
            }
        }
コード例 #17
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var walker = new StartLongOperationWalker(context, pxContext, Descriptors.PX1080_DataViewDelegateLongOperationStart);

            foreach (DataViewDelegateInfo del in pxGraph.ViewDelegates)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(del.Node);
            }
        }
コード例 #18
0
 private static bool GraphContainsViewDeclaration(PXGraphSemanticModel graphSemanticModel, DataViewInfo viewInfo) =>
 graphSemanticModel.Symbol.OriginalDefinition?.Equals(viewInfo.Symbol.ContainingType?.OriginalDefinition) ?? false;
コード例 #19
0
 void IPXGraphAnalyzer.Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel graphExtension) =>
 CheckSymbolIsPublic(context, pxContext, graphExtension);
コード例 #20
0
 /// <summary>
 /// Starting from the Acumatica 2018R2 version a new method is used to initialize caches with explicit ordering of caches.
 /// </summary>
 /// <returns/>
 public override bool ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graph) =>
 pxContext.PXGraph.InitCacheMapping == null &&
 graph.ViewsByNames.Count > 0;
コード例 #21
0
        public void Analyze(SymbolAnalysisContext symbolContext, PXContext pxContext, PXGraphSemanticModel graphExtension)
        {
            symbolContext.CancellationToken.ThrowIfCancellationRequested();

            // ShouldAnalyze already filtered everything and left only graph extensions without IsActive
            // We just need to report them
            var      syntaxNode = graphExtension.Symbol.GetSyntax(symbolContext.CancellationToken);
            Location location   = (syntaxNode as ClassDeclarationSyntax)?.Identifier.GetLocation() ?? syntaxNode?.GetLocation();

            if (location == null)
            {
                return;
            }

            symbolContext.ReportDiagnosticWithSuppressionCheck(
                Diagnostic.Create(Descriptors.PX1016_NoIsActiveMethodForGraphExtension, location),
                pxContext.CodeAnalysisSettings);
        }
コード例 #22
0
        public override void Analyze(SymbolAnalysisContext symbolContext, PXContext pxContext, PXGraphSemanticModel graphSemanticModel)
        {
            symbolContext.CancellationToken.ThrowIfCancellationRequested();

            var viewsGroupedByDAC = GetViewsUsedInAnalysis(graphSemanticModel).Where(view => view.DAC != null)
                                    .ToLookup(view => view.DAC);

            if (viewsGroupedByDAC.Count == 0)
            {
                return;
            }

            foreach (IGrouping <ITypeSymbol, DataViewInfo> dacViews in viewsGroupedByDAC)
            {
                symbolContext.CancellationToken.ThrowIfCancellationRequested();

                AnalyzeDacViewsForNumberOfCaches(graphSemanticModel, symbolContext, pxContext, dacViews, viewsGroupedByDAC);
            }
        }
コード例 #23
0
 public abstract void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph);
コード例 #24
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            if (pxGraph.Type != GraphType.PXGraphExtension)
            {
                return;
            }

            var redeclaredActionNamesHashSet = pxGraph.Actions
                                               .Where(a => pxGraph.Symbol.Equals(a.Symbol?.ContainingSymbol) && a.Base != null)
                                               .Select(a => a.Symbol.Name)
                                               .ToImmutableHashSet(StringComparer.OrdinalIgnoreCase);

            var redeclaredHandlersWithoutActionsList = pxGraph.ActionHandlers
                                                       .Where(h => pxGraph.Symbol.Equals(h.Symbol?.ContainingSymbol) && h.Base != null)
                                                       .Where(h => !redeclaredActionNamesHashSet.Contains(h.Symbol.Name))
                                                       .ToList();

            var baseHandlersHashSet = redeclaredHandlersWithoutActionsList
                                      .Select(h => h.Base.Symbol)
                                      .ToImmutableHashSet();

            var baseActionsHashSet = redeclaredHandlersWithoutActionsList
                                     .Select(h => pxGraph.ActionsByNames[h.Symbol.Name].Symbol)
                                     .ToImmutableHashSet();

            var walker = new Walker(context, pxContext, baseActionsHashSet, baseHandlersHashSet);

            foreach (var actionHandler in redeclaredHandlersWithoutActionsList)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(actionHandler.Node);
            }
        }
コード例 #25
0
 public override bool ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graph) =>
 base.ShouldAnalyze(pxContext, graph) && graph.Type != GraphType.None;                 //-V3063
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            SaveChangesWalker walker = new SaveChangesWalker(context, pxContext, Descriptors.PX1058_PXGraphSavingChangesDuringInitialization);

            foreach (GraphInitializerInfo initializer in pxGraph.Initializers)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(initializer.Node);
            }

            walker = new SaveChangesWalker(context, pxContext, Descriptors.PX1083_SavingChangesInDataViewDelegate);

            foreach (DataViewDelegateInfo del in pxGraph.ViewDelegates)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(del.Node);
            }
        }
コード例 #27
0
        public void Analyze(SymbolAnalysisContext context, PXContext pxContext, CodeAnalysisSettings settings, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            PXGraphCreateInstanceWalker walker = new PXGraphCreateInstanceWalker(context, pxContext, Descriptors.PX1057_PXGraphCreationDuringInitialization);

            foreach (GraphInitializerInfo initializer in pxGraph.Initializers)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(initializer.Node);
            }

            walker = new PXGraphCreateInstanceWalker(context, pxContext, Descriptors.PX1084_GraphCreationInDataViewDelegate);

            foreach (DataViewDelegateInfo del in pxGraph.ViewDelegates)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                walker.Visit(del.Node);
            }
        }
コード例 #28
0
 bool IPXGraphAnalyzer.ShouldAnalyze(PXContext pxContext, PXGraphSemanticModel graphOrGraphExtension) =>
 !graphOrGraphExtension.Symbol.IsStatic;
コード例 #29
0
        public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var walker        = new Walker(context, pxContext, Descriptors.PX1089_UiPresentationLogicInActionDelegates);
            var delegateNodes = pxGraph.DeclaredActionHandlers
                                .Where(h => h.Node != null)
                                .Select(h => h.Node);

            foreach (var node in delegateNodes)
            {
                walker.Visit(node);
            }
        }
コード例 #30
0
        public void Analyze(SymbolAnalysisContext context, PXContext pxContext, CodeAnalysisSettings settings, PXGraphSemanticModel pxGraph)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var walker = new Walker(context, pxContext);

            CheckProcessingDelegates(pxGraph, walker, context.CancellationToken);
            CheckLongOperationStartDelegates(pxGraph.Symbol, walker, pxContext, context.Compilation, context.CancellationToken);
        }