| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package translator | 5 package translator |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "fmt" | 8 "fmt" |
| 9 "log" | 9 "log" |
| 10 "sort" | 10 "sort" |
| 11 | 11 |
| 12 "mojom/generated/mojom_files" | 12 "mojom/generated/mojom_files" |
| 13 "mojom/generated/mojom_types" | 13 "mojom/generated/mojom_types" |
| 14 "mojom/generators/common" | 14 "mojom/generators/common" |
| 15 ) | 15 ) |
| 16 | 16 |
| 17 type Translator interface { | 17 type Translator interface { |
| 18 TranslateMojomFile(fileName string) *TmplFile | 18 TranslateMojomFile(fileName string) *TmplFile |
| 19 } | 19 } |
| 20 | 20 |
| 21 type translator struct { | 21 type translator struct { |
| 22 fileGraph *mojom_files.MojomFileGraph | 22 fileGraph *mojom_files.MojomFileGraph |
| 23 // goTypeCache maps type keys to go type strings. | 23 // goTypeCache maps type keys to go type strings. |
| 24 » goTypeCache map[string]string | 24 » goTypeCache map[string]string |
| 25 » imports map[string]string | 25 » goConstNameCache map[string]string |
| 26 » currentFileName string | 26 » imports map[string]string |
| 27 » pkgName string | 27 » currentFileName string |
| 28 » Config common.GeneratorConfig | 28 » pkgName string |
| 29 » Config common.GeneratorConfig |
| 29 } | 30 } |
| 30 | 31 |
| 31 func NewTranslator(fileGraph *mojom_files.MojomFileGraph) (t *translator) { | 32 func NewTranslator(fileGraph *mojom_files.MojomFileGraph) (t *translator) { |
| 32 t = new(translator) | 33 t = new(translator) |
| 33 t.fileGraph = fileGraph | 34 t.fileGraph = fileGraph |
| 34 t.goTypeCache = map[string]string{} | 35 t.goTypeCache = map[string]string{} |
| 36 t.goConstNameCache = map[string]string{} |
| 35 t.imports = map[string]string{} | 37 t.imports = map[string]string{} |
| 36 return t | 38 return t |
| 37 } | 39 } |
| 38 | 40 |
| 39 func (t *translator) TranslateMojomFile(fileName string) (tmplFile *TmplFile) { | 41 func (t *translator) TranslateMojomFile(fileName string) (tmplFile *TmplFile) { |
| 40 t.currentFileName = fileName | 42 t.currentFileName = fileName |
| 41 t.imports = map[string]string{} | 43 t.imports = map[string]string{} |
| 42 | 44 |
| 43 tmplFile = new(TmplFile) | 45 tmplFile = new(TmplFile) |
| 44 file := t.fileGraph.Files[fileName] | 46 file := t.fileGraph.Files[fileName] |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 file.DeclaredMojomObjects.Interfaces = &[]string{} | 89 file.DeclaredMojomObjects.Interfaces = &[]string{} |
| 88 } | 90 } |
| 89 tmplFile.Interfaces = make([]*InterfaceTemplate, len(*file.DeclaredMojom
Objects.Interfaces)) | 91 tmplFile.Interfaces = make([]*InterfaceTemplate, len(*file.DeclaredMojom
Objects.Interfaces)) |
| 90 for i, typeKey := range *file.DeclaredMojomObjects.Interfaces { | 92 for i, typeKey := range *file.DeclaredMojomObjects.Interfaces { |
| 91 tmplFile.Interfaces[i] = t.translateMojomInterface(typeKey) | 93 tmplFile.Interfaces[i] = t.translateMojomInterface(typeKey) |
| 92 if len(tmplFile.Interfaces[i].Methods) > 0 { | 94 if len(tmplFile.Interfaces[i].Methods) > 0 { |
| 93 methodDefined = true | 95 methodDefined = true |
| 94 } | 96 } |
| 95 } | 97 } |
| 96 | 98 |
| 99 if file.DeclaredMojomObjects.TopLevelConstants == nil { |
| 100 file.DeclaredMojomObjects.TopLevelConstants = &[]string{} |
| 101 } |
| 102 if file.DeclaredMojomObjects.EmbeddedConstants == nil { |
| 103 file.DeclaredMojomObjects.EmbeddedConstants = &[]string{} |
| 104 } |
| 105 for _, constKey := range *file.DeclaredMojomObjects.TopLevelConstants { |
| 106 c := t.translateDeclaredConstant(constKey) |
| 107 if c != nil { |
| 108 tmplFile.Constants = append(tmplFile.Constants, c) |
| 109 } |
| 110 } |
| 111 for _, constKey := range *file.DeclaredMojomObjects.EmbeddedConstants { |
| 112 c := t.translateDeclaredConstant(constKey) |
| 113 if c != nil { |
| 114 tmplFile.Constants = append(tmplFile.Constants, c) |
| 115 } |
| 116 } |
| 117 |
| 97 tmplFile.Imports = []Import{} | 118 tmplFile.Imports = []Import{} |
| 98 tmplFile.MojomImports = []string{} | 119 tmplFile.MojomImports = []string{} |
| 99 | 120 |
| 100 for pkgName, pkgPath := range t.imports { | 121 for pkgName, pkgPath := range t.imports { |
| 101 if pkgName != "service_describer" && pkgName != "mojom_types" &&
pkgPath != "mojo/public/go/system" { | 122 if pkgName != "service_describer" && pkgName != "mojom_types" &&
pkgPath != "mojo/public/go/system" { |
| 102 tmplFile.MojomImports = append(tmplFile.MojomImports, pk
gName) | 123 tmplFile.MojomImports = append(tmplFile.MojomImports, pk
gName) |
| 103 } | 124 } |
| 104 } | 125 } |
| 105 | 126 |
| 106 if len(tmplFile.Structs) > 0 || len(tmplFile.Unions) > 0 || len(tmplFile
.Interfaces) > 0 { | 127 if len(tmplFile.Structs) > 0 || len(tmplFile.Unions) > 0 || len(tmplFile
.Interfaces) > 0 { |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 m.Params.Name = fmt.Sprintf("%s_Params", m.FullName) | 313 m.Params.Name = fmt.Sprintf("%s_Params", m.FullName) |
| 293 m.Params.PrivateName = privateName(m.Params.Name) | 314 m.Params.PrivateName = privateName(m.Params.Name) |
| 294 if mojomMethod.ResponseParams != nil { | 315 if mojomMethod.ResponseParams != nil { |
| 295 m.ResponseParams = t.translateMojomStructObject(*mojomMethod.Res
ponseParams) | 316 m.ResponseParams = t.translateMojomStructObject(*mojomMethod.Res
ponseParams) |
| 296 m.ResponseParams.Name = fmt.Sprintf("%s_ResponseParams", m.FullN
ame) | 317 m.ResponseParams.Name = fmt.Sprintf("%s_ResponseParams", m.FullN
ame) |
| 297 m.ResponseParams.PrivateName = privateName(m.ResponseParams.Name
) | 318 m.ResponseParams.PrivateName = privateName(m.ResponseParams.Name
) |
| 298 } | 319 } |
| 299 return m | 320 return m |
| 300 } | 321 } |
| 301 | 322 |
| 323 func (t *translator) translateDeclaredConstant(constKey string) (c *ConstantTemp
late) { |
| 324 declaredConstant := t.fileGraph.ResolvedConstants[constKey] |
| 325 resolvedValue := t.resolveConstRef(declaredConstant.Value) |
| 326 if _, ok := resolvedValue.(*mojom_types.ValueBuiltinValue); ok { |
| 327 // There is no way to have a constant NaN, or infinity in go. |
| 328 return nil |
| 329 } |
| 330 c = new(ConstantTemplate) |
| 331 c.Name = t.goConstName(constKey) |
| 332 c.Type = t.translateType(declaredConstant.Type) |
| 333 c.Value = t.translateValue(declaredConstant.Value) |
| 334 return c |
| 335 } |
| 336 |
| 302 //////////////////////////////////////////////////////////////////////////////// | 337 //////////////////////////////////////////////////////////////////////////////// |
| 303 | 338 |
| 304 // Implements sort.Interface. | 339 // Implements sort.Interface. |
| 305 type structFieldSerializationSorter []mojom_types.StructField | 340 type structFieldSerializationSorter []mojom_types.StructField |
| 306 | 341 |
| 307 func (s structFieldSerializationSorter) Len() int { | 342 func (s structFieldSerializationSorter) Len() int { |
| 308 return len(s) | 343 return len(s) |
| 309 } | 344 } |
| 310 | 345 |
| 311 func (s structFieldSerializationSorter) Less(i, j int) bool { | 346 func (s structFieldSerializationSorter) Less(i, j int) bool { |
| 312 if s[i].Offset < s[j].Offset { | 347 if s[i].Offset < s[j].Offset { |
| 313 return true | 348 return true |
| 314 } | 349 } |
| 315 | 350 |
| 316 if s[i].Offset == s[j].Offset && s[i].Bit < s[j].Bit { | 351 if s[i].Offset == s[j].Offset && s[i].Bit < s[j].Bit { |
| 317 return true | 352 return true |
| 318 } | 353 } |
| 319 | 354 |
| 320 return false | 355 return false |
| 321 } | 356 } |
| 322 | 357 |
| 323 func (s structFieldSerializationSorter) Swap(i, j int) { | 358 func (s structFieldSerializationSorter) Swap(i, j int) { |
| 324 s[i], s[j] = s[j], s[i] | 359 s[i], s[j] = s[j], s[i] |
| 325 } | 360 } |
| OLD | NEW |