@Nonnull
	@Override
	public ContextMenuProvider getFileInfoContextMenuProvider(@Nonnull ContextSource source,
															  @Nonnull Workspace workspace,
															  @Nonnull WorkspaceResource resource,
															  @Nonnull FileBundle bundle,
															  @Nonnull FileInfo info) {
		return () -> {
			TextProvider nameProvider = textService.getFileInfoTextProvider(workspace, resource, bundle, info);
			IconProvider iconProvider = iconService.getFileInfoIconProvider(workspace, resource, bundle, info);
			ContextMenu menu = new ContextMenu();
			addHeader(menu, nameProvider.makeText(), iconProvider.makeIcon());
			var builder = new ContextMenuBuilder(menu, source).forInfo(workspace, resource, bundle, info);

			FilePathNode filePath = PathNodes.filePath(workspace, resource, bundle, info);
			if (source.isReference()) {
				builder.item("menu.goto.file", ARROW_RIGHT, Unchecked.runnable(() -> actions.gotoDeclaration(filePath)));
			} else if (source.isDeclaration()) {
				builder.item("menu.tab.copypath", COPY_LINK, () -> ClipboardUtil.copyString(info));
				builder.infoItem("menu.edit.copy", COPY_FILE, actions::copyFile);
				builder.infoItem("menu.edit.delete", TRASH_CAN, actions::deleteFile);

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

				// TODO: implement operations
				//  - Search references
				//  - Override text-view language (FileTypeAssociationService)

				// Export actions
				builder.infoItem("menu.export.file", EXPORT, actions::exportClass);
			}
			return menu;
		};
	}
Basic implementation for {@link FileContextMenuProviderFactory}.

@author Matt Coley
recaf-ui/src/main/java/software/coley/recaf/services/cell/context/BasicFileContextMenuProviderFactory.java