in tools/javac/SourceGenerator.java [49:81]
public void generate(Round round) {
Set<? extends Element>
serviceElements = round.getElementsAnnotatedWith(round.annotations.service),
providedElements = round.getElementsAnnotatedWith(round.annotations.provided);
Map<String, Set<TypeElement>> extensions = findExtensions(round);
// Generate JBR class source code.
List<String> serviceGetters = serviceElements.stream()
.filter(e -> // Only top-level public interfaces are included.
e.getEnclosingElement().getKind() == ElementKind.PACKAGE &&
e.getModifiers().contains(Modifier.PUBLIC))
.map(s -> generateServiceGetter(round, s)).toList();
List<String> knownExtensions = extensions.entrySet().stream()
.map(e -> "KNOWN_EXTENSIONS.put(Extensions." + e.getKey() + ", new Class[] {" +
e.getValue().stream().map(c -> c.getQualifiedName() + ".class")
.collect(Collectors.joining(", ")) + "});").toList();
String result = replaceTemplate(
replaceTemplate(jbrTemplate, "/*GENERATED_METHODS*/", serviceGetters, true),
"/*KNOWN_EXTENSIONS*/", knownExtensions, false)
.replace("/*KNOWN_PROXIES*/", joinClassNamesToList(providedElements))
.replace("/*KNOWN_SERVICES*/", joinClassNamesToList(serviceElements));
// Write generated content.
try {
JavaFileObject file = processingEnv.getFiler().createSourceFile("jetbrains.runtime.api/com.jetbrains.JBR",
Stream.concat(serviceElements.stream(), providedElements.stream()).toArray(Element[]::new));
try (Writer w = file.openWriter()) {
w.write(result);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}