Tree View Protocol
Metals implements a Language Server Protocol extension called the "Tree View Protocol" to render tree views in the editor client.
Base data structures
Tree View
One "tree view" represents the root of a tree along with all of its descendent tree nodes. Multiple tree views can be displayed at the same time in an editor client.

A tree view is uniquely identified by a viewId: string field in other data
structures.
Tree View Node
A tree view can contain multiple tree view nodes. A tree view node can have the following metadata.
interface TreeViewNode {
  /** The ID of the view that this node is associated with. */
  viewId: string;
  /** The URI of this node, or undefined if node is a root of the tree. */
  nodeUri?: string;
  /** The title to display for this node. */
  label: string;
  /** An optional command to trigger when the user clicks on node. */
  command?: Command;
  /** An optional SVG icon to display next to the label of this node. */
  icon?: string;
  /** An optional description of this node that is displayed when the user hovers over this node. */
  tooltip?: string;
  /**
   * Whether this tree node should be collapsed, expanded or if it has no children.
   *
   * - undefined: this node has no children.
   * - collapsed: this node has children and this node should be auto-expanded
   *   on the first load.
   * - expanded: this node has children and the user should manually expand
   *   this node to see the children.
   */
  collapseState?: "expanded" | "collapsed";
}
The children of a tree view node can be obtained through the
metals/treeViewChildren request.
Tree View Command
/**
 * A command to execute on the client when the user clicks on a tree view node.
 */
interface TreeViewCommand {
  /** The title of the command, the client is free to not display this title in the UI. */
  title: string;
  /** The identifier of the command that should be executed by the client. */
  command: string;
  /** A description of what this command does. */
  tooltip?: string;
  /** Optional arguments to invoke the command with. */
  arguments?: any[];
}
Endpoints
The Tree View Protocol (TVP) consists of several JSON-RPC requests and notification endpoints.
initialize
The Tree View Protocol is only enabled when both the client and server declare
support for the protocol by adding an treeViewProvider: true field to the
experimental section of the server and client capabilities in the initialize
response.
{
  "capabilities": {
    "experimental": {
      "treeViewProvider": true
    }
  }
}
metals/treeViewChildren
The tree view children request is sent from the client to the server to get the
children nodes of a tree view node. The client is safe to cache the response of
the children until server sends a metals/treeViewDidChange notification for
the parent node or one of its ancestor nodes.
Request:
- method: 
metals/treeViewChildren - params: 
TreeViewChildrenParamsdefined as follows. 
interface TreeViewChildrenParams {
  /** The ID of the view that this node is associated with. */
  viewId: string;
  /** The URI of the parent node or undefined when listing the root node. */
  nodeUri?: string;
}
Response:
- result: 
TreeViewChildrenResultdefined as follows. 
interface TreeViewChildrenResult {
  /** The child nodes of the requested parent node. */
  nodes: TreeViewNode[];
}
metals/treeViewParent
The tree view parent request is sent from the client to the server to obtain the
parent node of a child node. The metals/treeViewParent endpoint is required to
support metals/treeViewReveal.
Request:
- method: 
metals/treeViewParent - params: 
TreeViewParentParamsdefined as follows. 
interface TreeViewParentParams {
  /** The ID of the view that the nodeUri is associated with. */
  viewId: string;
  /** The URI of the child node. */
  nodeUri: string;
}
Response:
- result: 
TreeViewParentResultdefined as follows. 
interface TreeViewParentResult {
  /** The parent node URI or undefined when the parent is the root node. */
  uri?: string;
}
metals/treeViewDidChange
The tree view did change notification is sent from the server to the client to notify that the metadata about a given tree view node has changed.
Notification:
- method: 
metals/treeViewVisibilityDidChange - params: 
TreeViewDidChangeParamsdefined as follows: 
interface TreeViewDidChangeParams {
  /** The nodes that have changed. */
  nodes: TreeViewNode[];
}
metals/treeViewVisibilityDidChange
The visibility did change notification is sent from the client to the server to notify that the visibility of a tree view has changed.
Notification:
- method: 
metals/treeViewVisibilityDidChange - params: 
TreeViewVisibilityDidChangeParamsdefined as follows: 
interface TreeViewVisibilityDidChangeParams {
  /** The ID of the view that this node is associated with. */
  viewId: string;
  /** True if the node is visible in the editor UI, false otherwise. */
  visible: boolean;
}
metals/treeViewNodeCollapseDidChange
The collapse did change notification is sent from the client to the server to notify that a tree node has either been collapsed or expanded.
Notification:
- method: 
metals/treeViewNodeCollapseDidChange - params: 
TreeViewNodeCollapseDidChangeParamsdefined as follows: 
interface TreeViewNodeCollapseDidChangeParams {
  /** The ID of the view that this node is associated with. */
  viewId: string;
  /** The URI of the node that was collapsed or expanded. */
  nodeUri: string;
  /** True if the node is collapsed, false if the node was expanded. */
  collapsed: boolean;
}
metals/treeViewReveal
The reveal request is sent from the client to the server to convert a text document position into it's corresponding tree view node.
Request:
- method: 
metals/treeViewReveal - params: 
TextDocumentPositionParams, as defined in LSP. 
Response:
- result: 
TreeViewRevealResultdefined as follows. 
interface MetalsTreeRevealResult {
  /** The ID of the view that this node is associated with. */
  viewId: string;
  /**
   * The list of URIs for the node to reveal and all of its ancestor parents.
   *
   * The node to reveal is at index 0, it's parent is at index 1 and so forth
   * up until the root node.
   */
  uriChain: string[];
}
Example implementation of the reveal request.
