// Copyright (c) 2017, 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 'package:analysis_tool/tools.dart'; import 'package:path/path.dart' as path; import 'api.dart'; import 'codegen_dart_protocol.dart'; import 'from_html.dart'; import 'implied_types.dart'; GeneratedFile target(bool responseRequiresRequestTime) => new GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) async { CodegenCommonVisitor visitor = new CodegenCommonVisitor( path.basename(pkgPath), responseRequiresRequestTime, readApi(pkgPath)); return visitor.collectCode(visitor.visitApi); }); /** * A visitor that produces Dart code defining the common types associated with * the API. */ class CodegenCommonVisitor extends CodegenProtocolVisitor { /** * Initialize a newly created visitor to generate code in the package with the * given [packageName] corresponding to the types in the given [api] that are * common to multiple protocols. */ CodegenCommonVisitor( String packageName, bool responseRequiresRequestTime, Api api) : super(packageName, responseRequiresRequestTime, api); @override void emitImports() { writeln("import 'dart:convert' hide JsonDecoder;"); writeln(); writeln("import 'package:analyzer/src/generated/utilities_general.dart';"); writeln("import 'package:$packageName/protocol/protocol.dart';"); writeln( "import 'package:$packageName/src/protocol/protocol_internal.dart';"); } @override List getClassesToEmit() { List types = impliedTypes.values.where((ImpliedType type) { ApiNode node = type.apiNode; return node is TypeDefinition && node.isExternal; }).toList(); types.sort((first, second) => capitalize(first.camelName).compareTo(capitalize(second.camelName))); return types; } }