/*
|
* Copyright (C) 2015, 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.
|
*/
|
|
#pragma once
|
|
#include <set>
|
#include <sstream>
|
#include <string>
|
#include <vector>
|
|
namespace android {
|
namespace aidl {
|
|
using std::set;
|
using std::string;
|
using std::vector;
|
|
// A simple wrapper around ostringstream. This is just to make Options class
|
// copiable by the implicit copy constructor. If ostingstream is not wrapped,
|
// the implcit copy constructor is not generated because ostringstream isn't
|
// copiable. This class makes the field copiable by having a copy constructor
|
// that does not copy the underlying stream.
|
class ErrorMessage {
|
public:
|
ErrorMessage() = default;
|
ErrorMessage(const ErrorMessage&) {}
|
std::ostringstream stream_;
|
|
template <typename T>
|
ErrorMessage& operator<<(T& t) {
|
stream_ << t;
|
return *this;
|
}
|
|
template <typename T>
|
ErrorMessage& operator<<(const T& t) {
|
stream_ << t;
|
return *this;
|
}
|
|
// for "<< endl"
|
ErrorMessage& operator<<(std::ostream& (*f)(std::ostream&)) {
|
f(stream_);
|
return *this;
|
}
|
};
|
|
class Options final {
|
public:
|
enum class Language { UNSPECIFIED, JAVA, CPP, NDK };
|
|
enum class Task { UNSPECIFIED, COMPILE, PREPROCESS, DUMP_API, CHECK_API, DUMP_MAPPINGS };
|
|
Options(int argc, const char* const argv[], Language default_lang = Language::UNSPECIFIED);
|
|
static Options From(const string& cmdline);
|
|
static Options From(const vector<string>& args);
|
|
// Contain no references to unstructured data types (such as a parcelable that is
|
// implemented in Java). These interfaces aren't inherently stable but they have the
|
// capacity to be stabilized.
|
bool IsStructured() const { return structured_; }
|
|
Language TargetLanguage() const { return language_; }
|
bool IsCppOutput() const { return language_ == Language::CPP || language_ == Language::NDK; }
|
|
Task GetTask() const { return task_; }
|
|
const set<string>& ImportDirs() const { return import_dirs_; }
|
|
const set<string>& ImportFiles() const { return import_files_; }
|
|
const vector<string>& PreprocessedFiles() const { return preprocessed_files_; }
|
|
string DependencyFile() const {
|
return dependency_file_;
|
}
|
|
bool AutoDepFile() const { return auto_dep_file_; }
|
|
bool GenTraces() const { return gen_traces_; }
|
|
bool GenTransactionNames() const { return gen_transaction_names_; }
|
|
bool DependencyFileNinja() const { return dependency_file_ninja_; }
|
|
const vector<string>& InputFiles() const { return input_files_; }
|
|
// Path to the output file. This is used only when there is only one
|
// output file for the invocation. When there are multiple outputs
|
// (e.g. compile multiple AIDL files), output files are created under
|
// OutputDir().
|
const string& OutputFile() const { return output_file_; }
|
|
// Path to the directory where output file(s) will be generated under.
|
const string& OutputDir() const { return output_dir_; }
|
|
// Path to the directory where header file(s) will be generated under.
|
// Only used when TargetLanguage() == Language::CPP
|
const string& OutputHeaderDir() const { return output_header_dir_; }
|
|
bool FailOnParcelable() const { return fail_on_parcelable_; }
|
|
int Version() const { return version_; }
|
|
bool GenLog() const { return gen_log_; }
|
|
bool Ok() const { return error_message_.stream_.str().empty(); }
|
|
string GetErrorMessage() const { return error_message_.stream_.str(); }
|
|
string GetUsage() const;
|
|
bool GenApiMapping() const { return task_ == Task::DUMP_MAPPINGS; }
|
|
// The following are for testability, but cannot be influenced on the command line.
|
// Threshold of interface methods to enable outlining of onTransact cases.
|
size_t onTransact_outline_threshold_{275u};
|
// Number of cases to _not_ outline, if outlining is enabled.
|
size_t onTransact_non_outline_count_{275u};
|
|
private:
|
Options() = default;
|
|
const string myname_;
|
bool structured_ = false;
|
Language language_ = Language::UNSPECIFIED;
|
Task task_ = Task::COMPILE;
|
set<string> import_dirs_;
|
set<string> import_files_;
|
vector<string> preprocessed_files_;
|
string dependency_file_;
|
bool gen_traces_ = false;
|
bool gen_transaction_names_ = false;
|
bool dependency_file_ninja_ = false;
|
string output_dir_;
|
string output_header_dir_;
|
bool fail_on_parcelable_ = false;
|
bool auto_dep_file_ = false;
|
vector<string> input_files_;
|
string output_file_;
|
int version_ = 0;
|
bool gen_log_ = false;
|
ErrorMessage error_message_;
|
};
|
|
} // namespace android
|
} // namespace aidl
|