Remove EarlyMutators and DynamicDependencies
EarlyMutators are identical to BottomUpMutators, except they run before DynamicDependencies. DynamicDependencies can be replaced with a BottomUpMutator. Replace both EarlyMutators and DynamicDependencies with BottomUpMutators, which allows setting the order between all mutators through registration order. Change-Id: Id1305d798d3d2da592061c89d7c10a71780b71a3
This commit is contained in:
@@ -95,6 +95,7 @@ bootstrap_go_package {
|
||||
"common/env.go",
|
||||
"common/glob.go",
|
||||
"common/module.go",
|
||||
"common/mutator.go",
|
||||
"common/paths.go",
|
||||
"common/util.go",
|
||||
"common/variable.go",
|
||||
|
65
cc/cc.go
65
cc/cc.go
@@ -57,8 +57,9 @@ func init() {
|
||||
// LinkageMutator must be registered after common.ArchMutator, but that is guaranteed by
|
||||
// the Go initialization order because this package depends on common, so common's init
|
||||
// functions will run first.
|
||||
soong.RegisterEarlyMutator("link", LinkageMutator)
|
||||
soong.RegisterEarlyMutator("test_per_src", TestPerSrcMutator)
|
||||
common.RegisterBottomUpMutator("link", linkageMutator)
|
||||
common.RegisterBottomUpMutator("test_per_src", testPerSrcMutator)
|
||||
common.RegisterBottomUpMutator("deps", depsMutator)
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -140,20 +141,25 @@ func init() {
|
||||
pctx.StaticVariable("clangPath", "${SrcDir}/prebuilts/clang/${HostPrebuiltTag}/host/3.6/bin/")
|
||||
}
|
||||
|
||||
type CCModuleContext common.AndroidBaseContext
|
||||
|
||||
// Building C/C++ code is handled by objects that satisfy this interface via composition
|
||||
type CCModuleType interface {
|
||||
common.AndroidModule
|
||||
|
||||
// Modify property values after parsing Blueprints file but before starting dependency
|
||||
// resolution or build rule generation
|
||||
ModifyProperties(common.AndroidBaseContext)
|
||||
ModifyProperties(CCModuleContext)
|
||||
|
||||
// Modify the ccFlags
|
||||
flags(common.AndroidModuleContext, CCFlags) CCFlags
|
||||
|
||||
// Return list of dependency names for use in AndroidDynamicDependencies and in depsToPaths
|
||||
// Return list of dependency names for use in depsMutator
|
||||
depNames(common.AndroidBaseContext, CCDeps) CCDeps
|
||||
|
||||
// Add dynamic dependencies
|
||||
depsMutator(common.AndroidBottomUpMutatorContext)
|
||||
|
||||
// Compile objects into final module
|
||||
compileModule(common.AndroidModuleContext, CCFlags, CCDeps, []string)
|
||||
|
||||
@@ -392,8 +398,6 @@ func (c *CCBase) ccModuleType() CCModuleType {
|
||||
return c.module
|
||||
}
|
||||
|
||||
var _ common.AndroidDynamicDepender = (*CCBase)(nil)
|
||||
|
||||
func (c *CCBase) findToolchain(ctx common.AndroidModuleContext) Toolchain {
|
||||
arch := ctx.Arch()
|
||||
hod := ctx.HostOrDevice()
|
||||
@@ -405,7 +409,7 @@ func (c *CCBase) findToolchain(ctx common.AndroidModuleContext) Toolchain {
|
||||
return factory(arch.ArchVariant, arch.CpuVariant)
|
||||
}
|
||||
|
||||
func (c *CCBase) ModifyProperties(ctx common.AndroidBaseContext) {
|
||||
func (c *CCBase) ModifyProperties(ctx CCModuleContext) {
|
||||
}
|
||||
|
||||
func (c *CCBase) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps {
|
||||
@@ -416,9 +420,7 @@ func (c *CCBase) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps
|
||||
return depNames
|
||||
}
|
||||
|
||||
func (c *CCBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
c.module.ModifyProperties(ctx)
|
||||
|
||||
func (c *CCBase) depsMutator(ctx common.AndroidBottomUpMutatorContext) {
|
||||
c.savedDepNames = c.module.depNames(ctx, CCDeps{})
|
||||
c.savedDepNames.WholeStaticLibs = lastUniqueElements(c.savedDepNames.WholeStaticLibs)
|
||||
c.savedDepNames.StaticLibs = lastUniqueElements(c.savedDepNames.StaticLibs)
|
||||
@@ -431,15 +433,20 @@ func (c *CCBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerMod
|
||||
|
||||
ctx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, c.savedDepNames.SharedLibs...)
|
||||
|
||||
ret := append([]string(nil), c.savedDepNames.ObjFiles...)
|
||||
ctx.AddDependency(ctx.Module(), c.savedDepNames.ObjFiles...)
|
||||
if c.savedDepNames.CrtBegin != "" {
|
||||
ret = append(ret, c.savedDepNames.CrtBegin)
|
||||
ctx.AddDependency(ctx.Module(), c.savedDepNames.CrtBegin)
|
||||
}
|
||||
if c.savedDepNames.CrtEnd != "" {
|
||||
ret = append(ret, c.savedDepNames.CrtEnd)
|
||||
ctx.AddDependency(ctx.Module(), c.savedDepNames.CrtEnd)
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
func depsMutator(ctx common.AndroidBottomUpMutatorContext) {
|
||||
if c, ok := ctx.Module().(CCModuleType); ok {
|
||||
c.ModifyProperties(ctx)
|
||||
c.depsMutator(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
// Create a ccFlags struct that collects the compile flags from global values,
|
||||
@@ -1285,11 +1292,6 @@ func CCObjectFactory() (blueprint.Module, []interface{}) {
|
||||
return newCCBase(&module.CCBase, module, common.DeviceSupported, common.MultilibBoth)
|
||||
}
|
||||
|
||||
func (*ccObject) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
// object files can't have any dynamic dependencies
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*ccObject) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps {
|
||||
// object files can't have any dynamic dependencies
|
||||
return CCDeps{}
|
||||
@@ -1418,7 +1420,7 @@ func CCBinaryFactory() (blueprint.Module, []interface{}) {
|
||||
return NewCCBinary(module, module, common.HostAndDeviceSupported)
|
||||
}
|
||||
|
||||
func (c *CCBinary) ModifyProperties(ctx common.AndroidBaseContext) {
|
||||
func (c *CCBinary) ModifyProperties(ctx CCModuleContext) {
|
||||
if ctx.Darwin() {
|
||||
c.BinaryProperties.Static_executable = proptools.BoolPtr(false)
|
||||
}
|
||||
@@ -1519,7 +1521,7 @@ type testPerSrc interface {
|
||||
|
||||
var _ testPerSrc = (*CCBinary)(nil)
|
||||
|
||||
func TestPerSrcMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
func testPerSrcMutator(mctx common.AndroidBottomUpMutatorContext) {
|
||||
if test, ok := mctx.Module().(testPerSrc); ok {
|
||||
if test.testPerSrc() {
|
||||
testNames := make([]string, len(test.binary().Properties.Srcs))
|
||||
@@ -1691,11 +1693,6 @@ type toolchainLibrary struct {
|
||||
CCLibrary
|
||||
}
|
||||
|
||||
func (*toolchainLibrary) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
// toolchain libraries can't have any dependencies
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*toolchainLibrary) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps {
|
||||
// toolchain libraries can't have any dependencies
|
||||
return CCDeps{}
|
||||
@@ -1752,13 +1749,6 @@ type ndkPrebuiltObject struct {
|
||||
ccObject
|
||||
}
|
||||
|
||||
func (*ndkPrebuiltObject) AndroidDynamicDependencies(
|
||||
ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
|
||||
// NDK objects can't have any dependencies
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*ndkPrebuiltObject) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps {
|
||||
// NDK objects can't have any dependencies
|
||||
return CCDeps{}
|
||||
@@ -1789,13 +1779,6 @@ type ndkPrebuiltLibrary struct {
|
||||
CCLibrary
|
||||
}
|
||||
|
||||
func (*ndkPrebuiltLibrary) AndroidDynamicDependencies(
|
||||
ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
|
||||
// NDK libraries can't have any dependencies
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*ndkPrebuiltLibrary) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps {
|
||||
// NDK libraries can't have any dependencies
|
||||
return CCDeps{}
|
||||
@@ -1896,7 +1879,7 @@ func (c *ndkPrebuiltStl) compileModule(ctx common.AndroidModuleContext, flags CC
|
||||
c.out = libDir + "/" + libName + libExt
|
||||
}
|
||||
|
||||
func LinkageMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
func linkageMutator(mctx common.AndroidBottomUpMutatorContext) {
|
||||
if c, ok := mctx.Module().(ccLinkedInterface); ok {
|
||||
var modules []blueprint.Module
|
||||
if c.buildStatic() && c.buildShared() {
|
||||
|
@@ -20,15 +20,13 @@ import (
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"android/soong"
|
||||
|
||||
"github.com/google/blueprint"
|
||||
"github.com/google/blueprint/proptools"
|
||||
)
|
||||
|
||||
func init() {
|
||||
soong.RegisterEarlyMutator("host_or_device", HostOrDeviceMutator)
|
||||
soong.RegisterEarlyMutator("arch", ArchMutator)
|
||||
RegisterBottomUpMutator("host_or_device", HostOrDeviceMutator)
|
||||
RegisterBottomUpMutator("arch", ArchMutator)
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -303,7 +301,7 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
func HostOrDeviceMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
func HostOrDeviceMutator(mctx AndroidBottomUpMutatorContext) {
|
||||
var module AndroidModule
|
||||
var ok bool
|
||||
if module, ok = mctx.Module().(AndroidModule); !ok {
|
||||
@@ -335,7 +333,7 @@ func HostOrDeviceMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
}
|
||||
}
|
||||
|
||||
func ArchMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
func ArchMutator(mctx AndroidBottomUpMutatorContext) {
|
||||
var module AndroidModule
|
||||
var ok bool
|
||||
if module, ok = mctx.Module().(AndroidModule); !ok {
|
||||
@@ -426,7 +424,7 @@ func InitArchModule(m AndroidModule, defaultMultilib Multilib,
|
||||
|
||||
var dashToUnderscoreReplacer = strings.NewReplacer("-", "_")
|
||||
|
||||
func (a *AndroidModuleBase) appendProperties(ctx blueprint.EarlyMutatorContext,
|
||||
func (a *AndroidModuleBase) appendProperties(ctx AndroidBottomUpMutatorContext,
|
||||
dst, src interface{}, field, srcPrefix string) {
|
||||
|
||||
src = reflect.ValueOf(src).FieldByName(field).Elem().Interface()
|
||||
@@ -459,7 +457,7 @@ func (a *AndroidModuleBase) appendProperties(ctx blueprint.EarlyMutatorContext,
|
||||
}
|
||||
|
||||
// Rewrite the module's properties structs to contain arch-specific values.
|
||||
func (a *AndroidModuleBase) setArchProperties(ctx blueprint.EarlyMutatorContext) {
|
||||
func (a *AndroidModuleBase) setArchProperties(ctx AndroidBottomUpMutatorContext) {
|
||||
arch := a.commonProperties.CompileArch
|
||||
hod := a.commonProperties.CompileHostOrDevice
|
||||
|
||||
|
@@ -72,15 +72,6 @@ type AndroidModule interface {
|
||||
HostOrDevice() HostOrDevice
|
||||
}
|
||||
|
||||
type AndroidDynamicDepender interface {
|
||||
AndroidDynamicDependencies(ctx AndroidDynamicDependerModuleContext) []string
|
||||
}
|
||||
|
||||
type AndroidDynamicDependerModuleContext interface {
|
||||
blueprint.DynamicDependerModuleContext
|
||||
androidBaseContext
|
||||
}
|
||||
|
||||
type commonProperties struct {
|
||||
Name string
|
||||
Deps []string
|
||||
@@ -313,33 +304,20 @@ func (a *AndroidModuleBase) generateModuleTarget(ctx blueprint.ModuleContext) {
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AndroidModuleBase) DynamicDependencies(ctx blueprint.DynamicDependerModuleContext) []string {
|
||||
actx := &androidDynamicDependerContext{
|
||||
DynamicDependerModuleContext: ctx,
|
||||
androidBaseContextImpl: androidBaseContextImpl{
|
||||
arch: a.commonProperties.CompileArch,
|
||||
hod: a.commonProperties.CompileHostOrDevice,
|
||||
config: ctx.Config().(Config),
|
||||
},
|
||||
func (a *AndroidModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
|
||||
return androidBaseContextImpl{
|
||||
arch: a.commonProperties.CompileArch,
|
||||
hod: a.commonProperties.CompileHostOrDevice,
|
||||
config: ctx.Config().(Config),
|
||||
}
|
||||
|
||||
if dynamic, ok := a.module.(AndroidDynamicDepender); ok {
|
||||
return dynamic.AndroidDynamicDependencies(actx)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *AndroidModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) {
|
||||
androidCtx := &androidModuleContext{
|
||||
ModuleContext: ctx,
|
||||
androidBaseContextImpl: androidBaseContextImpl{
|
||||
arch: a.commonProperties.CompileArch,
|
||||
hod: a.commonProperties.CompileHostOrDevice,
|
||||
config: ctx.Config().(Config),
|
||||
},
|
||||
installDeps: a.computeInstallDeps(ctx),
|
||||
installFiles: a.installFiles,
|
||||
ModuleContext: ctx,
|
||||
androidBaseContextImpl: a.androidBaseContextFactory(ctx),
|
||||
installDeps: a.computeInstallDeps(ctx),
|
||||
installFiles: a.installFiles,
|
||||
}
|
||||
|
||||
if a.commonProperties.Disabled {
|
||||
@@ -443,11 +421,6 @@ func (a *androidModuleContext) CheckbuildFile(srcPath string) {
|
||||
a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
|
||||
}
|
||||
|
||||
type androidDynamicDependerContext struct {
|
||||
blueprint.DynamicDependerModuleContext
|
||||
androidBaseContextImpl
|
||||
}
|
||||
|
||||
type fileInstaller interface {
|
||||
filesToInstall() []string
|
||||
}
|
||||
|
69
common/mutator.go
Normal file
69
common/mutator.go
Normal file
@@ -0,0 +1,69 @@
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package common
|
||||
|
||||
import (
|
||||
"android/soong"
|
||||
|
||||
"github.com/google/blueprint"
|
||||
)
|
||||
|
||||
type AndroidTopDownMutator func(AndroidTopDownMutatorContext)
|
||||
|
||||
type AndroidTopDownMutatorContext interface {
|
||||
blueprint.TopDownMutatorContext
|
||||
androidBaseContext
|
||||
}
|
||||
|
||||
type androidTopDownMutatorContext struct {
|
||||
blueprint.TopDownMutatorContext
|
||||
androidBaseContextImpl
|
||||
}
|
||||
|
||||
type AndroidBottomUpMutator func(AndroidBottomUpMutatorContext)
|
||||
|
||||
type AndroidBottomUpMutatorContext interface {
|
||||
blueprint.BottomUpMutatorContext
|
||||
androidBaseContext
|
||||
}
|
||||
|
||||
type androidBottomUpMutatorContext struct {
|
||||
blueprint.BottomUpMutatorContext
|
||||
androidBaseContextImpl
|
||||
}
|
||||
|
||||
func RegisterBottomUpMutator(name string, mutator AndroidBottomUpMutator) {
|
||||
soong.RegisterBottomUpMutator(name, func(ctx blueprint.BottomUpMutatorContext) {
|
||||
if a, ok := ctx.Module().(AndroidModule); ok {
|
||||
actx := &androidBottomUpMutatorContext{
|
||||
BottomUpMutatorContext: ctx,
|
||||
androidBaseContextImpl: a.base().androidBaseContextFactory(ctx),
|
||||
}
|
||||
mutator(actx)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func RegisterTopDownMutator(name string, mutator AndroidTopDownMutator) {
|
||||
soong.RegisterTopDownMutator(name, func(ctx blueprint.TopDownMutatorContext) {
|
||||
if a, ok := ctx.Module().(AndroidModule); ok {
|
||||
actx := &androidTopDownMutatorContext{
|
||||
TopDownMutatorContext: ctx,
|
||||
androidBaseContextImpl: a.base().androidBaseContextFactory(ctx),
|
||||
}
|
||||
mutator(actx)
|
||||
}
|
||||
})
|
||||
}
|
@@ -19,14 +19,11 @@ import (
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"android/soong"
|
||||
|
||||
"github.com/google/blueprint"
|
||||
"github.com/google/blueprint/proptools"
|
||||
)
|
||||
|
||||
func init() {
|
||||
soong.RegisterEarlyMutator("variable", VariableMutator)
|
||||
RegisterBottomUpMutator("variable", variableMutator)
|
||||
}
|
||||
|
||||
type variableProperties struct {
|
||||
@@ -104,7 +101,7 @@ func (v *productVariables) SetDefaultConfig() {
|
||||
}
|
||||
}
|
||||
|
||||
func VariableMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
func variableMutator(mctx AndroidBottomUpMutatorContext) {
|
||||
var module AndroidModule
|
||||
var ok bool
|
||||
if module, ok = mctx.Module().(AndroidModule); !ok {
|
||||
@@ -144,7 +141,7 @@ func VariableMutator(mctx blueprint.EarlyMutatorContext) {
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AndroidModuleBase) setVariableProperties(ctx blueprint.EarlyMutatorContext,
|
||||
func (a *AndroidModuleBase) setVariableProperties(ctx AndroidBottomUpMutatorContext,
|
||||
prefix string, productVariablePropertyValue reflect.Value, variableValue interface{}) {
|
||||
|
||||
if variableValue != nil {
|
||||
|
@@ -27,6 +27,8 @@ import (
|
||||
func init() {
|
||||
soong.RegisterModuleType("gensrcs", GenSrcsFactory)
|
||||
soong.RegisterModuleType("genrule", GenRuleFactory)
|
||||
|
||||
common.RegisterBottomUpMutator("genrule_deps", genruleDepsMutator)
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -83,12 +85,13 @@ func (g *generator) GeneratedSourceFiles() []string {
|
||||
return g.outputFiles
|
||||
}
|
||||
|
||||
func (g *generator) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
if g.properties.Tool != "" {
|
||||
ctx.AddFarVariationDependencies([]blueprint.Variation{{"hostordevice", common.Host.String()}},
|
||||
g.properties.Tool)
|
||||
func genruleDepsMutator(ctx common.AndroidBottomUpMutatorContext) {
|
||||
if g, ok := ctx.Module().(*generator); ok {
|
||||
if g.properties.Tool != "" {
|
||||
ctx.AddFarVariationDependencies([]blueprint.Variation{{"hostordevice", common.Host.String()}},
|
||||
g.properties.Tool)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *generator) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
|
||||
|
@@ -67,8 +67,8 @@ type AndroidApp struct {
|
||||
exportPackage string
|
||||
}
|
||||
|
||||
func (a *AndroidApp) JavaDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
deps := a.javaBase.JavaDynamicDependencies(ctx)
|
||||
func (a *AndroidApp) JavaDependencies(ctx AndroidJavaModuleContext) []string {
|
||||
deps := a.javaBase.JavaDependencies(ctx)
|
||||
|
||||
if !a.properties.No_standard_libraries {
|
||||
switch a.properties.Sdk_version { // TODO: Res_sdk_version?
|
||||
|
12
java/java.go
12
java/java.go
@@ -145,9 +145,11 @@ type javaBase struct {
|
||||
installFile string
|
||||
}
|
||||
|
||||
type AndroidJavaModuleContext common.AndroidBaseContext
|
||||
|
||||
type JavaModuleType interface {
|
||||
GenerateJavaBuildActions(ctx common.AndroidModuleContext)
|
||||
JavaDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string
|
||||
JavaDependencies(ctx AndroidJavaModuleContext) []string
|
||||
}
|
||||
|
||||
type JavaDependency interface {
|
||||
@@ -191,11 +193,13 @@ func (j *javaBase) BootClasspath(ctx common.AndroidBaseContext) string {
|
||||
|
||||
var defaultJavaLibraries = []string{"core-libart", "core-junit", "ext", "framework"}
|
||||
|
||||
func (j *javaBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
return j.module.JavaDynamicDependencies(ctx)
|
||||
func javaDepsMutator(ctx common.AndroidBottomUpMutatorContext) {
|
||||
if j, ok := ctx.Module().(JavaModuleType); ok {
|
||||
ctx.AddDependency(ctx.Module(), j.JavaDependencies(ctx)...)
|
||||
}
|
||||
}
|
||||
|
||||
func (j *javaBase) JavaDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
|
||||
func (j *javaBase) JavaDependencies(ctx AndroidJavaModuleContext) []string {
|
||||
var deps []string
|
||||
|
||||
if !j.properties.No_standard_libraries {
|
||||
|
26
register.go
26
register.go
@@ -30,12 +30,13 @@ type singleton struct {
|
||||
|
||||
var singletons []singleton
|
||||
|
||||
type earlyMutator struct {
|
||||
name string
|
||||
mutator blueprint.EarlyMutator
|
||||
type mutator struct {
|
||||
name string
|
||||
bottomUpMutator blueprint.BottomUpMutator
|
||||
topDownMutator blueprint.TopDownMutator
|
||||
}
|
||||
|
||||
var earlyMutators []earlyMutator
|
||||
var mutators []mutator
|
||||
|
||||
func RegisterModuleType(name string, factory blueprint.ModuleFactory) {
|
||||
moduleTypes = append(moduleTypes, moduleType{name, factory})
|
||||
@@ -45,8 +46,12 @@ func RegisterSingletonType(name string, factory blueprint.SingletonFactory) {
|
||||
singletons = append(singletons, singleton{name, factory})
|
||||
}
|
||||
|
||||
func RegisterEarlyMutator(name string, mutator blueprint.EarlyMutator) {
|
||||
earlyMutators = append(earlyMutators, earlyMutator{name, mutator})
|
||||
func RegisterBottomUpMutator(name string, m blueprint.BottomUpMutator) {
|
||||
mutators = append(mutators, mutator{name: name, bottomUpMutator: m})
|
||||
}
|
||||
|
||||
func RegisterTopDownMutator(name string, m blueprint.TopDownMutator) {
|
||||
mutators = append(mutators, mutator{name: name, topDownMutator: m})
|
||||
}
|
||||
|
||||
func NewContext() *blueprint.Context {
|
||||
@@ -60,8 +65,13 @@ func NewContext() *blueprint.Context {
|
||||
ctx.RegisterSingletonType(t.name, t.factory)
|
||||
}
|
||||
|
||||
for _, t := range earlyMutators {
|
||||
ctx.RegisterEarlyMutator(t.name, t.mutator)
|
||||
for _, t := range mutators {
|
||||
if t.bottomUpMutator != nil {
|
||||
ctx.RegisterBottomUpMutator(t.name, t.bottomUpMutator)
|
||||
}
|
||||
if t.topDownMutator != nil {
|
||||
ctx.RegisterTopDownMutator(t.name, t.topDownMutator)
|
||||
}
|
||||
}
|
||||
|
||||
return ctx
|
||||
|
Reference in New Issue
Block a user