From f92c9f2809465b826fc4a9b4b7414c3ed13b2b07 Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Mon, 14 Mar 2022 14:35:50 -0700 Subject: Add type hints to mk2rbc Type hints have the format #RBC# type_hint MY_VAR list and must be specified at the top of the Makefile. Setting one will cause that variable to have that type for the remainder of the Makefile. This can be used where mk2rbc's type inference detects the wrong type and it must be manually changed. Bug: 224601891 Test: go test Change-Id: I6db2c50056d0298227e1d2801a522adf8bbd1df8 --- mk2rbc/variable.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'mk2rbc/variable.go') diff --git a/mk2rbc/variable.go b/mk2rbc/variable.go index 6805744a7..69297b94d 100644 --- a/mk2rbc/variable.go +++ b/mk2rbc/variable.go @@ -291,6 +291,12 @@ var presetVariables = map[string]bool{ // addVariable returns a variable with a given name. A variable is // added if it does not exist yet. func (ctx *parseContext) addVariable(name string) variable { + // Get the hintType before potentially changing the variable name + var hintType starlarkType + var ok bool + if hintType, ok = ctx.typeHints[name]; !ok { + hintType = starlarkTypeUnknown + } // Heuristics: if variable's name is all lowercase, consider it local // string variable. isLocalVariable := name == strings.ToLower(name) @@ -301,8 +307,8 @@ func (ctx *parseContext) addVariable(name string) variable { } v, found := ctx.variables[name] if !found { - _, preset := presetVariables[name] if vi, found := KnownVariables[name]; found { + _, preset := presetVariables[name] switch vi.class { case VarClassConfig: v = &productConfigVariable{baseVariable{nam: name, typ: vi.valueType, preset: preset}} @@ -310,10 +316,10 @@ func (ctx *parseContext) addVariable(name string) variable { v = &otherGlobalVariable{baseVariable{nam: name, typ: vi.valueType, preset: preset}} } } else if isLocalVariable { - v = &localVariable{baseVariable{nam: name, typ: starlarkTypeUnknown}} + v = &localVariable{baseVariable{nam: name, typ: hintType}} } else { - vt := starlarkTypeUnknown - if strings.HasPrefix(name, "LOCAL_") { + vt := hintType + if strings.HasPrefix(name, "LOCAL_") && vt == starlarkTypeUnknown { // Heuristics: local variables that contribute to corresponding config variables if cfgVarName, found := localProductConfigVariables[name]; found { vi, found2 := KnownVariables[cfgVarName] -- cgit v1.2.3-59-g8ed1b