/*
 * Copyright 2014 The Kythe Authors. 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.serving;

option go_package = "serving_go_proto";
option java_package = "com.google.devtools.kythe.proto";

import "kythe/proto/common.proto";

// A derivative of xref.NodeInfo for serving.
message Node {
  string ticket = 1;
  repeated kythe.proto.common.Fact fact = 2;

  // This node's definition location (anchor).
  ExpandedAnchor definition_location = 3;
}

// Full representation of a Kythe edge; useful during post-processing.
message Edge {
  Node source = 1;
  string kind = 2;
  int32 ordinal = 5;
  Node target = 3;

  repeated kythe.proto.common.Fact fact = 4;
}

// An EdgeGroup represents a set of edges with the same kind and source.
//
// Note: this is a derivative of xref.EdgeSet_Group
message EdgeGroup {
  message Edge {
    Node target = 1;
    int32 ordinal = 2;
  }
  string kind = 1;
  repeated Edge edge = 2;
}

// PagedEdgeSets are used for efficiently storing EdgeSets, all originating from
// the same source ticket, in order to handle pagination requests.
message PagedEdgeSet {
  // The source node for all the edges in the edge set.
  Node source = 1;

  // Each group is a collection of outbound edges from source node sharing a
  // given kind.
  repeated EdgeGroup group = 2;

  // Total number of edges in all of the EdgePages, including this one.
  int32 total_edges = 3 [deprecated = true];

  // Page indices for other EdgePages, sorted by edge kind.
  repeated PageIndex page_index = 4;
}

// PageIndex is a pointer to an EdgePage.  In order to keep the PagedEdgeSet
// small, we don't store edges here.  We just store a key for looking up an
// EdgePage and the type of edge.
message PageIndex {
  // The kind of all edges on the referred EdgePage.
  string edge_kind = 1;

  // Total number of edges on the referred EdgePage.
  int32 edge_count = 2;

  // Key that can be used to lookup the referred EdgePage.
  string page_key = 3;
}

// EdgePages are a group of edges for a particular edge kind and source ticket.
message EdgePage {
  // Corresponding PageIndex key that can be used to lookup this page.
  string page_key = 1;
  string source_ticket = 2;
  EdgeGroup edges_group = 3;
}

// FileDirectory describes a virtual directory of file nodes.
message FileDirectory {
  // Each known entry in the directory.
  repeated Entry entry = 3;

  message Entry {
    // The kind of entry.
    Kind kind = 1;

    // The basename of the entry within the directory.
    string name = 2;

    // Set of known build configurations of this FILE or all files recursively
    // contained in/below this DIRECTORY.
    repeated string build_config = 3;
  }
  enum Kind {
    UNKNOWN = 0;
    FILE = 1;
    DIRECTORY = 2;
  }

  // Set of URIs for each contained sub-directory's corpus, root, and full path.
  repeated string subdirectory = 1 [deprecated = true];
  // Set of file node tickets contained within this directory.
  repeated string file_ticket = 2 [deprecated = true];
}

// CorpusRoots describes all of the known corpus/root pairs that contain file
// nodes.
message CorpusRoots {
  message Corpus {
    string corpus = 1;
    repeated string root = 2;
    repeated string build_config = 3;
  }
  repeated Corpus corpus = 1;
}

// A File is a specialized Node structure for file nodes.
message File {
  string ticket = 1;
  bytes text = 2;
  string encoding = 3;
}

// A RawAnchor is a specialized Node structure for anchor nodes.
message RawAnchor {
  string ticket = 1;
  int32 start_offset = 2;
  int32 end_offset = 3;

  int32 snippet_start = 4;
  int32 snippet_end = 5;

  string build_configuration = 6;
}

// ExpandedAnchors are constructed from an RawAnchor and its associated File.
// They contain normalized Spans based on their parent file's text as well as
// the UTF8-encoded text for both the anchor's span and its snippet span.
message ExpandedAnchor {
  string ticket = 1;
  string kind = 2;
  reserved 3;

  string text = 4;
  kythe.proto.common.Span span = 5;

  string snippet = 6;
  kythe.proto.common.Span snippet_span = 7;

  string build_configuration = 8;
}

// FileDecorations stores a file's contents and all contained anchor edges.
message FileDecorations {
  File file = 1;

  // Represents an edge from an anchor contained within the file to some target.
  message Decoration {
    RawAnchor anchor = 1;
    string kind = 2;
    string target = 5;

    string target_definition = 4;
    string semantic_scope = 6;
  }

  // The decorations located in the file, sorted by starting offset.
  repeated Decoration decoration = 2;

  // Set of nodes associated with each Decoration.target and
  // target_override.overridden.
  repeated Node target = 4;

  // Set of definition locations for each Decoration.target and
  // target_override.overridden.
  repeated ExpandedAnchor target_definitions = 3;

  // An overrides/extends for a defining Decoration's target.
  //
  // Example:
  //   overriding:  "kythe:#java.lang.String"
  //   kind:        EXTENDS
  //   overridden:  "kythe:#java.lang.Object"
  message Override {
    // What kind of override this is.
    enum Kind {
      OVERRIDES = 0;
      EXTENDS = 1;
    }

    // Ticket of overriding node (i.e. a Decoration target for a definition)
    string overriding = 1;
    // Ticket of node that is being overridden/extended.
    string overridden = 2;
    string overridden_definition = 5;

    Kind kind = 3;

    // MarkedSource for the node being overridden/extended (i.e. node whose
    // ticket is overridden).
    kythe.proto.common.MarkedSource marked_source = 4;
  }

  // List of overrides for target semantic nodes.
  repeated Override target_override = 5;

  // List of file diagnostics.
  repeated kythe.proto.common.Diagnostic diagnostic = 6;
}

// PagedCrossReferences are used for efficiently storing pre-cached data for
// CrossReferencesReply.{definition,reference,caller} anchors and related
// nodes.
message PagedCrossReferences {
  reserved 10;

  // Nodes with cross-references that should be merged into this node's set of
  // cross-references.  These are highly related nodes that share a definition.
  repeated string merge_with = 7;

  // Node which is related to the source_ticket node.  The relation kind is
  // stored in each Group.  See: kythe.proto.CrossReferencesReply.RelatedNode.
  message RelatedNode {
    Node node = 1;
    int32 ordinal = 2;
  }

  // Caller of the source node with all associated callsites within the caller.
  message Caller {
    // The anchor covering the caller.
    ExpandedAnchor caller = 1;

    // The relevant semantic ticket for the caller.
    string semantic_caller = 2;
    // MarkedSource for the caller.
    kythe.proto.common.MarkedSource marked_source = 3;

    // Specific locations within the caller that caused the relationship to
    // exist.
    repeated ExpandedAnchor callsite = 4;
  }

  message Group {
    string kind = 1;

    // Build configuration for all anchors contained within the group.
    string build_config = 5;

    // A group is composed entirely of anchors, related nodes, or callers.
    repeated ExpandedAnchor anchor = 2;
    repeated RelatedNode related_node = 3;
    repeated Caller caller = 4;
  }

  message Page {
    string page_key = 1;
    string source_ticket = 2;
    Group group = 3;
  }

  // A PageIndex is a reference to a Page.
  message PageIndex {
    string kind = 1;
    int32 count = 2;
    string page_key = 3;
    string build_config = 4;
  }

  string source_ticket = 1;
  Node source_node = 8;
  repeated Group group = 2;
  repeated PageIndex page_index = 3;
  int32 total_references = 4 [deprecated = true];

  // Whether the source node is incomplete.  This changes whether
  // /kythe/edge/defines edges are considered declarations or definitions.
  // /kythe/edge/completes edges are always grouped as definitions.
  bool incomplete = 5;

  // The source node's MarkedSource.
  kythe.proto.common.MarkedSource marked_source = 6;
}

// A single node's documentation for the xrefs Documentation API.
message Document {
  string ticket = 1;

  // The node's MarkedSource.
  kythe.proto.common.MarkedSource marked_source = 2;

  // 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 = 3;

  // Annotations for spans in raw_text. The ith Link corresponds to the span
  // starting at the ith [.
  repeated kythe.proto.common.Link link = 4;

  // Tickets for this document node's immediate children.
  repeated string child_ticket = 5;

  // Nodes referenced by documentation Links.
  repeated Node node = 6;

  // If non-empty, this is the ticket of a node whose documentation should
  // subsume this node's documentation.
  string documented_by = 7;
}

// A single identifier's information for the Identifier API
message IdentifierMatch {
  message Node {
    // Kythe ticket for the matched node.
    string ticket = 1;

    // Kind of the node being referenced.
    string node_kind = 2;

    // Subkind of the node being referenced.
    string node_subkind = 3;
  }

  // The fully qualified identifier for the node.
  string qualified_name = 1;

  // The local identifier for the node.
  string base_name = 2;
  repeated Node node = 3;
}

// Relatives stores the nodes connected to a reference node via childOf edges:
// "parents" (nodes that the reference node is a childOf)
// or "children" (nodes that are each a childOf of the reference node).
// Used by ExploreService for the Parents and Children APIs.
message Relatives {
  enum Type {
    UNKNOWN = 0;   // never a valid value
    PARENTS = 1;   // the reference node is a childOf each element of 'tickets'
    CHILDREN = 2;  // each element of 'tickets' is a childOf the reference node
  }

  // Nodes connected to a reference node via childOf edges.
  repeated string tickets = 1;

  Type type = 2;
}

// Callgraph stores the tickets for semantic nodes of functions that call, or
// are called by, a reference function semantic node.
// Used by ExploreService for the Caller and Callee APIs.
message Callgraph {
  enum Type {
    UNKNOWN = 0;  // never a valid value
    CALLER = 1;   // each element of 'tickets' is a caller of the reference node
    CALLEE = 2;   // each element of 'tickets' is called by the reference node
  }

  // Nodes connected to a reference node via the call relationship.
  repeated string tickets = 1;

  Type type = 2;
}
