private void populateJvmMenu(@Nonnull ContextMenu menu,
	                             @Nonnull ContextSource source,
	                             @Nonnull Workspace workspace,
	                             @Nonnull WorkspaceResource resource,
	                             @Nonnull JvmClassBundle bundle,
	                             @Nonnull JvmClassInfo info) {
		var builder = new ContextMenuBuilder(menu, source).forInfo(workspace, resource, bundle, info);
		if (source.isReference()) {
			builder.infoItem("menu.goto.class", ARROW_RIGHT, actions::gotoDeclaration);
		} else if (source.isDeclaration()) {
			// Edit menu
			var edit = builder.submenu("menu.edit", EDIT);
			edit.item("menu.edit.assemble.class", EDIT, Unchecked.runnable(() ->
					actions.openAssembler(PathNodes.classPath(workspace, resource, bundle, info))
			));
			edit.infoItem("menu.edit.add.field", ADD_ALT, actions::addClassField);
			edit.infoItem("menu.edit.add.method", ADD_ALT, actions::addClassMethod);
			edit.infoItem("menu.edit.override.method", HEALTH_CROSS, actions::overrideClassMethod);
			edit.infoItem("menu.edit.remove.field", CLOSE, actions::deleteClassFields).disableWhen(info.getFields().isEmpty());
			edit.infoItem("menu.edit.remove.method", CLOSE, actions::deleteClassMethods).disableWhen(info.getMethods().isEmpty());
			edit.infoItem("menu.edit.remove.annotation", CLOSE, actions::deleteClassAnnotations).disableWhen(info.getAnnotations().isEmpty());
			edit.infoItem("menu.edit.copy", COPY_FILE, actions::copyClass);
			edit.infoItem("menu.edit.delete", COPY_FILE, actions::deleteClass);
		}

		// Search actions
		var search = builder.submenu("menu.search", SEARCH);
		search.item("menu.search.class.member-references", CODE_REFERENCE, () -> {
			MemberReferenceSearchPane pane = actions.openNewMemberReferenceSearch();
			pane.ownerPredicateIdProperty().setValue(StringPredicateProvider.KEY_EQUALS);
			pane.ownerValueProperty().setValue(info.getName());
		});
		search.item("menu.search.class.type-references", CODE_REFERENCE, () -> {
			ClassReferenceSearchPane pane = actions.openNewClassReferenceSearch();
			pane.typePredicateIdProperty().setValue(StringPredicateProvider.KEY_EQUALS);
			pane.typeValueProperty().setValue(info.getName());
		});

		// Refactor actions
		var refactor = builder.submenu("menu.refactor", PAINT_BRUSH);
		refactor.infoItem("menu.refactor.rename", TAG_EDIT, actions::renameClass);
		refactor.infoItem("menu.refactor.move", STACKED_MOVE, actions::moveClass);

		// Copy path
		builder.item("menu.tab.copypath", COPY_LINK, () -> ClipboardUtil.copyString(info));

		// Documentation actions
		builder.infoItem("menu.analysis.comment", ADD_COMMENT, actions::openCommentEditing);

		// Export actions
		builder.infoItem("menu.export.class", EXPORT, actions::exportClass);

		// TODO: implement operations
		//  - View
		//    - Class hierarchy
		//  - Deobfuscate
		//    - Suggest class name / purpose
		//    - Suggest method names / purposes (get/set)
		//    - Organize fields (constants -> finals -> non-finals
	}
Append JVM specific operations to the given menu.

@param menu
		Menu to append content to.
@param source
		Context source.
@param workspace
		Containing workspace.
@param resource
		Containing resource.
@param bundle
		Containing bundle.
@param info
		The class to create a menu for.
recaf-ui/src/main/java/software/coley/recaf/services/cell/context/BasicClassContextMenuProviderFactory.java