Squashed 'third_party/autocxx/' content from commit 629e8fa53
git-subtree-dir: third_party/autocxx
git-subtree-split: 629e8fa531a633164c0b52e2a3cab536d4cd0849
Signed-off-by: Brian Silverman <bsilver16384@gmail.com>
Change-Id: I62a03b0049f49adf029e0204639cdb5468dde1a1
diff --git a/engine/src/conversion/analysis/deps.rs b/engine/src/conversion/analysis/deps.rs
new file mode 100644
index 0000000..7aca96c
--- /dev/null
+++ b/engine/src/conversion/analysis/deps.rs
@@ -0,0 +1,116 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use itertools::Itertools;
+
+use crate::{
+ conversion::api::{Api, TypeKind},
+ types::QualifiedName,
+};
+
+use super::{
+ fun::{FnPhase, FnPrePhase1, PodAndDepAnalysis},
+ pod::PodAnalysis,
+ tdef::TypedefAnalysis,
+};
+
+pub(crate) trait HasDependencies {
+ fn name(&self) -> &QualifiedName;
+ fn deps(&self) -> Box<dyn Iterator<Item = &QualifiedName> + '_>;
+
+ fn format_deps(&self) -> String {
+ self.deps().join(",")
+ }
+}
+
+impl HasDependencies for Api<FnPrePhase1> {
+ fn deps(&self) -> Box<dyn Iterator<Item = &QualifiedName> + '_> {
+ match self {
+ Api::Typedef {
+ old_tyname,
+ analysis: TypedefAnalysis { deps, .. },
+ ..
+ } => Box::new(old_tyname.iter().chain(deps.iter())),
+ Api::Struct {
+ analysis:
+ PodAnalysis {
+ kind: TypeKind::Pod,
+ bases,
+ field_deps,
+ ..
+ },
+ ..
+ } => Box::new(field_deps.iter().chain(bases.iter())),
+ Api::Function { analysis, .. } => Box::new(analysis.deps.iter()),
+ Api::Subclass {
+ name: _,
+ superclass,
+ } => Box::new(std::iter::once(superclass)),
+ Api::RustSubclassFn { details, .. } => Box::new(details.dependencies.iter()),
+ Api::RustFn { receiver, .. } => Box::new(receiver.iter()),
+ _ => Box::new(std::iter::empty()),
+ }
+ }
+
+ fn name(&self) -> &QualifiedName {
+ self.name()
+ }
+}
+
+impl HasDependencies for Api<FnPhase> {
+ /// Any dependencies on other APIs which this API has.
+ fn deps(&self) -> Box<dyn Iterator<Item = &QualifiedName> + '_> {
+ match self {
+ Api::Typedef {
+ old_tyname,
+ analysis: TypedefAnalysis { deps, .. },
+ ..
+ } => Box::new(old_tyname.iter().chain(deps.iter())),
+ Api::Struct {
+ analysis:
+ PodAndDepAnalysis {
+ pod:
+ PodAnalysis {
+ kind: TypeKind::Pod,
+ bases,
+ field_deps,
+ ..
+ },
+ constructor_and_allocator_deps,
+ ..
+ },
+ ..
+ } => Box::new(
+ field_deps
+ .iter()
+ .chain(bases.iter())
+ .chain(constructor_and_allocator_deps.iter()),
+ ),
+ Api::Struct {
+ analysis:
+ PodAndDepAnalysis {
+ constructor_and_allocator_deps,
+ ..
+ },
+ ..
+ } => Box::new(constructor_and_allocator_deps.iter()),
+ Api::Function { analysis, .. } => Box::new(analysis.deps.iter()),
+ Api::Subclass {
+ name: _,
+ superclass,
+ } => Box::new(std::iter::once(superclass)),
+ Api::RustSubclassFn { details, .. } => Box::new(details.dependencies.iter()),
+ Api::RustFn { receiver, .. } => Box::new(receiver.iter()),
+ _ => Box::new(std::iter::empty()),
+ }
+ }
+
+ fn name(&self) -> &QualifiedName {
+ self.name()
+ }
+}