/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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";

import "frameworks/base/tools/aapt2/Configuration.proto";
import "frameworks/base/tools/aapt2/Resources.proto";

package aapt.pb.internal;

option java_package = "android.aapt.pb.internal";
option optimize_for = LITE_RUNTIME;

// The top level message representing an external resource file (layout XML, PNG, etc).
// This is used to represent a compiled file before it is linked. Only useful to aapt2.
message CompiledFile {
  message Symbol {
    // The name of the symbol (in the form package:type/name).
    string resource_name = 1;

    // The position in the file at which this symbol is defined. For debug use.
    aapt.pb.SourcePosition source = 2;
  }

  // The name of the resource (in the form package:type/name).
  string resource_name = 1;

  // The configuration for which the resource is defined.
  aapt.pb.Configuration config = 2;

  // The type of the file.
  aapt.pb.FileReference.Type type = 3;

  // The filesystem path to where the source file originated.
  // Mainly used to display helpful error messages.
  string source_path = 4;

  // Any symbols this file auto-generates/exports (eg. @+id/foo in an XML file).
  repeated Symbol exported_symbol = 5;
}
