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))); }
public override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol action, INamedTypeSymbol actionType) { if (dacFinder == null || dacFinder.CancellationToken.IsCancellationRequested || actionType == null) { return(false); } return(true); }
public override bool SatisfyRule(PrimaryDacFinder dacFinder, ISymbol action, INamedTypeSymbol actionType) { if (!base.SatisfyRule(dacFinder, action, actionType)) { return(false); } return(_systemActionsRegister.IsSystemAction(actionType)); }
/// <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))); }
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); }
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>()); }
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); } }
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>()); }
/// <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);
/// <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;
/// <summary> /// Filter DACs from graph using this rule. /// </summary> /// <param name="dacFinder">The DAC finder.</param> /// <returns/> public abstract IEnumerable <ITypeSymbol> GetCandidatesFromGraphRule(PrimaryDacFinder dacFinder);
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); }
/// <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);