import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.Map;

import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;

import com.sun.source.util.JavacTask;

public class TestGetAllMembers {
    public static void main(String... args) throws IOException {
        new TestGetAllMembers().run(args);
    }

    public void run(String... args) throws IOException {
        test(Map.of("A", """
                        public class A {
                            public void m() { }
                        }""",
                "B", """
                        public interface B {
                            void m();
                        }
                        """,
                "C", """
                        public class C extends A implements B { }
                        """));
    }

    void test(Map<String, String> classes) throws IOException {
        var fileObjects = classes.entrySet().stream()
                .map(e -> getFileObject(e.getKey(), e.getValue()))
                .toList();
        var options = List.<String>of();

        var javac = ToolProvider.getSystemJavaCompiler();
        var task = (JavacTask) javac.getTask(null, null, null, options, null, fileObjects);
        task.analyze();

        var elements = task.getElements();
        for (var k : classes.keySet()) {
            var e = elements.getTypeElement(k);
            var all = elements.getAllMembers(e);
            System.out.println(e + ": " + all);
        }
    }

    JavaFileObject getFileObject(String baseName, String body) {
        return new SimpleJavaFileObject(URI.create(String.format("myfo:///%s.java", baseName)), JavaFileObject.Kind.SOURCE) {
            @Override
            public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
                return body;
            }
        };
    }
}
