Snap for 8982257 from 7968c52625bd8aece3a55229b5d3da845767eaf6 to mainline-conscrypt-release

Change-Id: Iac11f380cde4befc3f02a2a924f23ad808705a16
diff --git a/proptools/escape.go b/proptools/escape.go
index 4ef10f0..9443a95 100644
--- a/proptools/escape.go
+++ b/proptools/escape.go
@@ -122,4 +122,8 @@
 	return ShellEscape(NinjaEscape(s))
 }
 
+func NinjaAndShellEscapeIncludingSpaces(s string) string {
+	return ShellEscapeIncludingSpaces(NinjaEscape(s))
+}
+
 var singleQuoteReplacer = strings.NewReplacer(`'`, `'\''`)
diff --git a/singleton_ctx.go b/singleton_ctx.go
index 455f6fc..d579b8e 100644
--- a/singleton_ctx.go
+++ b/singleton_ctx.go
@@ -157,6 +157,10 @@
 	// Fs returns a pathtools.Filesystem that can be used to interact with files.  Using the Filesystem interface allows
 	// the singleton to be used in build system tests that run against a mock filesystem.
 	Fs() pathtools.FileSystem
+
+	// ModuleVariantsFromName returns the list of module variants named `name` in the same namespace as `referer`.
+	// Allows generating build actions for `referer` based on the metadata for `name` deferred until the singleton context.
+	ModuleVariantsFromName(referer Module, name string) []Module
 }
 
 var _ SingletonContext = (*singletonContext)(nil)
@@ -369,3 +373,26 @@
 func (s *singletonContext) Fs() pathtools.FileSystem {
 	return s.context.fs
 }
+
+func (s *singletonContext) ModuleVariantsFromName(referer Module, name string) []Module {
+	c := s.context
+
+	refererInfo := c.moduleInfo[referer]
+	if refererInfo == nil {
+		s.ModuleErrorf(referer, "could not find module %q", referer.Name())
+		return nil
+	}
+
+	moduleGroup, exists := c.nameInterface.ModuleFromName(name, refererInfo.namespace())
+	if !exists {
+		return nil
+	}
+	result := make([]Module, 0, len(moduleGroup.modules))
+	for _, module := range moduleGroup.modules {
+		moduleInfo := module.module()
+		if moduleInfo != nil {
+			result = append(result, moduleInfo.logicModule)
+		}
+	}
+	return result
+}