blob: fdf665a904b80d686d9f4a8e0c43aa3a63bac7e4 [file] [log] [blame]
/*
* 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;
}