@Override
	public boolean summarize(@Nonnull Workspace workspace,
	                         @Nonnull WorkspaceResource resource,
	                         @Nonnull SummaryConsumer consumer) {
		Batch batch = FxThreadUtil.batch();
		batch.add(() -> {
			Label title = new BoundLabel(Lang.getBinding("service.analysis.entry-points"));
			title.getStyleClass().addAll(Styles.TITLE_4);
			consumer.appendSummary(title);
		});

		// Visit JVM classes
		int[] found = {0};
		resource.jvmClassBundleStream().forEach(bundle -> {
			bundle.forEach(cls -> {
				List<MethodMember> entryMethods = cls.getMethods().stream()
						.filter(this::isJvmEntry)
						.toList();
				if (!entryMethods.isEmpty()) {
					found[0]++;
					batch.add(() -> {
						Supplier<JvmClassInfo> classLookup = () -> Objects.requireNonNullElse(bundle.get(cls.getName()), cls);

						// Add entry for class
						String classDisplay = textService.getJvmClassInfoTextProvider(workspace, resource, bundle, cls).makeText();
						Node classIcon = iconService.getJvmClassInfoIconProvider(workspace, resource, bundle, cls).makeIcon();
						Label classLabel = new Label(classDisplay, classIcon);
						classLabel.setCursor(Cursor.HAND);
						classLabel.setOnMouseEntered(e -> classLabel.getStyleClass().add(Styles.TEXT_UNDERLINED));
						classLabel.setOnMouseExited(e -> classLabel.getStyleClass().remove(Styles.TEXT_UNDERLINED));
						classLabel.setOnMouseClicked(e -> actions.gotoDeclaration(workspace, resource, bundle, classLookup.get()));
						consumer.appendSummary(classLabel);

						// Add entries for methods
						for (MethodMember method : entryMethods) {
							String methodDisplay = textService.getMethodMemberTextProvider(workspace, resource, bundle, cls, method).makeText();
							Node methodIcon = iconService.getClassMemberIconProvider(workspace, resource, bundle, cls, method).makeIcon();
							Label methodLabel = new Label(methodDisplay);
							methodLabel.setCursor(Cursor.HAND);
							methodLabel.setGraphic(methodIcon);
							methodLabel.setPadding(new Insets(2, 2, 2, 15));
							methodLabel.setOnMouseEntered(e -> methodLabel.getStyleClass().add(Styles.TEXT_UNDERLINED));
							methodLabel.setOnMouseExited(e -> methodLabel.getStyleClass().remove(Styles.TEXT_UNDERLINED));
							methodLabel.setOnMouseClicked(e -> {
								actions.gotoDeclaration(workspace, resource, bundle, classLookup.get())
										.requestFocus(method);
							});
							consumer.appendSummary(methodLabel);
						}
					});
				}
			});
		});

		if (found[0] == 0)
			batch.add(() -> consumer.appendSummary(new BoundLabel(Lang.getBinding("service.analysis.entry-points.none"))));

		batch.execute();

		return true;
	}
Summarizer that shows entry-points.

@author Matt Coley
recaf-ui/src/main/java/software/coley/recaf/services/info/summary/builtin/EntryPointSummarizer.java