OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 serialization | 5 package serialization |
6 | 6 |
7 import ( | 7 import ( |
8 "fmt" | |
9 "mojo/public/go/bindings" | |
10 "mojom/mojom_parser/generated/mojom_files" | |
11 "mojom/mojom_parser/generated/mojom_types" | |
8 "mojom/mojom_parser/mojom" | 12 "mojom/mojom_parser/mojom" |
9 ) | 13 ) |
10 | 14 |
11 ////////////////////////////////////////////////// | 15 ////////////////////////////////////////////////// |
12 /// Mojom Descriptor Serialization | 16 /// Mojom Descriptor Serialization |
13 ////////////////////////////////////////////////// | 17 ////////////////////////////////////////////////// |
14 | 18 |
19 // This variable may be set to false in order to omit emitting line and | |
20 // column numbers. | |
21 var EmitLineAndColumnNumbers bool = true | |
22 | |
15 // Serializes the MojomDescriptor into a binary form that is passed to the | 23 // Serializes the MojomDescriptor into a binary form that is passed to the |
16 // backend of the compiler in order to invoke the code generators. | 24 // backend of the compiler in order to invoke the code generators. |
17 // To do this we use Mojo serialization. | 25 // To do this we use Mojo serialization. |
18 func Serialize(d *mojom.MojomDescriptor) (bytes []byte, err error) { | 26 func Serialize(d *mojom.MojomDescriptor) (bytes []byte, err error) { |
19 » // TODO(rudominer) This is a stub. It will be implemented in a later | 27 » fileGraph := translateDescriptor(d) |
20 » // CL. | 28 » encoder := bindings.NewEncoder() |
21 » bytes = []byte("DummyOutput") | 29 » fileGraph.Encode(encoder) |
30 » bytes, _, err = encoder.Data() | |
22 return | 31 return |
23 } | 32 } |
33 | |
34 // translateDescriptor translates from a mojom.MojomDescriptor (the pure Go | |
35 // representation used by the parser) to a mojom_files.MojomFileGraph (the | |
36 // Mojo Go representation used for serialization.) | |
37 func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph { | |
38 fileGraph := mojom_files.MojomFileGraph{} | |
39 | |
40 // Add |files| field. | |
41 fileGraph.Files = make(map[string]mojom_files.MojomFile) | |
42 for name, file := range d.MojomFilesByName { | |
43 fileGraph.Files[name] = translateMojomFile(file) | |
44 } | |
45 | |
46 // Add |resolved_types| field. | |
47 fileGraph.ResolvedTypes = make(map[string]mojom_types.UserDefinedType) | |
48 for key, userDefinedType := range d.TypesByKey { | |
49 fileGraph.ResolvedTypes[key] = translateUserDefinedType(userDefi nedType) | |
50 } | |
51 | |
52 // Add |resolved_values| field. | |
53 fileGraph.ResolvedValues = make(map[string]mojom_types.UserDefinedValue) | |
54 for key, userDefinedValue := range d.ValuesByKey { | |
55 fileGraph.ResolvedValues[key] = translateUserDefinedValue(userDe finedValue) | |
56 } | |
57 | |
58 return &fileGraph | |
59 } | |
60 | |
61 // translateMojomFile translates from a mojom.MojomFile (the pure Go | |
62 // representation used by the parser) to a mojom_files.MojomFile (the | |
63 // Mojo Go representation used for serialization.) | |
64 func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) { | |
65 // file_name field | |
66 file.FileName = f.CanonicalFileName | |
67 | |
68 // module_namespace field | |
69 file.ModuleNamespace = newString(f.ModuleNamespace) | |
70 | |
71 // attributes field | |
72 if f.Attributes != nil { | |
73 file.Attributes = new([]mojom_types.Attribute) | |
74 for _, attr := range f.Attributes.List { | |
75 *(file.Attributes) = append(*(file.Attributes), translat eMojomAttribute(&attr)) | |
76 } | |
77 } | |
78 | |
79 // imports field | |
80 if len(f.Imports) > 0 { | |
81 file.Imports = new([]string) | |
82 for _, importName := range f.Imports { | |
83 *(file.Imports) = append(*(file.Imports), importName.Can onicalFileName) | |
84 } | |
85 } | |
86 | |
87 // declared_mojom_objects field... | |
88 | |
89 // Interfaces | |
90 if f.Interfaces != nil && len(f.Interfaces) > 0 { | |
91 file.DeclaredMojomObjects.Interfaces = new([]string) | |
92 for _, intrfc := range f.Interfaces { | |
93 *(file.DeclaredMojomObjects.Interfaces) = append(*(file. DeclaredMojomObjects.Interfaces), intrfc.TypeKey()) | |
mattr
2015/11/10 19:26:49
Why do we have a pointer to a slice? Slices are a
rudominer
2015/11/10 23:29:36
The Go code that defines a variable as a pointer t
| |
94 } | |
95 } | |
96 | |
97 // Structs | |
98 if f.Structs != nil && len(f.Structs) > 0 { | |
99 file.DeclaredMojomObjects.Structs = new([]string) | |
100 for _, strct := range f.Structs { | |
101 *(file.DeclaredMojomObjects.Structs) = append(*(file.Dec laredMojomObjects.Structs), strct.TypeKey()) | |
102 } | |
103 } | |
104 | |
105 // Unions | |
106 if f.Unions != nil && len(f.Unions) > 0 { | |
107 file.DeclaredMojomObjects.Unions = new([]string) | |
108 for _, union := range f.Unions { | |
109 *(file.DeclaredMojomObjects.Unions) = append(*(file.Decl aredMojomObjects.Unions), union.TypeKey()) | |
110 } | |
111 } | |
112 | |
113 // TopLevelEnums | |
114 if f.Enums != nil && len(f.Enums) > 0 { | |
115 file.DeclaredMojomObjects.TopLevelEnums = new([]string) | |
116 for _, enum := range f.Enums { | |
117 *(file.DeclaredMojomObjects.TopLevelEnums) = append(*(fi le.DeclaredMojomObjects.TopLevelEnums), enum.TypeKey()) | |
118 } | |
119 } | |
120 | |
121 // TopLevelConstants | |
122 if f.Constants != nil && len(f.Constants) > 0 { | |
123 file.DeclaredMojomObjects.TopLevelConstants = new([]string) | |
124 for _, constant := range f.Constants { | |
125 *(file.DeclaredMojomObjects.TopLevelConstants) = append( *(file.DeclaredMojomObjects.TopLevelConstants), constant.ValueKey()) | |
126 } | |
127 } | |
128 | |
129 // TODO(rudominer) Do we need the EmbeddedEnums and EmbeddedConstants | |
130 // fields in KeysByType. It seems these fields are not currently being | |
131 // used in mojom_translator.py. | |
132 | |
133 return | |
134 } | |
135 | |
136 // translateUserDefinedType translates from a mojom.UserDefinedType (the pure Go | |
137 // representation used by the parser) to a mojom_types.UserDefinedType (the | |
138 // Mojo Go representation used for serialization.) | |
139 func translateUserDefinedType(t mojom.UserDefinedType) mojom_types.UserDefinedTy pe { | |
140 switch p := t.(type) { | |
141 case *mojom.MojomStruct: | |
142 return &mojom_types.UserDefinedTypeStructType{translateMojomStru ct(p)} | |
143 case *mojom.MojomInterface: | |
144 return translateMojomInterface(p) | |
145 case *mojom.MojomEnum: | |
146 return translateMojomEnum(p) | |
147 case *mojom.MojomUnion: | |
148 return translateMojomUnion(p) | |
149 default: | |
150 panic(fmt.Sprintf("Unexpected type: %T", t)) | |
151 | |
152 } | |
153 } | |
154 | |
155 func translateMojomStruct(s *mojom.MojomStruct) mojom_types.MojomStruct { | |
156 mojomStruct := mojom_types.MojomStruct{} | |
157 mojomStruct.DeclData = translateDeclarationData(&s.DeclarationData) | |
158 mojomStruct.DeclData.ContainedDeclarations = translateContainedDeclarati ons(&s.DeclarationContainer) | |
159 | |
160 for _, field := range s.Fields { | |
161 mojomStruct.Fields = append(mojomStruct.Fields, translateStructF ield(field)) | |
162 } | |
163 | |
164 // TODO(rudominer) Implement VersionInfo. | |
165 //mojomStruct.Value.VersionInfo = new([]mojom_types.StructVersion) | |
166 | |
167 return mojomStruct | |
168 } | |
169 | |
170 func translateStructField(f *mojom.StructField) (field mojom_types.StructField) { | |
171 field.DeclData = translateDeclarationData(&f.DeclarationData) | |
172 field.Type = translateTypeRef(f.FieldType) | |
173 if f.DefaultValue != nil { | |
174 field.DefaultValue = translateDefaultFieldValue(f.DefaultValue) | |
175 } | |
176 // TODO(rudominer) Implement field offsets. | |
177 field.Offset = f.Offset | |
178 return | |
179 } | |
180 | |
181 func translateDefaultFieldValue(v mojom.ValueRef) mojom_types.DefaultFieldValue { | |
182 switch v := v.(type) { | |
183 case mojom.LiteralValue: | |
184 if v.IsDefault() { | |
185 return &mojom_types.DefaultFieldValueDefaultKeyword{mojo m_types.DefaultKeyword{}} | |
186 } | |
187 return &mojom_types.DefaultFieldValueValue{translateLiteralValue (v)} | |
188 case *mojom.UserValueRef: | |
189 switch t := v.ResolvedConcreteValue().(type) { | |
190 case mojom.BuiltInConstantValue: | |
191 return &mojom_types.DefaultFieldValueValue{translateBuil tInConstantValue(t)} | |
192 default: | |
193 return &mojom_types.DefaultFieldValueValue{translateUser ValueRef(v)} | |
194 } | |
195 default: | |
196 panic(fmt.Sprintf("Unexpected ValueRef type: %T", v)) | |
197 | |
198 } | |
199 } | |
200 | |
201 func translateMojomInterface(intrfc *mojom.MojomInterface) *mojom_types.UserDefi nedTypeInterfaceType { | |
202 mojomInterface := mojom_types.UserDefinedTypeInterfaceType{} | |
203 | |
204 mojomInterface.Value.DeclData = translateDeclarationData(&intrfc.Declara tionData) | |
205 mojomInterface.Value.DeclData.ContainedDeclarations = translateContained Declarations(&intrfc.DeclarationContainer) | |
206 | |
207 // TODO(rudominer) The Interface name field need not be the name from th e .mojom file. | |
208 mojomInterface.Value.InterfaceName = intrfc.SimpleName() | |
209 | |
210 mojomInterface.Value.Methods = make(map[uint32]mojom_types.MojomMethod) | |
211 for ordinal, method := range intrfc.MethodsByOrdinal { | |
212 mojomInterface.Value.Methods[ordinal] = translateMojomMethod(met hod) | |
213 } | |
214 | |
215 return &mojomInterface | |
216 } | |
217 | |
218 func translateMojomMethod(method *mojom.MojomMethod) mojom_types.MojomMethod { | |
219 mojomMethod := mojom_types.MojomMethod{} | |
220 | |
221 // decl_data | |
222 mojomMethod.DeclData = translateDeclarationData(&method.DeclarationData) | |
223 | |
224 // parameters | |
225 mojomMethod.Parameters = translateMojomStruct(method.Parameters) | |
226 | |
227 // response_params | |
228 if method.ResponseParameters != nil { | |
229 responseParams := translateMojomStruct(method.ResponseParameters ) | |
230 mojomMethod.ResponseParams = &responseParams | |
231 } | |
232 | |
233 // ordinal | |
234 mojomMethod.Ordinal = method.Ordinal | |
235 return mojomMethod | |
236 } | |
237 | |
238 func translateMojomEnum(enum *mojom.MojomEnum) *mojom_types.UserDefinedTypeEnumT ype { | |
239 mojomEnum := mojom_types.UserDefinedTypeEnumType{} | |
240 mojomEnum.Value.DeclData = translateDeclarationData(&enum.DeclarationDat a) | |
241 for _, value := range enum.Values { | |
242 mojomEnum.Value.Values = append(mojomEnum.Value.Values, translat eEnumValue(value)) | |
243 } | |
244 return &mojomEnum | |
245 } | |
246 | |
247 func translateMojomUnion(union *mojom.MojomUnion) *mojom_types.UserDefinedTypeUn ionType { | |
248 mojomUnion := mojom_types.UserDefinedTypeUnionType{} | |
249 mojomUnion.Value.DeclData = translateDeclarationData(&union.DeclarationD ata) | |
250 for _, field := range union.Fields { | |
251 mojomUnion.Value.Fields = append(mojomUnion.Value.Fields, | |
252 translateUnionField(field)) | |
253 } | |
254 return &mojomUnion | |
255 } | |
256 | |
257 func translateUnionField(unionField mojom.UnionField) mojom_types.UnionField { | |
258 outUnionField := mojom_types.UnionField{} | |
259 outUnionField.DeclData = translateDeclarationData(&unionField.Declaratio nData) | |
260 outUnionField.Type = translateTypeRef(unionField.FieldType) | |
261 outUnionField.Tag = unionField.Tag | |
262 return outUnionField | |
263 } | |
264 | |
265 // WARNING: Do not invoke this function on a UserDefinedValue of type BuiltInCon stantValue because | |
266 // objects of those types do not have a type_key and do not correspond to a mojo m_types.UserDefinedValue. | |
267 func translateUserDefinedValue(v mojom.UserDefinedValue) mojom_types.UserDefined Value { | |
268 switch t := v.(type) { | |
269 case *mojom.UserDefinedConstant: | |
270 return translateUserDefinedConstant(t) | |
271 case *mojom.EnumValue: | |
272 return &mojom_types.UserDefinedValueEnumValue{translateEnumValue (t)} | |
273 case *mojom.BuiltInConstantValue: | |
274 panic("Do not invoke translateUserDefinedValue on BuiltInConstan tValue.") | |
275 default: | |
276 panic(fmt.Sprintf("Unexpected UserDefinedValue type %T", v)) | |
277 | |
278 } | |
279 } | |
280 | |
281 func translateUserDefinedConstant(t *mojom.UserDefinedConstant) *mojom_types.Use rDefinedValueDeclaredConstant { | |
282 declaredConstant := mojom_types.UserDefinedValueDeclaredConstant{} | |
283 declaredConstant.Value.Type = translateTypeRef(t.DeclaredType()) | |
284 declaredConstant.Value.DeclData = *translateDeclarationData(&t.Declarati onData) | |
285 declaredConstant.Value.Value = translateValueRef(t.ValueRef()) | |
286 return &declaredConstant | |
287 } | |
288 | |
289 func translateEnumValue(v *mojom.EnumValue) mojom_types.EnumValue { | |
290 enumValue := mojom_types.EnumValue{} | |
291 enumValue.DeclData = translateDeclarationData(&v.DeclarationData) | |
292 enumValue.EnumTypeKey = v.EnumType().TypeKey() | |
293 if v.ValueRef() != nil { | |
294 enumValue.InitializerValue = translateValueRef(v.ValueRef()) | |
295 } | |
296 // TODO(rudominer) enumValue.IntValue should be set to v.ComputedIntValu e | |
297 // once MojomDescriptor.ComputeEnumValueIntegers() is implemented. | |
298 enumValue.IntValue = v.Int32Value() | |
299 return enumValue | |
300 } | |
301 | |
302 func translateTypeRef(typeRef mojom.TypeRef) mojom_types.Type { | |
303 switch t := typeRef.(type) { | |
304 case mojom.SimpleType: | |
305 return translateSimpleType(t) | |
306 case mojom.StringType: | |
307 return translateStringType(t) | |
308 case mojom.HandleTypeRef: | |
309 return translateHandleType(t) | |
310 case mojom.ArrayTypeRef: | |
azani
2015/11/10 22:46:07
AFAICT, from running this code, you should expect
rudominer
2015/11/10 23:29:36
OK, thanks for testing it. I will fix in a follow-
| |
311 return translateArrayType(t) | |
312 case mojom.MapTypeRef: | |
313 return translateMapType(t) | |
314 case *mojom.UserTypeRef: | |
315 return translateUserTypeRef(t) | |
316 default: | |
317 panic(fmt.Sprintf("Unexpected TypeRef type %T", t)) | |
318 } | |
319 } | |
320 | |
321 func translateSimpleType(simpleType mojom.SimpleType) *mojom_types.TypeSimpleTyp e { | |
322 var value mojom_types.SimpleType | |
323 switch simpleType { | |
324 case mojom.SimpleTypeBool: | |
325 value = mojom_types.SimpleType_Bool | |
326 case mojom.SimpleTypeDouble: | |
327 value = mojom_types.SimpleType_Double | |
328 case mojom.SimpleTypeFloat: | |
329 value = mojom_types.SimpleType_Float | |
330 case mojom.SimpleTypeInt8: | |
331 value = mojom_types.SimpleType_InT8 | |
332 case mojom.SimpleTypeInt16: | |
333 value = mojom_types.SimpleType_InT16 | |
334 case mojom.SimpleTypeInt32: | |
335 value = mojom_types.SimpleType_InT32 | |
336 case mojom.SimpleTypeInt64: | |
337 value = mojom_types.SimpleType_InT64 | |
338 case mojom.SimpleTypeUInt8: | |
339 value = mojom_types.SimpleType_UinT8 | |
340 case mojom.SimpleTypeUInt16: | |
341 value = mojom_types.SimpleType_UinT16 | |
342 case mojom.SimpleTypeUInt32: | |
343 value = mojom_types.SimpleType_UinT32 | |
344 case mojom.SimpleTypeUInt64: | |
345 value = mojom_types.SimpleType_UinT64 | |
346 } | |
347 return &mojom_types.TypeSimpleType{value} | |
348 } | |
349 | |
350 func translateStringType(stringType mojom.StringType) *mojom_types.TypeStringTyp e { | |
351 return &mojom_types.TypeStringType{mojom_types.StringType{stringType.Nul lable()}} | |
352 } | |
353 | |
354 func translateHandleType(handleType mojom.HandleTypeRef) *mojom_types.TypeHandle Type { | |
355 var kind mojom_types.HandleType_Kind | |
356 switch handleType.HandleKind() { | |
357 case mojom.HandleKindUnspecified: | |
358 kind = mojom_types.HandleType_Kind_Unspecified | |
359 case mojom.HandleKindMessagePipe: | |
360 kind = mojom_types.HandleType_Kind_MessagePipe | |
361 case mojom.HandleKindDataPipeConsumer: | |
362 kind = mojom_types.HandleType_Kind_DataPipeConsumer | |
363 case mojom.HandleKindDataPipeProducer: | |
364 kind = mojom_types.HandleType_Kind_DataPipeProducer | |
365 case mojom.HandleKindSharedBuffer: | |
366 kind = mojom_types.HandleType_Kind_SharedBuffer | |
367 } | |
368 return &mojom_types.TypeHandleType{mojom_types.HandleType{handleType.Nul lable(), kind}} | |
369 } | |
370 | |
371 func translateArrayType(arrayType mojom.ArrayTypeRef) *mojom_types.TypeArrayType { | |
372 return &mojom_types.TypeArrayType{mojom_types.ArrayType{ | |
373 Nullable: arrayType.Nullable(), | |
374 FixedLength: int32(arrayType.FixedLength()), | |
375 ElementType: translateTypeRef(arrayType.ElementType())}} | |
376 } | |
377 | |
378 func translateMapType(mapType mojom.MapTypeRef) *mojom_types.TypeMapType { | |
379 return &mojom_types.TypeMapType{mojom_types.MapType{ | |
380 Nullable: mapType.Nullable(), | |
381 KeyType: translateTypeRef(mapType.KeyType()), | |
382 ValueType: translateTypeRef(mapType.ValueType())}} | |
383 } | |
384 | |
385 func translateUserTypeRef(userType *mojom.UserTypeRef) *mojom_types.TypeTypeRefe rence { | |
386 typeKey := newString(userType.ResolvedType().TypeKey()) | |
387 identifier := newString(userType.Identifier()) | |
388 return &mojom_types.TypeTypeReference{mojom_types.TypeReference{ | |
389 Nullable: userType.Nullable(), | |
390 IsInterfaceRequest: userType.IsInterfaceRequest(), | |
391 Identifier: identifier, | |
392 TypeKey: typeKey}} | |
393 } | |
394 | |
395 func translateValueRef(valueRef mojom.ValueRef) mojom_types.Value { | |
396 switch valueRef := valueRef.(type) { | |
397 case mojom.LiteralValue: | |
398 return translateLiteralValue(valueRef) | |
399 case *mojom.UserValueRef: | |
400 return translateUserValueRef(valueRef) | |
401 default: | |
402 panic(fmt.Sprintf("Unexpected ValueRef type %T", valueRef)) | |
403 } | |
404 } | |
405 | |
406 func translateLiteralValue(v mojom.LiteralValue) *mojom_types.ValueLiteralValue { | |
407 var lv mojom_types.LiteralValue | |
408 switch v.ValueType() { | |
409 case mojom.SimpleTypeBool: | |
410 lv = &mojom_types.LiteralValueBoolValue{v.Value().(bool)} | |
411 case mojom.SimpleTypeDouble: | |
412 lv = &mojom_types.LiteralValueDoubleValue{v.Value().(float64)} | |
413 case mojom.SimpleTypeFloat: | |
414 lv = &mojom_types.LiteralValueFloatValue{v.Value().(float32)} | |
415 case mojom.SimpleTypeInt8: | |
416 lv = &mojom_types.LiteralValueInt8Value{v.Value().(int8)} | |
417 case mojom.SimpleTypeInt16: | |
418 lv = &mojom_types.LiteralValueInt16Value{v.Value().(int16)} | |
419 case mojom.SimpleTypeInt32: | |
420 lv = &mojom_types.LiteralValueInt32Value{v.Value().(int32)} | |
421 case mojom.SimpleTypeInt64: | |
422 lv = &mojom_types.LiteralValueInt64Value{v.Value().(int64)} | |
423 case mojom.SimpleTypeUInt8: | |
424 lv = &mojom_types.LiteralValueUint8Value{v.Value().(uint8)} | |
425 case mojom.SimpleTypeUInt16: | |
426 lv = &mojom_types.LiteralValueUint16Value{v.Value().(uint16)} | |
427 case mojom.SimpleTypeUInt32: | |
428 lv = &mojom_types.LiteralValueUint32Value{v.Value().(uint32)} | |
429 case mojom.SimpleTypeUInt64: | |
430 lv = &mojom_types.LiteralValueUint64Value{v.Value().(uint64)} | |
431 case mojom.StringLiteralType: | |
432 lv = &mojom_types.LiteralValueStringValue{v.Value().(string)} | |
433 default: | |
434 panic(fmt.Sprintf("Unexpected literal value type %d", v.ValueTyp e())) | |
435 } | |
436 return &mojom_types.ValueLiteralValue{lv} | |
437 } | |
438 | |
439 func translateBuiltInConstantValue(t mojom.BuiltInConstantValue) *mojom_types.Va lueBuiltinValue { | |
440 builtInValue := mojom_types.ValueBuiltinValue{} | |
441 switch t { | |
442 case mojom.SimpleTypeFloat_INFINITY: | |
443 builtInValue.Value = mojom_types.BuiltinConstantValue_FloatInfin ity | |
444 case mojom.SimpleTypeFloat_NEGATIVE_INFINITY: | |
445 builtInValue.Value = mojom_types.BuiltinConstantValue_FloatNegat iveInfinity | |
446 case mojom.SimpleTypeFloat_NAN: | |
447 builtInValue.Value = mojom_types.BuiltinConstantValue_FloatNan | |
448 case mojom.SimpleTypeDouble_INFINITY: | |
449 builtInValue.Value = mojom_types.BuiltinConstantValue_DoubleInfi nity | |
450 case mojom.SimpleTypeDouble_NEGATIVE_INFINITY: | |
451 builtInValue.Value = mojom_types.BuiltinConstantValue_DoubleNega tiveInfinity | |
452 case mojom.SimpleTypeDouble_NAN: | |
453 builtInValue.Value = mojom_types.BuiltinConstantValue_DoubleNega tiveInfinity | |
454 default: | |
455 panic(fmt.Sprintf("Unrecognized BuiltInConstantValue %v", t)) | |
456 } | |
457 return &builtInValue | |
458 } | |
459 | |
460 func translateUserValueRef(r *mojom.UserValueRef) *mojom_types.ValueUserValueRef erence { | |
461 valueKey := newString(r.ResolvedDeclaredValue().ValueKey()) | |
462 return &mojom_types.ValueUserValueReference{mojom_types.UserValueReferen ce{ | |
463 Identifier: r.Identifier(), | |
464 ValueKey: valueKey, | |
465 ResolvedConcreteValue: translateConcreteValue(r.ResolvedConcrete Value())}} | |
466 } | |
467 | |
468 func translateConcreteValue(v mojom.ConcreteValue) mojom_types.Value { | |
469 switch t := v.(type) { | |
470 case mojom.BuiltInConstantValue: | |
471 return translateBuiltInConstantValue(t) | |
472 case mojom.LiteralValue: | |
473 return translateLiteralValue(t) | |
474 case *mojom.EnumValue: | |
475 // Note that in the pure Go representation we support the abstra ction | |
476 // that an EnumValue is a type of ConcreteValue. This makes sens e because | |
477 // an Enum is abstractly a finite set of values that need not ha ve | |
478 // a corresponding integer value. However in mojom_types.mojom w e currently | |
479 // do not support this abstraction: the only concrete values are the literal | |
480 // values and the BuiltInConstantValues. Consequently here we re turn the | |
481 // Int32Value() of the EnumValue. | |
482 return &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueI nt32Value{t.Int32Value()}} | |
483 default: | |
484 panic(fmt.Sprintf("Unexpected type %T", v)) | |
485 } | |
486 } | |
487 | |
488 func translateDeclarationData(d *mojom.DeclarationData) *mojom_types.Declaration Data { | |
489 declData := mojom_types.DeclarationData{} | |
490 | |
491 // attributes field | |
492 if d.Attributes() != nil { | |
493 declData.Attributes = new([]mojom_types.Attribute) | |
494 for _, attr := range d.Attributes().List { | |
495 *(declData.Attributes) = append(*(declData.Attributes), translateMojomAttribute(&attr)) | |
496 } | |
497 } | |
498 | |
499 // min_version field | |
500 // TODO(rudominer) Eliminate the min_version field from struct Declarati onData | |
501 | |
502 // short_name field | |
503 declData.ShortName = newString(d.SimpleName()) | |
504 | |
505 // full_identifier field | |
506 declData.FullIdentifier = newString(d.FullyQualifiedName()) | |
507 | |
508 // declared_ordinal field | |
509 if d.DeclaredOrdinal() < 0 { | |
510 declData.DeclaredOrdinal = -1 | |
511 } else { | |
512 declData.DeclaredOrdinal = int32(d.DeclaredOrdinal()) | |
513 } | |
514 | |
515 // declaration_order | |
516 // TODO(rudominer) DeclarationOrder is currently not populated. | |
517 declData.DeclarationOrder = -1 | |
518 | |
519 // source_file_info | |
520 declData.SourceFileInfo = new(mojom_types.SourceFileInfo) | |
521 declData.SourceFileInfo.FileName = d.OwningFile().CanonicalFileName | |
522 if EmitLineAndColumnNumbers { | |
523 declData.SourceFileInfo.LineNumber = d.LineNumber() | |
524 declData.SourceFileInfo.ColumnNumber = d.ColumnNumber() | |
525 } | |
526 return &declData | |
527 } | |
528 | |
529 // Returns nil if there are no contained declarations | |
530 func translateContainedDeclarations(container *mojom.DeclarationContainer) *mojo m_types.ContainedDeclarations { | |
531 if container.Enums == nil && container.Constants == nil { | |
532 return nil | |
533 } | |
534 declarations := mojom_types.ContainedDeclarations{} | |
535 if container.Enums != nil { | |
536 declarations.Enums = new([]string) | |
537 for _, enum := range container.Enums { | |
538 *declarations.Enums = append(*declarations.Enums, enum.T ypeKey()) | |
539 } | |
540 } | |
541 if container.Constants != nil { | |
542 declarations.Constants = new([]string) | |
543 for _, constant := range container.Constants { | |
544 *declarations.Constants = append(*declarations.Constants , constant.ValueKey()) | |
545 } | |
546 } | |
547 return &declarations | |
548 } | |
549 | |
550 func translateMojomAttribute(a *mojom.MojomAttribute) (attribute mojom_types.Att ribute) { | |
551 // TODO(rudominer) Improve representation of attribute values. | |
552 return mojom_types.Attribute{a.Key, fmt.Sprintf("%v", a.Value.Value())} | |
553 } | |
554 | |
555 func newString(s string) *string { | |
mattr
2015/11/10 19:26:49
I don't understand this function. In Go strings a
rudominer
2015/11/10 23:29:36
The explanation for this peculiarity is similar to
mattr
2015/11/10 23:43:40
Sure, but you should just do
return &s
In which
| |
556 t := new(string) | |
557 *t = s | |
558 return t | |
559 } | |
OLD | NEW |