// Copyright 2018 The Bazel 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 bazel.kotlin;

option java_package = "io.bazel.kotlin.model";

// An abstract definition of an annotation processor. This is encoded into a format understood by kapt3.
// +stable
message AnnotationProcessor {
    // The annotation processor class.
    string processor_class = 1;
    // The Bazel `java_plugin` `generates_api` attribute.
    bool generates_api = 2;
    // The full transitive classpath required for annotation processing.
    repeated string classpath = 3;
    // The label of the plugin.
    string label = 4;
}

// A container for all of the types of compiler plugins needed by the kotlin compilers.
// +stable
message CompilerPlugins {
    // Regular java annotation_processor descriptors.
    repeated AnnotationProcessor annotation_processors = 1;
}

// Toolchain info this contains info to be used to configure the compile tasks as well as configuring certain features
// in IDE plugins.
// +stable
message KotlinToolchainInfo {
    // Common properties that should be common to all platforms.
    message Common {
        // mandatory
        string language_version = 1;
        // mandatory
        string api_version = 2;
        // mandatory
        // oneof "enable", "warn" or "error"
        string coroutines = 3;
    }

    // Properties specific to the JVM.
    message Jvm {
        // The property is additionally to configure the source and target bytecode levels in kapt3, javac and kotlin.
        // mandatory
        // oneof "1.6", or "1.8"
        string jvm_target = 1;
    }

    Common common = 1;
    Jvm jvm = 2;
}

// Mested messages not marked with stable could be refactored.
message BuilderCommand {
    message Info {
        string label = 1;
        // derived from label
        string package = 2;
        // derived from label
        string target = 3;

        string rule_kind = 4;
        string kotlin_module_name = 5;

        string passthrough_flags = 6;
        KotlinToolchainInfo toolchain_info = 7;

        CompilerPlugins plugins = 8;

        // All of the plugin descriptors in the format kotlinc understands.
        // +derived
        repeated string encoded_plugin_descriptors = 9;

        // Jars that the kotlin compiler will allow package private access to.
        repeated string friend_paths = 10;
    }

    // Directories used by the builder.
    // +stable
    message Directories {
        // The directory the compiler should use for class files.
        string classes = 1;
        // The directory to use by annotation processors to produce classes.
        string generated_classes = 2;
        // The directory used by annotation processors. The generated sources are currently only java.
        string generated_sources = 3;
        // A temp directory that the compiler may use. The source_jars are expanding into here.
        string temp = 4;
    }

    // Outputs produced by the builder.
    // +stable
    message Outputs {
        // The path to the primary output jar.
        string jar = 1;
        // The path to the jdeps file.
        string jdeps = 2;
    }

    message Inputs {
        // The full classpath
        repeated string classpath = 1;
        // The full joined classpath
        // +derived
        string joined_classpath = 2;
        // Direct dependencies of the target.
        map<string, string> direct_dependencies = 3;
        // Indirect dependencies of the target.
        map<string, string> indirect_dependencies = 4;

        // Partitioned from the builder flags and by expanding the source_jars.
        // +derived
        repeated string kotlin_sources = 5;
        // Partitioned from the builder flags and by expanding the source_jars.
        // +derived
        repeated string java_sources = 6;
        // Created during annotation processing and partitioned from the generated_sources directory.
        // +dervived
        repeated string generated_kotlin_sources = 7;
        // Created during annotation processing and partitioned from the generated_sources directory.
        // +derived
        repeated string generated_java_sources = 8;
        // Jars containing additional sources.
        repeated string source_jars = 9;
    }

    Info info = 1;
    Directories directories = 2;
    Outputs outputs = 3;
    Inputs inputs = 4;
}