allwinner_a64/android/prebuilts/tools/linux-x86_64/kythe/proto/xref.proto
2018-08-09 00:01:07 +08:00

734 lines
29 KiB
Protocol Buffer

/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
syntax = "proto3";
package kythe.proto;
// Design document: <link when written>
// This proto represents a very preliminary attempt to define a cross-reference
// service interface, based on Kythe data.
//
// Tickets are Kythe URIs (http://www.kythe.io/docs/kythe-uri-spec.html).
// XRefService provides access to a Kythe graph for fast read-only access to
// cross-reference relationships. What constitutes a "Cross-reference" is not
// precisely defined, but generally includes non-transitive (single-step)
// relation like usage of a declaration, instantiation of a type, invocation of
// a function, direct inheritance or overrides, and so forth. Some transitive
// relations can be converted into cross-references by precomputing a flattened
// representation of a transitive relation. In general, though, this service
// is designed to be most efficient for single-step expansions.
//
// Key design principles:
// - All requests must be satisfied "quickly", e.g., in time proportional to
// the size of the returned set.
//
// - The client should be able to batch related requests.
//
// - The client specifies exactly what facts should be returned.
//
// There is no distinction made in the API between "node not found" and "no
// facts/edges for node". A node is extensionally defined by its facts and
// edges, so a node without any facts or edges is not considered to exist.
service XRefService {
// TODO(schroederc): break off Nodes/Edges into a separate service
// Nodes returns a subset of the facts for each of the requested nodes.
rpc Nodes(NodesRequest) returns (NodesReply) {}
// Edges returns a subset of the outbound edges for each of a set of
// requested nodes.
rpc Edges(EdgesRequest) returns (EdgesReply) {}
// Decorations returns an index of the nodes and edges associated with a
// particular file node.
rpc Decorations(DecorationsRequest) returns (DecorationsReply) {}
// CrossReferences returns the global references, definitions, and
// documentation of a set of requested nodes.
rpc CrossReferences(CrossReferencesRequest) returns (CrossReferencesReply) {}
// Callers takes a set of tickets for semantic objects and returns the set
// of places where those objects were called. For example, in the program
// void bar() { foo(); foo(); } void baz() { foo(); } void foo() { }
// `Callers({foo})` would return:
// {(bar, {first-call-anchor, second-call-anchor}),
// (baz, {first-call-anchor})}
// To walk further up the call graph, you can project the first field of
// each tuple in the result set ({bar, baz}) and feed that set back in
// to a new Callers request.
//
// The core of this query is specified in terms of graph operations in the
// Kythe repository at //kythe/docs/schema/callgraph.txt.
rpc Callers(CallersRequest) returns (CallersReply) {}
// Documentation takes a set of tickets for semantic objects and returns
// documentation about them, including generated signatures and
// user-provided text. The documentation may refer to tickets for other
// nodes in the graph.
rpc Documentation(DocumentationRequest) returns (DocumentationReply) {}
}
message NodesRequest {
// The tickets of the nodes to be looked up.
repeated string ticket = 1;
// A collection of filter globs that specify which facts (by name) should be
// returned for each node. If filter is empty or unset, all available facts
// are returned for each matching node. The filter applies to ALL requested
// nodes. For different filters per node, the client must issue separate
// requests. See EdgesRequest for the format of the filter globs.
repeated string filter = 2;
}
message NodeInfo {
// The matching facts known for that node, a map from fact name to value.
map<string, bytes> facts = 2;
// If known and unambiguous, an anchor ticket for this node's definition
// location.
string definition = 5;
reserved 1;
reserved "ticket";
}
message NodesReply {
// One NodeInfo, keyed by its ticket, is returned for each requested node
// that had a non-zero number of matching facts. Each NodeInfo will not have
// its ticket set since it would just be a copy of the map keys.
map<string, NodeInfo> nodes = 1;
}
message EdgesRequest {
// The tickets of the source nodes for which edges are requested.
// The service will return an error if no tickets are specified.
repeated string ticket = 1;
// The kinds of outbound edges that should be returned for each matching
// source node. If empty, all available edge kinds are returned.
repeated string kind = 2;
// A collection of filter globs that specify which facts (by name) should be
// returned for the target node of each matching edge. If filter is empty,
// no facts are returned.
//
// The supported glob operators are:
// * zero or more non-slash characters ([^/]*)
// ? any single non-slash character ([^/])
// ** zero or more of any character (.*)
//
// All other characters match literally, and the glob must consume the entire
// name in order to match. The facts returned are the union of those matched
// by all the globs provided.
repeated string filter = 3;
// The edges matching a request are organized into logical pages. The size
// of each page is a number of distinct edges. Notionally: All the matching
// edges are ordered lexicographically by (start_ticket, kind, end_ticket);
// the page_token determines where in the ordering to start, and page_size
// determines how many edges should be returned.
//
// If page_token is empty, edges will be returned starting at the beginning
// of the sequence; otherwise the starting point named by the page_token will
// be used. Legal values of page_token are returned by the server in the
// next_page_token field of the EdgesReply. A page token should be treated
// as an opaque value by the client, and is valid only relative to a
// particular set of tickets and kinds. If an invalid page token is
// requested, the server will return an error.
//
// If page_size > 0, at most that number of edges will be returned by the
// service for this request (see EdgeSet and EdgesReply below).
// If page_size = 0, the default, the server will assume a reasonable default
// page size. The server will return an error if page_size < 0.
//
// The server is allowed to return fewer edges than the requested page_size,
// even if more are available, save that it must return at least 1 edge if
// any are available at all.
int32 page_size = 8;
string page_token = 9;
// TODO(fromberger): Should this interface support automatic indirection
// through "name" nodes?
// For now, I'm assuming name-indirecting lookup will be a separate
// API, and that the initial clients will just make two (batching)
// calls if they need to.
}
// An EdgeSet represents a collection of edges outbound from a single node. The
// edges are organized into groups, each sharing a common edge kind.
//
// The number of edges represented by an EdgeSet es, denoted len(es), is the sum
// of the lengths of the repeated edge fields for all the groups in the EdgeSet.
// This count is used to determine page size in a request.
message EdgeSet {
message Group {
message Edge {
string target_ticket = 1;
// An optional integer to give an ordering between multiple edges of same
// source and kind to one or more targets. See https://kythe.io/schema
// for when ordinals are used for a given edge kind.
int32 ordinal = 2;
}
repeated Edge edge = 2;
reserved 1;
reserved "kind";
}
// Each group is a collection of outbound edges from source node sharing a
// given kind, the map's keys. In a given EdgeSet, the server will not send
// more than one group with the same kind label.
map<string, Group> groups = 2;
reserved 1;
reserved "source_ticket";
}
message EdgesReply {
// This field will contain one EdgeSet for each source node with one or more
// matching outbound edges, keyed by the source node's ticket. The number of
// edges represented by an EdgesReply er, denoted len(er), is the sum of
// len(es) for each es in edge_sets. This count is used to determine the page
// size.
map<string, EdgeSet> edge_sets = 1;
// This field will contain one entry, keyed by ticket, for each distinct node
// referenced by some edge in edgesets, for which there is one or more
// matching facts.
//
// Rationale: This prevents us from having to copy the data to all the end
// nodes, but allows the client to have that information without making
// additional requests.
map<string, NodeInfo> nodes = 2;
// Total number of edges on all pages matching requested kinds, by kind.
map<string, int64> total_edges_by_kind = 5;
// If there are additional pages of edges after the ones returned in this
// reply, next_page_token is the page token that may be passed to fetch the
// next page in sequence after this one. If there are no additional edges,
// this field will be empty.
string next_page_token = 9;
}
// A Location represents a single span of zero or more contiguous bytes of a
// file or buffer. An empty LOCATION denotes the entirety of the referenced
// file or buffer.
//
message Location {
// TODO(schroederc): reuse Span from common.proto
// The ticket of the file this location belongs to. If the location
// represents a memory buffer, the ticket should be omitted.
string ticket = 1;
enum Kind {
// The entire file; the start and end fields are ignored.
FILE = 0;
// The point or span of file subtended by start and end.
SPAN = 1;
}
// What kind of location this is.
Kind kind = 2;
// A Point represents a location within a file or buffer.
//
// If line_number ≤ 0, the line number and column offset are considered
// unknown and will be ignored.
//
// A point with line_number > 0 is said to be _normalized_ if it satisfies
// the constraint 0 ≤ column_offset ≤ bytelen(line_number); that is, if the
// column_offset is within the actual range of the corresponding line. A
// point can be normalized by adjusting line_number and column_offset so that
// this constraint is satisfied. This may be impossible if the column offset
// exceeds the bounds of the file.
message Point {
// The offset in bytes from the beginning of the file.
// Requires 0 ≤ byte_offset ≤ len(file).
int32 byte_offset = 1;
// The line number containing the point, 1-based.
int32 line_number = 2;
// The byte offset of the point within its line.
int32 column_offset = 3;
}
// The starting point of the location.
Point start = 3;
// The ending point of the location.
Point end = 4;
// A location is _valid_ if 0 ≤ start.offset ≤ end.offset. If a valid
// location has start.offset = end.offset, it denotes a single point;
// otherwise it denotes the half-closed interval [start.offset, end.offset).
//
// When kind = FILE, start and end should be unset or set to zero values.
}
message DecorationsRequest {
// The location of the file to fetch decorations for. The ticket of location
// must be non-empty. It is an error in any case if location is invalid.
Location location = 1;
enum SpanKind {
// If the location is a SPAN, only decorations contained within the
// specified window of the file are returned. This is the default behavior.
WITHIN_SPAN = 0;
// If the location is a SPAN, any decorations that surround it are returned.
AROUND_SPAN = 1;
}
// How to treat SPAN locations.
SpanKind span_kind = 10;
// If dirty_buffer is non-empty, the results will be adjusted (patched) to
// account for the regions of the specified file differing from the contents
// of the dirty buffer.
bytes dirty_buffer = 2;
// If true, return the encoded source text for the selected window. Source
// text is not affected by patching.
bool source_text = 3;
// If true, return reference edges whose source nodes are located in the
// selected window. References are affected by patching.
bool references = 4;
// If true, return definition locations, if possible, for each returned
// reference target in the DecorationsReply.
bool target_definitions = 6;
// A collection of filter globs that specify which facts (by name) should be
// returned for each node. If filter is empty or unset, no node facts are
// returned. The filter applies to ALL referenced nodes. See EdgesRequest
// for the format of the filter globs.
repeated string filter = 5;
}
message DecorationsReply {
// The normalized location for which decorations are returned.
Location location = 1;
// The encoded source text for the selected window.
bytes source_text = 2;
string encoding = 3;
// Represents a reference edge source ---KIND---> target. Each source is an
// anchor within the requested source location.
message Reference {
string source_ticket = 1;
string target_ticket = 2;
string kind = 3;
// Starting byte offset of this references's anchor (source_ticket) span.
Location.Point anchor_start = 10;
// Ending byte offset of this references's anchor (source_ticket) span.
Location.Point anchor_end = 11;
// Anchor ticket of the target's definition. Populated only if
// target_definitions is true in the DecorationsRequest and the target has
// a single unambiguous definition. For each ticket, an Anchor will be
// populated in the top-level definition_locations map.
string target_definition = 4;
}
// The reference edges located in the specified window.
repeated Reference reference = 4;
// This field will contain one entry, keyed by ticket, for each distinct node
// referenced by a reference edge that has at least 1 non-filtered fact.
map<string, NodeInfo> nodes = 15;
// Each anchor cited as a target definition in the references. The map is
// keyed by each anchor's ticket.
map<string, Anchor> definition_locations = 16;
// TODO(fromberger): Patch diff information.
}
message CrossReferencesRequest {
// Set of nodes for which to return their cross-references. Must be
// non-empty.
repeated string ticket = 1;
enum DefinitionKind {
// No definitions will be populated in the CrossReferencesReply.
NO_DEFINITIONS = 0;
// All known definition anchors reached by the "/kythe/edge/defines" edge
// kind (or its variants) will be populated in the CrossReferencesReply.
ALL_DEFINITIONS = 1;
// Only definition anchors reached by the "/kythe/edge/defines" edge kind
// will be populated in the CrossReferencesReply.
FULL_DEFINITIONS = 2;
// Only definition anchors reached by the "/kythe/edge/defines/binding" edge
// kind will be populated in the CrossReferencesReply.
BINDING_DEFINITIONS = 3;
}
// Determines what kind of definition anchors, if any, should be returned in
// the response. See the documentation for each DefinitionKind for more
// information.
DefinitionKind definition_kind = 2;
enum DeclarationKind {
// No declarations will be populated in the CrossDeclarationsReply.
NO_DECLARATIONS = 0;
// When the source node is incomplete, all known declaration anchors reached
// by the "/kythe/edge/defines" edge kind (or its variants) will be
// populated in the CrossDeclarationsReply.
ALL_DECLARATIONS = 1;
}
// Determines what kind of declaration anchors, if any, should be returned in
// the response. See the documentation for each DeclarationKind for more
// information.
DeclarationKind declaration_kind = 7;
enum ReferenceKind {
// No references will be populated in the CrossReferencesReply.
NO_REFERENCES = 0;
// Only callgraph-related references as described in
// http://www.kythe.io/docs/schema/callgraph.html
CALL_REFERENCES = 1;
// All references except those that are related to the callgraph.
NON_CALL_REFERENCES = 2;
// All known reference anchors reached by the "/kythe/edge/ref" edge kind
// (or its variants) will be populated in the CrossReferencesReply.
ALL_REFERENCES = 3;
}
// Determines what kind of reference anchors, if any, should be returned in
// the response. See the documentation for each ReferenceKind for more
// information.
ReferenceKind reference_kind = 3;
enum DocumentationKind {
// No documentation will be populated in the CrossReferencesReply.
NO_DOCUMENTATION = 0;
// All known documentation reached by the "/kythe/edge/documentation" edge
// kind (or its variants) will be populated in the CrossReferencesReply.
ALL_DOCUMENTATION = 1;
}
// Determines what kind of documentation anchors, if any, should be returned
// in the response. See the documentation for each DocumentationKind for more
// information.
DocumentationKind documentation_kind = 4;
enum CallerKind {
// No callgraph information will be populated in the CrossReferencesReply.
NO_CALLERS = 0;
// Callgraph information will be populated in the CrossReferencesReply.
DIRECT_CALLERS = 1;
// Callgraph information will be populated in the CrossReferencesReply.
// Calls to override-related functions will also be considered.
OVERRIDE_CALLERS = 2;
}
// Determines what kind of callgraph information, if any, should be returned
// in the response. See the documentation for each CallerKind for more
// information.
CallerKind caller_kind = 12;
// Collection of filter globs that determines which facts will be returned for
// the related nodes of each requested node. If filter is empty or unset, no
// node facts or related nodes are returned. See EdgesRequest for the format
// of the filter globs.
repeated string filter = 5;
// Determines whether each Anchor in the response should have its text field
// populated.
bool anchor_text = 6;
// Determines whether each NodeInfo matching the above filters will have its
// definition location populated, if known.
bool node_definitions = 8;
// Enable the experimental generation of signatures in the
// CrossReferencesReply. Enabling this currently causes multiple lookups and
// can significantly impact latency. Once latency concerns have been
// addressed, this field will be removed and signatures will be returned by
// default.
// TODO(T156): remove this flag; always enable feature
bool experimental_signatures = 100;
// TODO(schroederc): snippet kinds (none, indexer-default, or always line-based)
// The cross-references matching a request are organized into logical pages.
// The size of each page is a number of distinct cross-references
// (definitions, references, documentation, and related nodes).
//
// If page_token is empty, cross-references will be returned starting at the
// beginning of the sequence; otherwise the starting point named by the
// page_token will be used. Legal values of page_token are returned by the
// server in the next_page_token field of the CrossReferencesReply. A page
// token should be treated as an opaque value by the client, and is valid only
// relative to a particular CrossReferencesRequest. If an invalid page token
// is requested, the server will return an error.
//
// If page_size > 0, at most that number of cross-references will be returned
// by the service for this request (see ReferenceSet and CrossReferencesReply
// below). If page_size = 0, the default, the server will assume a reasonable
// default page size. The server will return an error if page_size < 0.
//
// The server is allowed to return fewer cross-references than the requested
// page_size, even if more are available, save that it must return at least 1
// edge if any are available at all.
int32 page_size = 10;
string page_token = 11;
}
// TODO(schroederc): eliminate duplicate serving.ExpandedAnchor message defintion
message Anchor {
// Ticket of the anchor node
string ticket = 1;
// Edge kind describing the anchor's relationship with its referenced node
string kind = 2;
// Parent ticket of the anchor; this is the file containing the anchor
string parent = 3;
// Starting location of the anchor within its parent's text
Location.Point start = 4;
// Ending location of the anchor within its parent's text
Location.Point end = 5;
// The anchor's spanning text within the anchor parent's text
string text = 6;
// User-readable snippet of the anchor parent's text at the location of this
// anchor
string snippet = 7;
// Starting location of the anchor's snippet within its parent's text
Location.Point snippet_start = 8;
// Ending location of the anchor's snippet within its parent's text
Location.Point snippet_end = 9;
}
message Link {
// Definition sites found for some ticket.
repeated Anchor definition = 1;
}
message Printable {
// Raw text that can be displayed to the user (but may also contain
// markup that can be interpreted, like Doxygen comments). Links are
// marked using []. \ is an escape character (where possible escape
// sequences are \[, \], and \\).
string raw_text = 1;
// Destinations for links in raw_text. The ith Link corresponds to the link
// starting at the ith [.
repeated Link link = 2;
}
message CrossReferencesReply {
message RelatedNode {
// Ticket of the node
string ticket = 1;
// Edge kind describing the node's relation
string relation_kind = 2;
// Optional ordinal for edges of the same relation_kind.
int32 ordinal = 3;
}
message RelatedAnchor {
// The anchor covering the related object.
Anchor anchor = 1;
// A name for the related object.
Printable display_name = 2;
// Specific locations, usually within the related object, that caused
// the relationship to exist. This field is relevant to caller sets.
repeated Anchor site = 3;
}
message CrossReferenceSet {
string ticket = 1;
// A name for the given node.
Printable display_name = 7;
// The set of definitions for the given node.
repeated RelatedAnchor definition = 2;
// The set of declarations for the given node.
repeated RelatedAnchor declaration = 5;
// The set of simple references for the given node.
repeated RelatedAnchor reference = 3;
// The set of documentation for the given node.
repeated RelatedAnchor documentation = 4;
// The set of callers for the given node.
repeated RelatedAnchor caller = 6;
// The set of related nodes to the given node.
repeated RelatedNode related_node = 10;
}
message Total {
int64 definitions = 1;
int64 declarations = 2;
int64 references = 3;
int64 documentation = 4;
int64 callers = 5;
map<string, int64> related_nodes_by_relation = 6;
}
// Total number of cross-references on all pages matching requested filters.
Total total = 5;
// Sets of cross-references for each requested node
map<string, CrossReferenceSet> cross_references = 1;
// The facts left from the requested filters of the related node facts
map<string, NodeInfo> nodes = 2;
// Map from the definition tickets referred to in each NodeInfo to their
// Anchor. This map will only be returned if the
// CrossReferencesRequest.node_definitions switch is true.
map<string, Anchor> definition_locations = 3;
// If there are additional pages of cross-references after the ones returned
// in this reply, next_page_token is the page token that may be passed to
// fetch the next page in sequence after this one. If there are no additional
// cross-references, this field will be empty.
string next_page_token = 10;
}
message CallersRequest {
// Semantic tickets for callees (e.g., function nodes).
repeated string semantic_object = 1;
// Expand the semantic_object set by including nodes that participate in
// an `overrides` relationship (in either direction) with nodes in the set.
//
// In the program:
// struct A { virtual void f(); };
// struct B : public A { void f() override; };
// struct C : public B { void f() override; };
// void g(B* b) { b->f(); }
//
// we would return the following results (for queries on the singleton
// semantic_object set containing A::f, B::f, or C::f):
//
// include_overrides A::f B::f C::f
// false {} {g} {}
// true {g} {g} {g}
bool include_overrides = 2;
}
message CallersReply {
// Details common to all objects that participate in the call graph.
message CallableDetail {
// The definition site of the object called or being blamed for a call.
// This would be the "bar" in "void bar()" for calls blamed on bar above
// and the "foo" in "void foo()" if it refers to foo as a callee.
Anchor definition = 1;
// The ticket of the callable object. This would refer to the function node
// for "bar" or "foo". This object may be the target of a `completes` edge
// (e.g., if the call was made to a definition rather than a declaration).
string semantic_object = 2;
// The unqualified identifier for this object ("bar" or "foo" above,
// even if they were defined in some namespace or record). This field
// should be human-readable and can be displayed in a UI.
string identifier = 4;
// An unambiguous (as possible) identifier for this object ("bar()" or
// "foo()" above; if it was defined in a namespace, "ns::bar()";
// if it took arguments, "ns::bar(int *, void *)"). This field should
// be human-readable and can be displayed in a UI.
string display_name = 5;
// A parameter bound by the object referred to by `definition` above.
message Parameter {
enum Kind {
// A term-level binding (like the `x` in `void foo(int x)`).
TERM = 0;
// A type-level binding (like the `T` in
// `template <typename T> void foo()`).
TYPE = 1;
}
// The parameter's kind.
Kind kind = 1;
// The parameter's (unqualified) human-readable and displayable name.
// May be empty. May also be non-unique; for example, the identifiers for
// the (unnamed in the source language) parameters for the function
// `void ignore_pair(int, int)` may be "int" and "int".
string identifier = 2;
// The ticket that refers to the parameter.
string ticket = 3;
}
// The parameters bound by the object referred to by `definition` above.
// There is no semantic meaning to the order of this array, but it should
// be reasonable to surface the ordering in a UI (for example, term-level
// parameters will not be capriciously reordered).
repeated Parameter parameter = 6;
}
// An object that was blamed for making a call to an object in the set passed
// to Callers, along with the syntactic locations that caused that blame to
// be cast.
message Caller {
// The object (e.g., a function) responsible for making a call.
CallableDetail detail = 1;
message CallSite {
// The location where a call was found inside the blamed object.
Anchor anchor = 1;
// This field will be set to true iff this call site was included in the
// results because include_overrides was true in CallersRequest.
bool call_to_override = 2;
}
repeated CallSite call_site = 2;
}
// All objects that were blamed for making calls.
repeated Caller caller = 1;
// Details for the semantic objects that were passed via a CallersRequest.
repeated CallableDetail callee = 2;
}
message DocumentationRequest {
// Semantic tickets about which documentation is sought.
repeated string ticket = 1;
}
message DocumentationReply {
message Document {
// The ticket to which this Document refers.
string ticket = 1;
// Documentation that can be displayed to the user.
Printable text = 2;
// A signature that can be displayed to the user. For variables, this
// may just be the variable name; for functions, this may be some version
// of the function prototype.
Printable signature = 3;
// The type as a signature that can be displayed to the user.
Printable type = 4;
// The initialization value, if any.
Printable initializer = 5;
// The semantic parent of this value.
Printable defined_by = 6;
// The node kind being defined.
string kind = 7;
}
repeated Document document = 1;
}