Thanks for the tip.  Looking through 
StaticTypeCheckingSupport.EXTENSION_METHOD_CACHE.getExtensionMethods(ClassLoader)
 I was able to see that ExtensionModuleScanner is what I was looking for.  Here 
is my end result for discovering the configured DGM classes:


    public static class XYGroovyClassLoader extends GroovyClassLoader {

        public XYGroovyClassLoader(ClassLoader parent, CompilerConfiguration 
config) {
            super(parent, config);
        }

        ...

        private volatile Set<Class> defaultCategories;
        private volatile Set<Class> defaultStaticCategories;

        public Set<Class> getDefaultCategories() {
            if (defaultCategories == null) {
                synchronized (this) {
                    if (defaultCategories == null) {
                        defaultCategories = new LinkedHashSet<>(); 
defaultStaticCategories = new LinkedHashSet<>();
                        try {
                            Class dgm = 
loadClass("org.codehaus.groovy.runtime.DefaultGroovyMethods");
                            Class dgsm = 
loadClass("org.codehaus.groovy.runtime.DefaultGroovyStaticMethods");

                            Collections.addAll(defaultCategories, (Class[]) 
dgm.getField("DGM_LIKE_CLASSES").get(dgm));

                            defaultStaticCategories.add(dgsm);

                            new ExtensionModuleScanner(module ->  {
                                if (module instanceof SimpleExtensionModule) {
                                    
defaultCategories.addAll(((SimpleExtensionModule) 
module).getInstanceMethodsExtensionClasses());
                                    
defaultStaticCategories.addAll(((SimpleExtensionModule) 
module).getStaticMethodsExtensionClasses());
                                }
                            }, this).scanClasspathModules();

                            defaultCategories.addAll(defaultStaticCategories);

                        } catch (Exception e) {
                            Util.log(e, "Failed to find Default Groovy Methods 
with " + this);
                        }
                    }
                }
            }
            return Collections.unmodifiableSet(defaultCategories);
        }

        public boolean isDefaultStaticCategory(String name) {
            if (defaultStaticCategories == null) getDefaultCategories();
            return 
defaultStaticCategories.stream().map(Class::getName).anyMatch(name::equals);
        }
    }

Reply via email to