// 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.

// @dart = 2.9

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;
  }
}
