Refactor factories

Change module factories from returning a blueprint.Module and a list
of property structs to returning an android.Module, which holds the
list of property structs.

Test: build.ninja identical except for Factory: comment lines
Change-Id: Ica1d823f009db812c518f271a386fbff39c9766f
diff --git a/cc/binary.go b/cc/binary.go
index e982329..f6e62b7 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -17,7 +17,6 @@
 import (
 	"path/filepath"
 
-	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
@@ -55,13 +54,13 @@
 }
 
 // Module factory for binaries
-func binaryFactory() (blueprint.Module, []interface{}) {
+func binaryFactory() android.Module {
 	module, _ := NewBinary(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for host binaries
-func binaryHostFactory() (blueprint.Module, []interface{}) {
+func binaryHostFactory() android.Module {
 	module, _ := NewBinary(android.HostSupported)
 	return module.Init()
 }
diff --git a/cc/cc.go b/cc/cc.go
index 867b196..a3f4c1d 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -304,36 +304,38 @@
 	flags Flags
 }
 
-func (c *Module) Init() (blueprint.Module, []interface{}) {
-	props := []interface{}{&c.Properties, &c.unused}
+func (c *Module) Init() android.Module {
+	c.AddProperties(&c.Properties, &c.unused)
 	if c.compiler != nil {
-		props = append(props, c.compiler.compilerProps()...)
+		c.AddProperties(c.compiler.compilerProps()...)
 	}
 	if c.linker != nil {
-		props = append(props, c.linker.linkerProps()...)
+		c.AddProperties(c.linker.linkerProps()...)
 	}
 	if c.installer != nil {
-		props = append(props, c.installer.installerProps()...)
+		c.AddProperties(c.installer.installerProps()...)
 	}
 	if c.stl != nil {
-		props = append(props, c.stl.props()...)
+		c.AddProperties(c.stl.props()...)
 	}
 	if c.sanitize != nil {
-		props = append(props, c.sanitize.props()...)
+		c.AddProperties(c.sanitize.props()...)
 	}
 	if c.coverage != nil {
-		props = append(props, c.coverage.props()...)
+		c.AddProperties(c.coverage.props()...)
 	}
 	if c.sabi != nil {
-		props = append(props, c.sabi.props()...)
+		c.AddProperties(c.sabi.props()...)
 	}
 	for _, feature := range c.features {
-		props = append(props, feature.props()...)
+		c.AddProperties(feature.props()...)
 	}
 
-	_, props = android.InitAndroidArchModule(c, c.hod, c.multilib, props...)
+	android.InitAndroidArchModule(c, c.hod, c.multilib)
 
-	return android.InitDefaultableModule(c, c, props...)
+	android.InitDefaultableModule(c, c)
+
+	return c
 }
 
 // Returns true for dependency roots (binaries)
@@ -1108,14 +1110,15 @@
 func (d *Defaults) DepsMutator(ctx android.BottomUpMutatorContext) {
 }
 
-func defaultsFactory() (blueprint.Module, []interface{}) {
+func defaultsFactory() android.Module {
 	return DefaultsFactory()
 }
 
-func DefaultsFactory(props ...interface{}) (blueprint.Module, []interface{}) {
+func DefaultsFactory(props ...interface{}) android.Module {
 	module := &Defaults{}
 
-	props = append(props,
+	module.AddProperties(props...)
+	module.AddProperties(
 		&BaseProperties{},
 		&BaseCompilerProperties{},
 		&BaseLinkerProperties{},
@@ -1134,7 +1137,9 @@
 		&SAbiProperties{},
 	)
 
-	return android.InitDefaultsModule(module, module, props...)
+	android.InitDefaultsModule(module, module)
+
+	return module
 }
 
 const (
diff --git a/cc/coverage.go b/cc/coverage.go
index b1c8783..0b4188f 100644
--- a/cc/coverage.go
+++ b/cc/coverage.go
@@ -16,6 +16,7 @@
 
 import (
 	"android/soong/android"
+
 	"github.com/google/blueprint"
 )
 
diff --git a/cc/library.go b/cc/library.go
index 0164221..c7c1142 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -108,41 +108,41 @@
 
 // Module factory for combined static + shared libraries, device by default but with possible host
 // support
-func libraryFactory() (blueprint.Module, []interface{}) {
+func libraryFactory() android.Module {
 	module, _ := NewLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for static libraries
-func libraryStaticFactory() (blueprint.Module, []interface{}) {
+func libraryStaticFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.BuildOnlyStatic()
 	return module.Init()
 }
 
 // Module factory for shared libraries
-func librarySharedFactory() (blueprint.Module, []interface{}) {
+func librarySharedFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.BuildOnlyShared()
 	return module.Init()
 }
 
 // Module factory for host static libraries
-func libraryHostStaticFactory() (blueprint.Module, []interface{}) {
+func libraryHostStaticFactory() android.Module {
 	module, library := NewLibrary(android.HostSupported)
 	library.BuildOnlyStatic()
 	return module.Init()
 }
 
 // Module factory for host shared libraries
-func libraryHostSharedFactory() (blueprint.Module, []interface{}) {
+func libraryHostSharedFactory() android.Module {
 	module, library := NewLibrary(android.HostSupported)
 	library.BuildOnlyShared()
 	return module.Init()
 }
 
 // Module factory for header-only libraries
-func libraryHeaderFactory() (blueprint.Module, []interface{}) {
+func libraryHeaderFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.HeaderOnly()
 	return module.Init()
diff --git a/cc/llndk_library.go b/cc/llndk_library.go
index cde1bc7..66ffc9f 100644
--- a/cc/llndk_library.go
+++ b/cc/llndk_library.go
@@ -18,8 +18,6 @@
 	"path/filepath"
 	"strings"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -136,7 +134,7 @@
 	return stub.libraryDecorator.link(ctx, flags, deps, objs)
 }
 
-func newLLndkStubLibrary() (*Module, []interface{}) {
+func newLLndkStubLibrary() *Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	module.stl = nil
@@ -150,13 +148,18 @@
 	module.linker = stub
 	module.installer = nil
 
-	return module, []interface{}{&stub.Properties, &library.MutatedProperties, &library.flagExporter.Properties}
+	module.AddProperties(
+		&stub.Properties,
+		&library.MutatedProperties,
+		&library.flagExporter.Properties)
+
+	return module
 }
 
-func llndkLibraryFactory() (blueprint.Module, []interface{}) {
-	module, properties := newLLndkStubLibrary()
-	return android.InitAndroidArchModule(module, android.DeviceSupported,
-		android.MultilibBoth, properties...)
+func llndkLibraryFactory() android.Module {
+	module := newLLndkStubLibrary()
+	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
+	return module
 }
 
 func init() {
diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go
index 516f6e2..5fa3232 100644
--- a/cc/ndk_headers.go
+++ b/cc/ndk_headers.go
@@ -137,9 +137,11 @@
 	}
 }
 
-func ndkHeadersFactory() (blueprint.Module, []interface{}) {
+func ndkHeadersFactory() android.Module {
 	module := &headerModule{}
-	return android.InitAndroidModule(module, &module.properties)
+	module.AddProperties(&module.properties)
+	android.InitAndroidModule(module)
+	return module
 }
 
 type preprocessedHeaderProperies struct {
@@ -251,12 +253,16 @@
 	return timestampFile
 }
 
-func preprocessedNdkHeadersFactory() (blueprint.Module, []interface{}) {
+func preprocessedNdkHeadersFactory() android.Module {
 	module := &preprocessedHeaderModule{}
+
+	module.AddProperties(&module.properties)
+
 	// Host module rather than device module because device module install steps
 	// do not get run when embedded in make. We're not any of the existing
 	// module types that can be exposed via the Android.mk exporter, so just use
 	// a host module.
-	return android.InitAndroidArchModule(module, android.HostSupportedNoCross,
-		android.MultilibFirst, &module.properties)
+	android.InitAndroidArchModule(module, android.HostSupportedNoCross, android.MultilibFirst)
+
+	return module
 }
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index d801775..5765aa9 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -335,7 +335,7 @@
 	stub.installPath = ctx.InstallFile(installDir, path).String()
 }
 
-func newStubLibrary() (*Module, []interface{}) {
+func newStubLibrary() *Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	module.stl = nil
@@ -349,11 +349,13 @@
 	module.linker = stub
 	module.installer = stub
 
-	return module, []interface{}{&stub.properties, &library.MutatedProperties}
+	module.AddProperties(&stub.properties, &library.MutatedProperties)
+
+	return module
 }
 
-func ndkLibraryFactory() (blueprint.Module, []interface{}) {
-	module, properties := newStubLibrary()
-	return android.InitAndroidArchModule(module, android.DeviceSupported,
-		android.MultilibBoth, properties...)
+func ndkLibraryFactory() android.Module {
+	module := newStubLibrary()
+	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
+	return module
 }
diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go
index 15a9d28..13424e3 100644
--- a/cc/ndk_prebuilt.go
+++ b/cc/ndk_prebuilt.go
@@ -18,8 +18,6 @@
 	"fmt"
 	"strings"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 	"android/soong/cc/config"
 )
@@ -67,7 +65,7 @@
 	return deps
 }
 
-func ndkPrebuiltObjectFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltObjectFactory() android.Module {
 	module := newBaseModule(android.DeviceSupported, android.MultilibBoth)
 	module.linker = &ndkPrebuiltObjectLinker{
 		objectLinker: objectLinker{
@@ -101,7 +99,7 @@
 	return deps
 }
 
-func ndkPrebuiltLibraryFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltLibraryFactory() android.Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	linker := &ndkPrebuiltLibraryLinker{
@@ -132,7 +130,7 @@
 	ndkPrebuiltLibraryLinker
 }
 
-func ndkPrebuiltSharedStlFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltSharedStlFactory() android.Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	linker := &ndkPrebuiltStlLinker{
@@ -147,7 +145,7 @@
 	return module.Init()
 }
 
-func ndkPrebuiltStaticStlFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltStaticStlFactory() android.Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyStatic()
 	linker := &ndkPrebuiltStlLinker{
diff --git a/cc/object.go b/cc/object.go
index eaddd89..1478908 100644
--- a/cc/object.go
+++ b/cc/object.go
@@ -17,8 +17,6 @@
 import (
 	"fmt"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -35,7 +33,7 @@
 	Properties ObjectLinkerProperties
 }
 
-func objectFactory() (blueprint.Module, []interface{}) {
+func objectFactory() android.Module {
 	module := newBaseModule(android.HostAndDeviceSupported, android.MultilibBoth)
 	module.linker = &objectLinker{
 		baseLinker: NewBaseLinker(),
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index d064a46..ac05df0 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -16,8 +16,6 @@
 
 import (
 	"android/soong/android"
-
-	"github.com/google/blueprint"
 )
 
 func init() {
@@ -65,7 +63,7 @@
 	return nil
 }
 
-func prebuiltSharedLibraryFactory() (blueprint.Module, []interface{}) {
+func prebuiltSharedLibraryFactory() android.Module {
 	module, _ := NewPrebuiltSharedLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
@@ -83,7 +81,7 @@
 	return module, library
 }
 
-func prebuiltStaticLibraryFactory() (blueprint.Module, []interface{}) {
+func prebuiltStaticLibraryFactory() android.Module {
 	module, _ := NewPrebuiltStaticLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
@@ -124,7 +122,7 @@
 	return nil
 }
 
-func prebuiltBinaryFactory() (blueprint.Module, []interface{}) {
+func prebuiltBinaryFactory() android.Module {
 	module, _ := NewPrebuiltBinary(android.HostAndDeviceSupported)
 	return module.Init()
 }
diff --git a/cc/sabi.go b/cc/sabi.go
index 92fc7cf..9aff738 100644
--- a/cc/sabi.go
+++ b/cc/sabi.go
@@ -17,9 +17,9 @@
 import (
 	"strings"
 
-	"android/soong/android"
 	"github.com/google/blueprint"
 
+	"android/soong/android"
 	"android/soong/cc/config"
 )
 
diff --git a/cc/test.go b/cc/test.go
index 448f089..ea05ba5 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -20,8 +20,6 @@
 	"strings"
 
 	"android/soong/android"
-
-	"github.com/google/blueprint"
 )
 
 type TestProperties struct {
@@ -57,31 +55,31 @@
 }
 
 // Module factory for tests
-func testFactory() (blueprint.Module, []interface{}) {
+func testFactory() android.Module {
 	module := NewTest(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for test libraries
-func testLibraryFactory() (blueprint.Module, []interface{}) {
+func testLibraryFactory() android.Module {
 	module := NewTestLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for benchmarks
-func benchmarkFactory() (blueprint.Module, []interface{}) {
+func benchmarkFactory() android.Module {
 	module := NewBenchmark(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for host tests
-func testHostFactory() (blueprint.Module, []interface{}) {
+func testHostFactory() android.Module {
 	module := NewTest(android.HostSupported)
 	return module.Init()
 }
 
 // Module factory for host benchmarks
-func benchmarkHostFactory() (blueprint.Module, []interface{}) {
+func benchmarkHostFactory() android.Module {
 	module := NewBenchmark(android.HostSupported)
 	return module.Init()
 }
diff --git a/cc/test_data_test.go b/cc/test_data_test.go
index 9b5a85a..a798919 100644
--- a/cc/test_data_test.go
+++ b/cc/test_data_test.go
@@ -131,8 +131,10 @@
 				"dir/baz":        nil,
 				"dir/bar/baz":    nil,
 			})
-			ctx.RegisterModuleType("filegroup", genrule.FileGroupFactory)
-			ctx.RegisterModuleType("test", newTest)
+			ctx.RegisterModuleType("filegroup",
+				android.ModuleFactoryAdaptor(genrule.FileGroupFactory))
+			ctx.RegisterModuleType("test",
+				android.ModuleFactoryAdaptor(newTest))
 
 			_, errs := ctx.ParseBlueprintsFiles("Blueprints")
 			fail(t, errs)
@@ -175,9 +177,11 @@
 	}
 }
 
-func newTest() (blueprint.Module, []interface{}) {
+func newTest() android.Module {
 	m := &testDataTest{}
-	return android.InitAndroidModule(m, &m.Properties)
+	m.AddProperties(&m.Properties)
+	android.InitAndroidModule(m)
+	return m
 }
 
 func (test *testDataTest) DepsMutator(ctx android.BottomUpMutatorContext) {
diff --git a/cc/toolchain_library.go b/cc/toolchain_library.go
index 1bbe774..9b83f18 100644
--- a/cc/toolchain_library.go
+++ b/cc/toolchain_library.go
@@ -15,7 +15,6 @@
 package cc
 
 import (
-	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
@@ -38,7 +37,7 @@
 	return deps
 }
 
-func toolchainLibraryFactory() (blueprint.Module, []interface{}) {
+func toolchainLibraryFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.BuildOnlyStatic()
 	toolchainLibrary := &toolchainLibraryDecorator{