public override void Analyze(SymbolAnalysisContext context, PXContext pxContext, DacSemanticModel dacOrExtension)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            bool isDacFullyUnbound = dacOrExtension.IsFullyUnbound();

            if (isDacFullyUnbound)
            {
                return;
            }

            foreach (DacPropertyInfo property in dacOrExtension.DeclaredDacProperties)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                AnalyzeProperty(context, pxContext, dacOrExtension, property);
            }
        }
        protected virtual bool ShouldMakeSpecificAnalysisForDacKeys(PXContext context, DacSemanticModel dac)
        {
            if (dac.IsFullyUnbound())
            {
                return(false);
            }

            var dacAttributes = dac.Symbol.GetAttributes();

            if (dacAttributes.IsDefaultOrEmpty)
            {
                return(false);
            }

            var pxCacheNameAttribute    = context.AttributeTypes.PXCacheNameAttribute;
            var pxPrimaryGraphAttribute = context.AttributeTypes.PXPrimaryGraphAttribute;

            return(dacAttributes.Any(attribute => attribute.AttributeClass != null &&
                                     (attribute.AttributeClass.InheritsFromOrEquals(pxCacheNameAttribute) ||
                                      attribute.AttributeClass.InheritsFromOrEquals(pxPrimaryGraphAttribute))));
        }