|  | // Copyright 2021 Google LLC | 
|  | // | 
|  | // 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 mk2rbc | 
|  |  | 
|  | import ( | 
|  | "bytes" | 
|  | "fmt" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | "strings" | 
|  |  | 
|  | mkparser "android/soong/androidmk/parser" | 
|  | ) | 
|  |  | 
|  | // Extracts the list of product config variables from a file, calling | 
|  | // given registrar for each variable. | 
|  | func FindConfigVariables(mkFile string, vr variableRegistrar) error { | 
|  | mkContents, err := ioutil.ReadFile(mkFile) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | parser := mkparser.NewParser(mkFile, bytes.NewBuffer(mkContents)) | 
|  | nodes, errs := parser.Parse() | 
|  | if len(errs) > 0 { | 
|  | for _, e := range errs { | 
|  | fmt.Fprintln(os.Stderr, "ERROR:", e) | 
|  | } | 
|  | return fmt.Errorf("cannot parse %s", mkFile) | 
|  | } | 
|  | for _, node := range nodes { | 
|  | asgn, ok := node.(*mkparser.Assignment) | 
|  | if !ok { | 
|  | continue | 
|  | } | 
|  | // We are looking for a variable called '_product_list_vars' | 
|  | // or '_product_single_value_vars'. | 
|  | if !asgn.Name.Const() { | 
|  | continue | 
|  | } | 
|  | varName := asgn.Name.Strings[0] | 
|  | var starType starlarkType | 
|  | if varName == "_product_list_vars" { | 
|  | starType = starlarkTypeList | 
|  | } else if varName == "_product_single_value_vars" { | 
|  | starType = starlarkTypeUnknown | 
|  | } else { | 
|  | continue | 
|  | } | 
|  | for _, name := range strings.Fields(asgn.Value.Dump()) { | 
|  | vr.NewVariable(name, VarClassConfig, starType) | 
|  | } | 
|  |  | 
|  | } | 
|  | return nil | 
|  | } |