/* * 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; option java_package = "com.google.devtools.kythe.proto"; import "google/protobuf/any.proto"; import "kythe/proto/storage.proto"; // CompilationAnalyzer services are exposed by any program that wants to plug // into the Kythe pipeline to perform per-compilation analysis. service CompilationAnalyzer { // Analyze is the main entry point for the analysis driver to send work to the // analyzer. The analysis may produce many outputs which will be streamed as // framed AnalysisOutput messages. // // A driver may choose to retry analyses that return RPC errors. It should // not retry analyses that are reported as finished unless it is necessary to // recover from an external production issue. rpc Analyze(AnalysisRequest) returns (stream AnalysisOutput) {} } // FileDataServices are used by a CompilationAnalyzer to retrieve the contents of // input files required for analysis. service FileDataService { // Get returns the contents of one or more files needed for analysis. It is // the server's responsibility to do any caching necessary to make this // perform well, so that an analyzer does not need to implement its own // caches unless it is doing something unusual. // // For each distinct path/digest pair in the request, the server must return // exactly one response. The order of the responses is arbitrary. // // For each requested file, one or both of the path and digest fields must be // nonempty, otherwise an error is returned. It is not an error for there to // be no requested files, however. rpc Get(FilesRequest) returns (stream FileData) {} } // An AnalysisRequest instructs an analyzer to perform an analysis on a single // CompilationUnit. message AnalysisRequest { // The compilation to analyze. CompilationUnit compilation = 1; // The address of a file data service to use. If this is provided, it should // be used in preference to any other file data service the analyzer may know // about for this compilation. string file_data_service = 2; } // AnalysisOutput contains an output artifact for the current analysis taking // place. A given analysis may not produce any outputs. It is okay for an // indexer to send an empty AnalysisOutput message if needed to keep the RPC // channel alive; the driver must correctly handle this. message AnalysisOutput { bytes value = 1; } // Describes a single unit of compilation. message CompilationUnit { // The base VName for the compilation and any generated VNames from its // analysis. Generally, the `language` component designates the language of // the compilation's sources. VName v_name = 1; // The revision of the compilation. string revision = 2; // All files that might be touched in the course of this compilation. // Consumers of the CompilationUnit may not assume anything about the order // of the elements of this field. repeated FileInput required_input = 3; // Set by the extractor to indicate that the original input had compile // errors. This is used to check validity of the sharded analysis. bool has_compile_errors = 4; // The arguments to pass to a compiler tool for this compilation unit, // including the compiler executable, flags, and input files. repeated string argument = 5; // Of those files in `required_input`, the ones that this CompilationUnit // is intended to analyze. This is necessary to support languages like Go, // where a single translation unit may contain many source files that must all // be processed at once (while excluding source files that belong to other // CUs/packages, if any). repeated string source_file = 6; // The output key of the CompilationUnit; for example, the object file that // it writes. The output key for a compilation should match the path in the // FileInfo message of a dependent compilation that consumes its output. string output_key = 7; // ContextDependentVersionColumn and ContextDependentVersionRow // define a table that relates input contexts (keyed by a single // source context per row) to tuples of (byte offset * linked context). // When a FileInput F being processed in context C refers to another // FileInput F' at offset O (perhaps because F has an #include directive at O) // the context in which F' should be processed is the linked context derived // from this table. message ContextDependentVersionColumn { // The byte offset into the file resource. int32 offset = 1; // The signature for the resulting context. string linked_context = 2; } // See ContextDependentVersionColumn for details. // It is valid for a ContextDependentVersionRow to have no columns. In this // case, the associated FileInput was seen to exist in some context C, but // did not refer to any other FileInputs while in that context. message ContextDependentVersionRow { // The context to be applied to all columns. string source_context = 1; // A map from byte offsets to linked contexts. repeated ContextDependentVersionColumn column = 2; // If true, this version should always be processed regardless of any // claiming. bool always_process = 3; } message FileInput { // If set, overrides the `v_name` in the `CompilationUnit` for deriving // VNames during analysis. VName v_name = 1; // The file's metadata. It is invalid to provide a FileInput without both // the file's path and digest. FileInfo info = 2; // The file's context-dependent versions. repeated ContextDependentVersionRow context = 3; } // The absolute path of the current working directory where the build tool // was invoked. During analysis, a file whose path has working_directory // plus a path separator as an exact prefix is considered accessible from // that same path without said prefix. It is only necessary to set this // field if the build tool requires it. string working_directory = 8; // For languages that make use of resource contexts (like C++), the context // that should be initially entered. // TODO(zarko): What is a "resource context"? Needs a clear definition and/or // a link to one. string entry_context = 9; // An Env message represents the name and value of a single environment // variable in the build environment. message Env { string name = 1; string value = 2; } // A collection of environment variables that the build environment expects // to be set. As a rule, we only record variables here that must be set to // specific values for the build to work. Users of this field may not assume // anything about the order of values; in particular the pipeline is free to // sort by name in order to canonicalize the message. repeated Env environment = 10; // Per-language or per-tool details. repeated google.protobuf.Any details = 11; } // A FilesRequest specifies a collection of files to be fetched from a // FileDataService. message FilesRequest { repeated FileInfo files = 1; } // A FileInfo identifies a file used for analysis. // At least one of the path and digest fields must be non-empty. message FileInfo { // The path of the file relative to the working directory of the compilation // command, which is typically the root of the build. // For example: // file/base/file.cc // ../../base/atomic_ref_count.h string path = 1; // The lowercase ascii hex SHA-256 digest of the file contents. string digest = 2; } // A FileData carries the content of a single file, as returned from the Get // method of a FileDataService. message FileData { // The content of the file, if known. If missing == true, this field must be // empty. bytes content = 1; // A (possibly normalized) copy of the non-empty fields of the FileInfo // message from the Get request. If either field from the original request // was empty, the server may optionally fill in that field in the reply if it // is known. For example, if the client requested a file by path only and // the server found it, the reply MAY fill in the digest. FileInfo info = 2; // If true, no data are available for the requested file, and the content // field must be empty. If false, the content field contains the complete // file content (which may be empty). bool missing = 3; }