@@ -185,6 +185,7 @@ private record CompiledConditionalPattern(AccessCondition condition, ResourcePat
185185 private Set <ConditionalPattern > resourcePatternWorkSet = Collections .newSetFromMap (new ConcurrentHashMap <>());
186186 private Set <ConditionalGlob > globWorkSet = Collections .newSetFromMap (new ConcurrentHashMap <>());
187187 private final Set <ConditionalPattern > excludedResourcePatterns = Collections .newSetFromMap (new ConcurrentHashMap <>());
188+ private List <ConditionalGlob > includePatternMetadataGlobs = List .of ();
188189
189190 private ImageClassLoader imageClassLoader ;
190191
@@ -445,6 +446,13 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
445446 .toList ();
446447 GlobTrieNode <ConditionWithOrigin > trie = CompressedGlobTrie .CompressedGlobTrieBuilder .build (patternsWithInfo );
447448 Resources .currentLayer ().setResourcesTrieRoot (trie );
449+ includePatternMetadataGlobs = MissingRegistrationUtils .throwMissingRegistrationErrors () ? List .copyOf (globWorkSet ) : List .of ();
450+ for (ConditionalGlob glob : includePatternMetadataGlobs ) {
451+ TypeReachabilityCondition reachabilityCondition = (TypeReachabilityCondition ) glob .condition ();
452+ if (reachabilityCondition .isRuntimeChecked () && !reachabilityCondition .isAlwaysTrue ()) {
453+ access .registerAsUsed (reachabilityCondition .getType ());
454+ }
455+ }
448456
449457 /*
450458 * GR-58701: The SVM core is currently not included in the base layer of a Layered Image.
@@ -470,13 +478,14 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
470478
471479 ResourceCollectorImpl collector = new ResourceCollectorImpl (includePatterns , excludePatterns );
472480 /*
473- * register all included patterns in Resources singleton (if we are throwing
474- * MissingRegistrationErrors), so they can be queried at runtime to detect missing entries
481+ * Register regex include patterns in the Resources singleton so runtime missing-metadata
482+ * diagnostics can query them with the legacy simple matcher. Glob diagnostics use the
483+ * dedicated metadata trie above instead of requestedPatterns.
475484 */
476485 if (MissingRegistrationUtils .throwMissingRegistrationErrors ()) {
477486 includePatterns .forEach (resourcePattern -> collector .registerIncludePattern (resourcePattern .condition , resourcePattern .compiledPattern .moduleName (),
478487 resourcePattern .compiledPattern .pattern .pattern ()));
479- globWorkSet .forEach (glob -> collector .registerIncludePattern (glob .condition (), glob . module (), glob . glob ()));
488+ globWorkSet .forEach (glob -> collector .trackCondition (glob .condition ()));
480489 }
481490
482491 /* if we have any entry in resource config file we should collect resources */
@@ -621,6 +630,11 @@ public void registerNegativeQuery(Module module, String resourceName) {
621630 public void registerIncludePattern (AccessCondition condition , String module , String pattern ) {
622631 registerConditionalConfiguration (condition , cnd -> Resources .currentLayer ().registerIncludePattern (cnd , module , pattern ));
623632 }
633+
634+ public void trackCondition (AccessCondition condition ) {
635+ registerConditionalConfiguration (condition , _ -> {
636+ });
637+ }
624638 }
625639
626640 private static List <ConditionalPattern > getPatternsFromOption (AccumulatingLocatableMultiOptionValue .Strings option ) {
@@ -632,7 +646,7 @@ private static List<ConditionalPattern> getPatternsFromOption(AccumulatingLocata
632646
633647 private GlobTrieNode <RuntimeDynamicAccessMetadata > buildIncludePatternMetadataTrie () {
634648 Map <String , RuntimeDynamicAccessMetadata > metadataByPattern = new LinkedHashMap <>();
635- for (ConditionalGlob glob : globWorkSet ) {
649+ for (ConditionalGlob glob : includePatternMetadataGlobs ) {
636650 String triePath = GlobUtils .transformToTriePath (glob .glob (), glob .module ());
637651 RuntimeDynamicAccessMetadata metadata = metadataByPattern .computeIfAbsent (triePath , _ -> RuntimeDynamicAccessMetadata .alwaysAllow (false ));
638652 metadata .addCondition (glob .condition ());
@@ -704,6 +718,7 @@ public void afterAnalysis(AfterAnalysisAccess access) {
704718 GlobTrieNode <RuntimeDynamicAccessMetadata > metadataRoot = buildIncludePatternMetadataTrie ();
705719 CompressedGlobTrie .finalize (metadataRoot );
706720 Resources .currentLayer ().setIncludePatternMetadataTrieRoot (metadataRoot );
721+ includePatternMetadataGlobs = List .of ();
707722 }
708723 }
709724
0 commit comments