| // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'api.dart'; |
| |
| /// Visitor specialized for generating Dart code. |
| class DartCodegenVisitor extends HierarchicalApiVisitor { |
| /// Type references in the spec that are named something else in Dart. |
| static const Map<String, String> _typeRenames = { |
| 'long': 'int', |
| 'object': 'Map', |
| }; |
| |
| DartCodegenVisitor(Api api) : super(api); |
| |
| /// Convert the given [TypeDecl] to a Dart type. |
| String dartType(TypeDecl type) { |
| if (type is TypeReference) { |
| var typeName = type.typeName; |
| var referencedDefinition = api.types[typeName]; |
| if (_typeRenames.containsKey(typeName)) { |
| return _typeRenames[typeName]!; |
| } |
| if (referencedDefinition == null) { |
| return typeName; |
| } |
| var referencedType = referencedDefinition.type; |
| if (referencedType is TypeObject || referencedType is TypeEnum) { |
| return typeName; |
| } |
| return dartType(referencedType); |
| } else if (type is TypeList) { |
| return 'List<${dartType(type.itemType)}>'; |
| } else if (type is TypeMap) { |
| return 'Map<${dartType(type.keyType)}, ${dartType(type.valueType)}>'; |
| } else if (type is TypeUnion) { |
| return 'Object'; |
| } else { |
| throw Exception("Can't convert to a dart type"); |
| } |
| } |
| |
| /// Return the Dart type for [field], nullable if the field is optional. |
| String fieldDartType(TypeObjectField field) { |
| var typeStr = dartType(field.type); |
| return field.optional ? '$typeStr?' : typeStr; |
| } |
| } |