support sandboxed rust rules

This commit adds support for compiling rust rules inside the sbox
sandbox. To compile a rust module with sandboxing enabled, the entry
point to the crate must be specified via the `crate_root` property, and
all input sources and compile-time data must be specified via the `srcs`
and `compile_data` properties.

Bug: 286077158
Change-Id: I8c9dc5cf7578037a583b4be2e2f73cf20ffd4408
diff --git a/android/paths.go b/android/paths.go
index 325a953..d4b1d6e 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -171,6 +171,9 @@
 	// Base returns the last element of the path
 	Base() string
 
+	// Dir returns a path pointing the directory containing the path
+	Dir() Path
+
 	// Rel returns the portion of the path relative to the directory it was created from.  For
 	// example, Rel on a PathsForModuleSrc would return the path relative to the module source
 	// directory, and OutputPath.Join("foo").Rel() would return "foo".
@@ -1012,6 +1015,12 @@
 	return filepath.Base(p.path)
 }
 
+func (p basePath) Dir() Path {
+	p.path = filepath.Dir(p.path)
+	p.rel = filepath.Dir(p.rel)
+	return p
+}
+
 func (p basePath) Rel() string {
 	if p.rel != "" {
 		return p.rel
@@ -1046,6 +1055,11 @@
 	return p
 }
 
+func (p SourcePath) Dir() Path {
+	p.basePath = p.basePath.Dir().(basePath)
+	return p
+}
+
 // safePathForSource is for paths that we expect are safe -- only for use by go
 // code that is embedding ninja variables in paths
 func safePathForSource(ctx PathContext, pathComponents ...string) (SourcePath, error) {
@@ -1248,6 +1262,12 @@
 	return p
 }
 
+func (p OutputPath) Dir() Path {
+	p.basePath = p.basePath.Dir().(basePath)
+	p.fullPath = filepath.Dir(p.fullPath)
+	return p
+}
+
 func (p OutputPath) WithoutRel() OutputPath {
 	p.basePath.rel = filepath.Base(p.basePath.path)
 	return p
@@ -1280,6 +1300,11 @@
 	basePath
 }
 
+func (p toolDepPath) Dir() Path {
+	p.basePath = p.basePath.Dir().(basePath)
+	return p
+}
+
 func (t toolDepPath) RelativeToTop() Path {
 	ensureTestOnly()
 	return t
@@ -1463,6 +1488,11 @@
 	OutputPath
 }
 
+func (p ModuleOutPath) Dir() Path {
+	p.OutputPath = p.OutputPath.Dir().(OutputPath)
+	return p
+}
+
 func (p ModuleOutPath) RelativeToTop() Path {
 	p.OutputPath = p.outputPathRelativeToTop()
 	return p
@@ -1507,6 +1537,11 @@
 	ModuleOutPath
 }
 
+func (p ModuleGenPath) Dir() Path {
+	p.ModuleOutPath = p.ModuleOutPath.Dir().(ModuleOutPath)
+	return p
+}
+
 func (p ModuleGenPath) RelativeToTop() Path {
 	p.OutputPath = p.outputPathRelativeToTop()
 	return p
@@ -1546,6 +1581,11 @@
 	ModuleOutPath
 }
 
+func (p ModuleObjPath) Dir() Path {
+	p.ModuleOutPath = p.ModuleOutPath.Dir().(ModuleOutPath)
+	return p
+}
+
 func (p ModuleObjPath) RelativeToTop() Path {
 	p.OutputPath = p.outputPathRelativeToTop()
 	return p
@@ -1570,6 +1610,11 @@
 	ModuleOutPath
 }
 
+func (p ModuleResPath) Dir() Path {
+	p.ModuleOutPath = p.ModuleOutPath.Dir().(ModuleOutPath)
+	return p
+}
+
 func (p ModuleResPath) RelativeToTop() Path {
 	p.OutputPath = p.outputPathRelativeToTop()
 	return p
@@ -1606,6 +1651,11 @@
 	makePath bool
 }
 
+func (p InstallPath) Dir() Path {
+	p.basePath = p.basePath.Dir().(basePath)
+	return p
+}
+
 // Will panic if called from outside a test environment.
 func ensureTestOnly() {
 	if PrefixInList(os.Args, "-test.") {
@@ -1922,6 +1972,11 @@
 	basePath
 }
 
+func (p PhonyPath) Dir() Path {
+	p.basePath = p.basePath.Dir().(basePath)
+	return p
+}
+
 func (p PhonyPath) writablePath() {}
 
 func (p PhonyPath) getSoongOutDir() string {
@@ -1947,6 +2002,11 @@
 	basePath
 }
 
+func (p testPath) Dir() Path {
+	p.basePath = p.basePath.Dir().(basePath)
+	return p
+}
+
 func (p testPath) RelativeToTop() Path {
 	ensureTestOnly()
 	return p