Summary
Several analyzers check for specific base object types (Page, Table, Codeunit, etc.) but do not consider their extension counterparts (PageExtension, TableExtension, etc.). This can lead to false negatives (missing diagnostics) or false positives (incorrect diagnostics on extension objects).
This issue was identified while fixing #313 (AC0004 skipping Page but not PageExtension).
Confirmed gaps to investigate
| Analyzer |
Rule |
Issue |
CaptionRequired |
AC0003 |
IsInApiPage() checks NavTypeKind.Page but not PageExtension. Controls added by a page extension to an API page may incorrectly trigger the caption diagnostic (false positive). |
FieldGroupsRequired |
AC0013 |
Only iterates NavTypeKind.Page objects to find tables with page references. Tables used exclusively by page extensions are missed. |
NamingPattern |
LC0092 |
Registers for SymbolKind.Table, Page, Codeunit, etc. but not extension object symbol kinds. Extension object names are not validated against naming patterns. |
CasingMismatchIdentifier |
FC0001 |
Registers for base object symbol kinds only. Extension objects are not checked for casing mismatches. |
CasingMismatchKeyword |
FC0002 |
Same as above. |
ObjectIdInDeclaration |
LC0003 |
Maps syntax kinds to symbol kinds for base objects. Extension object IDs may not be validated. |
Not a gap (verified)
RunPageImplementPageManagement (AC0006): checks target method type (Page.Run), not the callers containing object type
AllowInCustomizationsForOmittedFields (AC0026): already handles both Page and PageExtension
TableFieldToolTip (AC0011): already registers for both Page and PageExtension
EmptyCaptionLocked: already registers for PageExtensionObject syntax
TranslatableTextShouldBeTranslated (LC0091): already handles PageExtension
PermissionSetCoverage, AccessPropertyExplicitlySet, ExtensiblePropertyExplicitlySet: extension objects do not have these properties
IntegrationEventInInternalCodeunit, InstallAndUpgradeCodeunitsShouldBeInternal, ClearCodeunitSingleInstance: no codeunit extensions exist in AL
Recommendation
Each gap should be evaluated individually. Some may be intentional (extension objects genuinely should not trigger the diagnostic), while others are bugs.
Summary
Several analyzers check for specific base object types (Page, Table, Codeunit, etc.) but do not consider their extension counterparts (PageExtension, TableExtension, etc.). This can lead to false negatives (missing diagnostics) or false positives (incorrect diagnostics on extension objects).
This issue was identified while fixing #313 (AC0004 skipping Page but not PageExtension).
Confirmed gaps to investigate
CaptionRequiredIsInApiPage()checksNavTypeKind.Pagebut notPageExtension. Controls added by a page extension to an API page may incorrectly trigger the caption diagnostic (false positive).FieldGroupsRequiredNavTypeKind.Pageobjects to find tables with page references. Tables used exclusively by page extensions are missed.NamingPatternSymbolKind.Table,Page,Codeunit, etc. but not extension object symbol kinds. Extension object names are not validated against naming patterns.CasingMismatchIdentifierCasingMismatchKeywordObjectIdInDeclarationNot a gap (verified)
RunPageImplementPageManagement(AC0006): checks target method type (Page.Run), not the callers containing object typeAllowInCustomizationsForOmittedFields(AC0026): already handles both Page and PageExtensionTableFieldToolTip(AC0011): already registers for both Page and PageExtensionEmptyCaptionLocked: already registers for PageExtensionObject syntaxTranslatableTextShouldBeTranslated(LC0091): already handles PageExtensionPermissionSetCoverage,AccessPropertyExplicitlySet,ExtensiblePropertyExplicitlySet: extension objects do not have these propertiesIntegrationEventInInternalCodeunit,InstallAndUpgradeCodeunitsShouldBeInternal,ClearCodeunitSingleInstance: no codeunit extensions exist in ALRecommendation
Each gap should be evaluated individually. Some may be intentional (extension objects genuinely should not trigger the diagnostic), while others are bugs.