public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder == null || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            List <INamedTypeSymbol> readOnlyViews = new List <INamedTypeSymbol>(capacity: 4);
            List <INamedTypeSymbol> editableViews = new List <INamedTypeSymbol>(capacity: dacFinder.GraphViews.Length);

            foreach (var viewWithType in dacFinder.GraphViews)
            {
                if (dacFinder.CancellationToken.IsCancellationRequested)
                {
                    return(Enumerable.Empty <ITypeSymbol>());
                }

                if (viewWithType.Type.IsPXNonUpdateableBqlCommand(dacFinder.PxContext))
                {
                    readOnlyViews.Add(viewWithType.Type);
                }
                else
                {
                    editableViews.Add(viewWithType.Type);
                }
            }

            if (editableViews.Count == 0 || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            return(readOnlyViews.Select(viewType => viewType.GetDacFromView(dacFinder.PxContext)));
        }
        public override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol view, INamedTypeSymbol viewType)
        {
            if (view == null || dacFinder == null || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(false);
            }

            ImmutableArray <AttributeData> attributes = view.GetAttributes();

            if (attributes.Length == 0)
            {
                return(false);
            }

            INamedTypeSymbol hiddenAttribute    = dacFinder.PxContext.AttributeTypes.PXHiddenAttribute;
            bool             hasHiddenAttribute = attributes.Any(a => a.AttributeClass.Equals(hiddenAttribute));

            if (hasHiddenAttribute)
            {
                return(true);
            }
            else if (dacFinder.GraphViews.Length <= 1 || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(false);
            }

            INamedTypeSymbol copyPasteHiddenViewAttribute = dacFinder.PxContext.AttributeTypes.PXCopyPasteHiddenViewAttribute;

            return(attributes.Any(a => a.AttributeClass.InheritsFromOrEquals(copyPasteHiddenViewAttribute)));
        }
示例#3
0
        public override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol action, INamedTypeSymbol actionType)
        {
            if (dacFinder == null || dacFinder.CancellationToken.IsCancellationRequested || actionType == null)
            {
                return(false);
            }

            return(true);
        }
示例#4
0
        public override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol action, INamedTypeSymbol actionType)
        {
            if (!base.SatisfyRule(dacFinder, action, actionType))
            {
                return(false);
            }

            return(_systemActionsRegister.IsSystemAction(actionType));
        }
示例#5
0
        /// <summary>
        /// Query if view type is PXSetup-like.
        /// </summary>
        /// <param name="dacFinder">The DAC finder.</param>
        /// <param name="view">The view.</param>
        /// <param name="viewType">Type of the view.</param>
        /// <returns/>
        public sealed override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol view, INamedTypeSymbol viewType)
        {
            if (dacFinder == null || viewType == null || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(false);
            }

            return(viewType.GetBaseTypesAndThis()
                   .Any(type => _setupTypes.Contains(type)));
        }
示例#6
0
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder?.Graph == null)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            ITypeSymbol primaryDac = dacFinder.Graph.GetDeclaredPrimaryDacFromGraphOrGraphExtension(dacFinder.PxContext);

            return(primaryDac?.ToEnumerable() ?? Enumerable.Empty <ITypeSymbol>());
        }
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder == null || dacFinder.GraphViews.Length == 0 || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            return(dacFinder.GraphViews.Take(NumberOfViews)
                   .Select(view => view.Type.GetDacFromView(dacFinder.PxContext))
                   .Where(dac => dac != null));
        }
        public override bool SatisfyRule(PrimaryDacFinder dacFinder, ITypeSymbol dac)
        {
            if (dacFinder?.Graph?.ContainingNamespace == null || dacFinder.CancellationToken.IsCancellationRequested ||
                dac?.ContainingNamespace == null)
            {
                return(false);
            }

            var graphNameSpace = dacFinder.Graph.ContainingNamespace;

            return(dac.GetContainingNamespaces().Contains(graphNameSpace));
        }
        /// <summary>
        /// Query if view name contains one of forbidden words.
        /// </summary>
        /// <param name="dacFinder">The DAC finder.</param>
        /// <param name="view">The view.</param>
        /// <param name="viewType">Type of the view.</param>
        /// <returns/>
        public sealed override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol view, INamedTypeSymbol viewType)
        {
            if (view == null)
            {
                return(false);
            }

            string viewName = _useCaseSensitiveComparison
                                ? view.Name
                                : view.Name.ToUpper();

            return(_forbiddenWords.Any(word => viewName.Contains(word)));
        }
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder == null || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            List <ITypeSymbol> primaryDacCandidates = new List <ITypeSymbol>(1);

            foreach (var(view, viewType) in dacFinder.GraphViewSymbolsWithTypes)
            {
                if (dacFinder.CancellationToken.IsCancellationRequested)
                {
                    return(Enumerable.Empty <ITypeSymbol>());
                }

                ImmutableArray <AttributeData> attributes = view.GetAttributes();

                if (attributes.Length == 0)
                {
                    continue;
                }

                var importAttributeType = dacFinder.PxContext.AttributeTypes.PXImportAttribute;
                var importAttributeData = attributes.FirstOrDefault(a => a.AttributeClass.Equals(importAttributeType));

                if (importAttributeData == null)
                {
                    continue;
                }
                else if (dacFinder.CancellationToken.IsCancellationRequested)
                {
                    return(Enumerable.Empty <ITypeSymbol>());
                }

                var dacArgType = (from arg in importAttributeData.ConstructorArguments
                                  where arg.Kind == TypedConstantKind.Type && arg.Type.IsDAC()
                                  select arg.Type)
                                 .FirstOrDefault();

                if (dacArgType != null)
                {
                    primaryDacCandidates.Add(dacArgType);
                }
            }

            return(primaryDacCandidates);
        }
示例#11
0
        public override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol view, INamedTypeSymbol viewType)
        {
            if (view == null || dacFinder == null || dacFinder.CancellationToken.IsCancellationRequested)
            {
                return(false);
            }

            ImmutableArray <AttributeData> attributes = view.GetAttributes();

            if (attributes.Length == 0)
            {
                return(false);
            }

            return(attributes.SelectMany(a => a.AttributeClass.GetBaseTypesAndThis())
                   .Any(baseType => baseType.Equals(_pxViewNameAttribute)));
        }
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder?.GraphSemanticModel?.GraphSymbol == null || dacFinder.CancellationToken.IsCancellationRequested ||
                dacFinder.GraphViews.Length == 0)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            List <ITypeSymbol> dacCandidates       = new List <ITypeSymbol>(dacFinder.GraphViews.Length);
            bool grapHasViewsWithViewNameAttribute = false;

            foreach (DataViewInfo viewInfo in dacFinder.GraphViews)
            {
                if (dacFinder.CancellationToken.IsCancellationRequested)
                {
                    return(Enumerable.Empty <ITypeSymbol>());
                }

                ImmutableArray <AttributeData> attributes = viewInfo.Symbol.GetAttributes();

                if (attributes.Length == 0)
                {
                    continue;
                }

                bool viewHasViewNameAttribute = attributes.SelectMany(a => a.AttributeClass.GetBaseTypesAndThis())
                                                .Any(baseType => baseType.Equals(pxViewNameAttribute));
                if (!viewHasViewNameAttribute)
                {
                    var dac = viewInfo.Type.GetDacFromView(dacFinder.PxContext);

                    if (dac != null)
                    {
                        dacCandidates.Add(dac);
                    }
                }
                else
                {
                    grapHasViewsWithViewNameAttribute = true;
                }
            }

            return(grapHasViewsWithViewNameAttribute
                                        ? dacCandidates
                                        : Enumerable.Empty <ITypeSymbol>());
        }
示例#13
0
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder?.Graph == null || dacFinder.CancellationToken.IsCancellationRequested || dacFinder.GraphViewSymbolsWithTypes.Length == 0)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            bool        firstNameFound = false, secondNameFound = false;
            ITypeSymbol firstDacCandidate = null, secondDacCandidate = null;

            foreach (var(view, viewType) in dacFinder.GraphViewSymbolsWithTypes)
            {
                if (dacFinder.CancellationToken.IsCancellationRequested)
                {
                    return(Enumerable.Empty <ITypeSymbol>());
                }

                if (view.Name == firstName)
                {
                    firstNameFound    = true;
                    firstDacCandidate = viewType.GetDacFromView(dacFinder.PxContext);
                    continue;
                }

                if (view.Name == secondName)
                {
                    secondNameFound    = true;
                    secondDacCandidate = viewType.GetDacFromView(dacFinder.PxContext);
                    continue;
                }

                if (firstNameFound && secondNameFound)
                {
                    break;
                }
            }

            var dacCandidate = ChooseDacCandidate(firstDacCandidate, secondDacCandidate);

            return(dacCandidate?.ToEnumerable() ?? Enumerable.Empty <ITypeSymbol>());
        }
        base.ShouldAnalyze(pxContext, graph) && graph.Type != GraphType.None;                 //-V3063

        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);
            }
        }
示例#15
0
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (pxFilteredProcessingType == null || dacFinder?.GraphSemanticModel?.GraphSymbol == null ||
                dacFinder.CancellationToken.IsCancellationRequested || dacFinder.GraphViews.Length == 0)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            List <ITypeSymbol> primaryDacCandidates = new List <ITypeSymbol>(1);

            foreach (DataViewInfo view in dacFinder.GraphViews)
            {
                if (dacFinder.CancellationToken.IsCancellationRequested)
                {
                    return(Enumerable.Empty <ITypeSymbol>());
                }

                var fProcessingView = view.Type.GetBaseTypesAndThis()
                                      .FirstOrDefault(t => pxFilteredProcessingType.Equals(t) ||
                                                      pxFilteredProcessingType.Equals(t?.OriginalDefinition));

                if (fProcessingView == null || !(fProcessingView is INamedTypeSymbol filteredProcessingView))
                {
                    continue;
                }

                var typeParameters = filteredProcessingView.TypeArguments;

                if (typeParameters.Length < 2 || !typeParameters[1].IsDAC())
                {
                    continue;
                }

                primaryDacCandidates.Add(typeParameters[1]);
            }

            return(primaryDacCandidates);
        }
        public override IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder)
        {
            if (dacFinder?.GraphSemanticModel?.GraphSymbol == null || dacFinder.CancellationToken.IsCancellationRequested ||
                dacFinder.GraphViews.Length == 0)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            bool firstNameFound  = dacFinder.GraphSemanticModel.ViewsByNames.TryGetValue(_firstName, out var firstView);
            bool secondNameFound = dacFinder.GraphSemanticModel.ViewsByNames.TryGetValue(_secondName, out var secondView);

            if (!firstNameFound || !secondNameFound)
            {
                return(Enumerable.Empty <ITypeSymbol>());
            }

            ITypeSymbol firstDacCandidate  = firstView.Type.GetDacFromView(dacFinder.PxContext);
            ITypeSymbol secondDacCandidate = secondView.Type.GetDacFromView(dacFinder.PxContext);

            var dacCandidate = ChooseDacCandidate(firstDacCandidate, secondDacCandidate);

            return(dacCandidate?.ToEnumerable() ?? Enumerable.Empty <ITypeSymbol>());
        }
示例#17
0
 /// <summary>
 /// Query if action satisfies this rule's conditions.
 /// </summary>
 /// <param name="dacFinder">The DAC finder.</param>
 /// <param name="action">The action.</param>
 /// <param name="actionType">Type of the action.</param>
 /// <returns/>
 public abstract bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol action, INamedTypeSymbol actionType);
示例#18
0
 /// <summary>
 /// Query if view name contains one of forbidden words.
 /// </summary>
 /// <param name="dacFinder">The DAC finder.</param>
 /// <param name="view">The view.</param>
 /// <param name="viewType">Type of the view.</param>
 /// <returns/>
 public sealed override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol view, INamedTypeSymbol viewType) =>
 view != null
                         ? forbiddenWords.Any(word => view.Name.Contains(word))
                         : false;
示例#19
0
 /// <summary>
 /// Filter DACs from graph using this rule.
 /// </summary>
 /// <param name="dacFinder">The DAC finder.</param>
 /// <returns/>
 public abstract IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder);
示例#20
0
        private static async Task AnalyzePXGraphSymbolAsync(SymbolAnalysisContext symbolContext, PXContext pxContext)
        {
            if (!(symbolContext.Symbol is INamedTypeSymbol graphOrGraphExtension) || symbolContext.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            bool isGraph = graphOrGraphExtension.InheritsFrom(pxContext.PXGraphType);

            if (!isGraph && !graphOrGraphExtension.InheritsFrom(pxContext.PXGraphExtensionType))
            {
                return;
            }

            ClassDeclarationSyntax graphOrGraphExtNode = await graphOrGraphExtension.GetSyntaxAsync(symbolContext.CancellationToken)
                                                         .ConfigureAwait(false) as ClassDeclarationSyntax;

            if (graphOrGraphExtNode == null || symbolContext.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            SemanticModel semanticModel = symbolContext.Compilation.GetSemanticModel(graphOrGraphExtNode.SyntaxTree);

            if (semanticModel == null || symbolContext.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            var declaredActionsWithTypes = isGraph
                                ? graphOrGraphExtension.GetPXActionSymbolsWithTypesFromGraph(pxContext, includeActionsFromInheritanceChain: false)
                                : graphOrGraphExtension.GetPXActionSymbolsWithTypesFromGraphExtension(pxContext, includeActionsFromInheritanceChain: false);

            if (declaredActionsWithTypes.IsNullOrEmpty() || symbolContext.CancellationToken.IsCancellationRequested)
            {
                return;
            }

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

            if (primaryDAC == null || symbolContext.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            var actionsWithWrongDAC = declaredActionsWithTypes.TakeWhile(a => !symbolContext.CancellationToken.IsCancellationRequested)
                                      .Where(a => !CheckActionIsDeclaredForPrimaryDAC(a.ActionType, primaryDAC))
                                      .ToList();

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

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

            var registrationTasks = actionsWithWrongDAC.Select(a => RegisterDiagnosticForActionAsync(a.ActionSymbol, primaryDAC.Name,
                                                                                                     diagnosticExtraData, symbolContext));
            await Task.WhenAll(registrationTasks);
        }
示例#21
0
 /// <summary>
 /// Query if DAC satisfies this rule's conditions.
 /// </summary>
 /// <param name="dacFinder">The DAC finder.</param>
 /// <param name="dac">The DAC.</param>
 /// <returns/>
 public abstract bool SatisfyRule(PrimaryDacFinder dacFinder, ITypeSymbol dac);