Merge remote-tracking branch 'aosp/upstream' into master

* aosp/upstream:
  Add SetDefaultDependencyVariation

Bug: 138103882
Test: m checkbuild
Change-Id: I2c79c3c9e0437fd785b06ca20f43da2963d50b68
diff --git a/context.go b/context.go
index 6a61861..42b2df1 100644
--- a/context.go
+++ b/context.go
@@ -1153,7 +1153,7 @@
 }
 
 func (c *Context) createVariations(origModule *moduleInfo, mutatorName string,
-	variationNames []string) ([]*moduleInfo, []error) {
+	defaultVariationName *string, variationNames []string) ([]*moduleInfo, []error) {
 
 	if len(variationNames) == 0 {
 		panic(fmt.Errorf("mutator %q passed zero-length variation list for module %q",
@@ -1198,7 +1198,7 @@
 
 		newModules = append(newModules, newModule)
 
-		newErrs := c.convertDepsToVariation(newModule, mutatorName, variationName)
+		newErrs := c.convertDepsToVariation(newModule, mutatorName, variationName, defaultVariationName)
 		if len(newErrs) > 0 {
 			errs = append(errs, newErrs...)
 		}
@@ -1215,7 +1215,7 @@
 }
 
 func (c *Context) convertDepsToVariation(module *moduleInfo,
-	mutatorName, variationName string) (errs []error) {
+	mutatorName, variationName string, defaultVariationName *string) (errs []error) {
 
 	for i, dep := range module.directDeps {
 		if dep.module.logicModule == nil {
@@ -1226,6 +1226,15 @@
 					break
 				}
 			}
+			if newDep == nil && defaultVariationName != nil {
+				// give it a second chance; match with defaultVariationName
+				for _, m := range dep.module.splitModules {
+					if m.variant[mutatorName] == *defaultVariationName {
+						newDep = m
+						break
+					}
+				}
+			}
 			if newDep == nil {
 				errs = append(errs, &BlueprintError{
 					Err: fmt.Errorf("failed to find variation %q for module %q needed by %q",
diff --git a/module_ctx.go b/module_ctx.go
index 37079ad..bc05787 100644
--- a/module_ctx.go
+++ b/module_ctx.go
@@ -661,12 +661,13 @@
 
 type mutatorContext struct {
 	baseModuleContext
-	name          string
-	reverseDeps   []reverseDep
-	rename        []rename
-	replace       []replace
-	newVariations []*moduleInfo // new variants of existing modules
-	newModules    []*moduleInfo // brand new modules
+	name             string
+	reverseDeps      []reverseDep
+	rename           []rename
+	replace          []replace
+	newVariations    []*moduleInfo // new variants of existing modules
+	newModules       []*moduleInfo // brand new modules
+	defaultVariation *string
 }
 
 type BaseMutatorContext interface {
@@ -752,9 +753,13 @@
 	CreateLocalVariations(...string) []Module
 
 	// SetDependencyVariation sets all dangling dependencies on the current module to point to the variation
-	// with given name.
+	// with given name. This function ignores the default variation set by SetDefaultDependencyVariation.
 	SetDependencyVariation(string)
 
+	// SetDefaultDependencyVariation sets the default variation when a dangling reference is detected
+	// during the subsequent calls on Create*Variations* functions. To reset, set it to nil.
+	SetDefaultDependencyVariation(*string)
+
 	// AddVariationDependencies adds deps as dependencies of the current module, but uses the variations
 	// argument to select which variant of the dependency to use.  A variant of the dependency must
 	// exist that matches the all of the non-local variations of the current module, plus the variations
@@ -825,7 +830,7 @@
 
 func (mctx *mutatorContext) createVariations(variationNames []string, local bool) []Module {
 	ret := []Module{}
-	modules, errs := mctx.context.createVariations(mctx.module, mctx.name, variationNames)
+	modules, errs := mctx.context.createVariations(mctx.module, mctx.name, mctx.defaultVariation, variationNames)
 	if len(errs) > 0 {
 		mctx.errs = append(mctx.errs, errs...)
 	}
@@ -850,7 +855,11 @@
 }
 
 func (mctx *mutatorContext) SetDependencyVariation(variationName string) {
-	mctx.context.convertDepsToVariation(mctx.module, mctx.name, variationName)
+	mctx.context.convertDepsToVariation(mctx.module, mctx.name, variationName, nil)
+}
+
+func (mctx *mutatorContext) SetDefaultDependencyVariation(variationName *string) {
+	mctx.defaultVariation = variationName
 }
 
 func (mctx *mutatorContext) Module() Module {