mirror of
https://github.com/google/sandboxed-api.git
synced 2024-03-22 13:11:30 +08:00
clang_generator: Emit types outside of namespace, skip Abseil enums
PiperOrigin-RevId: 431913470 Change-Id: Ia44f6642a37501ba1630321ba1430d1bf10cf377
This commit is contained in:
parent
60fcc5b63e
commit
692f0260b3
|
@ -305,7 +305,7 @@ absl::StatusOr<std::string> EmitFunction(const clang::FunctionDecl* decl) {
|
||||||
absl::StrAppend(&out, ", ", IsPointerOrReference(qual) ? "" : "&v_", name);
|
absl::StrAppend(&out, ", ", IsPointerOrReference(qual) ? "" : "&v_", name);
|
||||||
}
|
}
|
||||||
absl::StrAppend(&out, "));\nreturn ",
|
absl::StrAppend(&out, "));\nreturn ",
|
||||||
(returns_void ? "absl::OkStatus()" : "v_ret_.GetValue()"),
|
(returns_void ? "::absl::OkStatus()" : "v_ret_.GetValue()"),
|
||||||
";\n}\n");
|
";\n}\n");
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -331,12 +331,6 @@ absl::StatusOr<std::string> EmitHeader(
|
||||||
absl::StrAppendFormat(&out, kEmbedInclude, include_file);
|
absl::StrAppendFormat(&out, kEmbedInclude, include_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If specified, wrap the generated API in a namespace
|
|
||||||
if (options.has_namespace()) {
|
|
||||||
absl::StrAppendFormat(&out, kNamespaceBeginTemplate,
|
|
||||||
options.namespace_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emit type dependencies
|
// Emit type dependencies
|
||||||
if (!rendered_types.empty()) {
|
if (!rendered_types.empty()) {
|
||||||
absl::StrAppend(&out, "// Types this API depends on\n");
|
absl::StrAppend(&out, "// Types this API depends on\n");
|
||||||
|
@ -353,6 +347,12 @@ absl::StatusOr<std::string> EmitHeader(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If specified, wrap the generated API in a namespace
|
||||||
|
if (options.has_namespace()) {
|
||||||
|
absl::StrAppendFormat(&out, kNamespaceBeginTemplate,
|
||||||
|
options.namespace_name);
|
||||||
|
}
|
||||||
|
|
||||||
// Optionally emit a default sandbox that instantiates an embedded sandboxee
|
// Optionally emit a default sandbox that instantiates an embedded sandboxee
|
||||||
if (!options.embed_name.empty()) {
|
if (!options.embed_name.empty()) {
|
||||||
// TODO(cblichmann): Make the "Sandbox" suffix configurable.
|
// TODO(cblichmann): Make the "Sandbox" suffix configurable.
|
||||||
|
@ -392,13 +392,22 @@ void Emitter::CollectType(clang::QualType qual) {
|
||||||
const std::vector<std::string> ns_path = GetNamespacePath(decl);
|
const std::vector<std::string> ns_path = GetNamespacePath(decl);
|
||||||
std::string ns_name;
|
std::string ns_name;
|
||||||
if (!ns_path.empty()) {
|
if (!ns_path.empty()) {
|
||||||
if (const auto& ns_root = ns_path.front();
|
const auto& ns_root = ns_path.front();
|
||||||
ns_root == "std" || ns_root == "sapi" || ns_root == "__gnu_cxx") {
|
|
||||||
// Filter out any and all declarations from the C++ standard library,
|
// Filter out any and all declarations from the C++ standard library,
|
||||||
// from SAPI itself and from other well-known namespaces. This avoids
|
// from SAPI itself and from other well-known namespaces. This avoids
|
||||||
// re-declaring things like standard integer types, for example.
|
// re-declaring things like standard integer types, for example.
|
||||||
|
if (ns_root == "std" || ns_root == "__gnu_cxx" || ns_root == "sapi") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (ns_root == "absl") {
|
||||||
|
// Skip types from Abseil that we already include in the generated
|
||||||
|
// header.
|
||||||
|
if (auto name = ToStringView(decl->getName());
|
||||||
|
name == "StatusCode" || name == "StatusToStringMode" ||
|
||||||
|
name == "CordMemoryAccounting") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
ns_name = absl::StrCat(ns_path[0].empty() ? "" : " ",
|
ns_name = absl::StrCat(ns_path[0].empty() ? "" : " ",
|
||||||
absl::StrJoin(ns_path, "::"));
|
absl::StrJoin(ns_path, "::"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,10 +40,6 @@ std::string ReplaceFileExtension(absl::string_view path,
|
||||||
return absl::StrCat(path.substr(0, pos), new_extension);
|
return absl::StrCat(path.substr(0, pos), new_extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline absl::string_view ToStringView(llvm::StringRef ref) {
|
|
||||||
return absl::string_view(ref.data(), ref.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
std::string GetOutputFilename(absl::string_view source_file) {
|
std::string GetOutputFilename(absl::string_view source_file) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "absl/memory/memory.h"
|
#include "absl/memory/memory.h"
|
||||||
#include "absl/status/status.h"
|
#include "absl/status/status.h"
|
||||||
#include "absl/status/statusor.h"
|
#include "absl/status/statusor.h"
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "clang/AST/ASTConsumer.h"
|
#include "clang/AST/ASTConsumer.h"
|
||||||
#include "clang/AST/RecursiveASTVisitor.h"
|
#include "clang/AST/RecursiveASTVisitor.h"
|
||||||
#include "clang/Frontend/CompilerInstance.h"
|
#include "clang/Frontend/CompilerInstance.h"
|
||||||
|
@ -128,6 +129,10 @@ class GeneratorFactory : public clang::tooling::FrontendActionFactory {
|
||||||
|
|
||||||
std::string GetOutputFilename(absl::string_view source_file);
|
std::string GetOutputFilename(absl::string_view source_file);
|
||||||
|
|
||||||
|
inline absl::string_view ToStringView(llvm::StringRef ref) {
|
||||||
|
return absl::string_view(ref.data(), ref.size());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sapi
|
} // namespace sapi
|
||||||
|
|
||||||
#endif // SANDBOXED_API_TOOLS_CLANG_GENERATOR_GENERATOR_H_
|
#endif // SANDBOXED_API_TOOLS_CLANG_GENERATOR_GENERATOR_H_
|
||||||
|
|
|
@ -210,10 +210,10 @@ std::string MapQualTypeParameter(const clang::ASTContext& /*context*/,
|
||||||
std::string MapQualTypeReturn(const clang::ASTContext& context,
|
std::string MapQualTypeReturn(const clang::ASTContext& context,
|
||||||
clang::QualType qual) {
|
clang::QualType qual) {
|
||||||
if (qual->isVoidType()) {
|
if (qual->isVoidType()) {
|
||||||
return "absl::Status";
|
return "::absl::Status";
|
||||||
}
|
}
|
||||||
// Remove const qualifier like in MapQualType().
|
// Remove const qualifier like in MapQualType().
|
||||||
return absl::StrCat("absl::StatusOr<",
|
return absl::StrCat("::absl::StatusOr<",
|
||||||
MaybeRemoveConst(context, qual).getAsString(), ">");
|
MaybeRemoveConst(context, qual).getAsString(), ">");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user