1 // Copyright (C) 2017 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package hidl 16 17 import ( 18 "errors" 19 "path/filepath" 20 "regexp" 21 "strings" 22 ) 23 24 type fqName struct { 25 packageComponents []string 26 minor string 27 major string 28 } 29 30 // See system/tools/hidl/FQName.h 31 var component = "[a-zA-Z_][a-zA-Z_0-9]*" 32 var pkg = "(" + component + "(?:[.]" + component + ")*)" 33 var digits = "([0-9]+)" 34 var re_package = regexp.MustCompile("^" + pkg + "@" + digits + "." + digits + "$") 35 36 func parseFqName(f string) (*fqName, error) { 37 matches := re_package.FindAllStringSubmatch(f, 3) 38 39 if matches == nil { 40 return nil, errors.New("Poorly formed hal interface name: '" + f + "' must match '" + re_package.String() + "'") 41 } 42 43 ret := fqName{ 44 packageComponents: strings.Split(matches[0][1], "."), 45 major: matches[0][2], 46 minor: matches[0][3], 47 } 48 49 return &ret, nil 50 } 51 52 func (f *fqName) inPackage(pkg string) bool { 53 components := strings.Split(pkg, ".") 54 55 if len(components) > len(f.packageComponents) { 56 return false 57 } 58 59 for i, v := range components { 60 if f.packageComponents[i] != v { 61 return false 62 } 63 } 64 65 return true 66 } 67 68 func (f *fqName) pkg() string { 69 return strings.Join(f.packageComponents, ".") 70 } 71 func (f *fqName) version() string { 72 return f.major + "." + f.minor 73 } 74 func (f *fqName) sanitizedVersion() string { 75 return "V" + f.major + "_" + f.minor 76 } 77 func (f *fqName) string() string { 78 return f.pkg() + "@" + f.version() 79 } 80 func (f *fqName) sanitizedString() string { 81 return f.pkg() + "-V" + f.version() // NOT sanitizedVersion 82 } 83 84 func (f *fqName) dir() string { 85 return filepath.Join(filepath.Join(f.packageComponents...), f.version()) + "/" 86 } 87 func (f *fqName) sanitizedDir() string { 88 return filepath.Join(filepath.Join(f.packageComponents...), f.sanitizedVersion()) + "/" 89 } 90 91 func (f *fqName) fileGroupName() string { 92 return f.string() + "_hal" 93 } 94 func (f *fqName) sourcesName() string { 95 return f.string() + "_genc++" 96 } 97 func (f *fqName) headersName() string { 98 return f.string() + "_genc++_headers" 99 } 100 func (f *fqName) javaName() string { 101 return f.sanitizedString() + "-java" 102 } 103 func (f *fqName) javaSourcesName() string { 104 return f.sanitizedString() + "-java_gen_java" 105 } 106 func (f *fqName) javaConstantsName() string { 107 return f.sanitizedString() + "-java-constants" 108 } 109 func (f *fqName) javaConstantsSourcesName() string { 110 return f.sanitizedString() + "-java-constants_gen_java" 111 } 112 func (f *fqName) adapterName() string { 113 return f.string() + "-adapter" 114 } 115 func (f *fqName) adapterSourcesName() string { 116 return f.string() + "-adapter_genc++" 117 } 118 func (f *fqName) adapterHelperName() string { 119 return f.string() + "-adapter-helper" 120 } 121 func (f *fqName) adapterHelperSourcesName() string { 122 return f.string() + "-adapter-helper_genc++" 123 } 124 func (f *fqName) adapterHelperHeadersName() string { 125 return f.string() + "-adapter-helper_genc++_headers" 126 } 127