blob: 54062f6f99f9c9d9baff96e312c3e73707b4c4e8 [file] [log] [blame]
// 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:analyzer_utilities/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 clientTarget(bool responseRequiresRequestTime) => GeneratedFile(
(String pkgPath) async {
var visitor = CodegenCommonVisitor(
path.basename(pkgPath), responseRequiresRequestTime, readApi(pkgPath),
forClient: true);
return visitor.collectCode(visitor.visitApi);
GeneratedFile pluginTarget(bool responseRequiresRequestTime) =>
GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) async {
var visitor = 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 {
final bool forClient;
/// 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.
String packageName, bool responseRequiresRequestTime, Api api,
{this.forClient = false})
: super(packageName, responseRequiresRequestTime, api);
void emitImports() {
writeln("import 'dart:convert' hide JsonDecoder;");
if (forClient) {
"import 'package:analysis_server_client/src/protocol/protocol_base.dart';");
"import 'package:analysis_server_client/src/protocol/protocol_internal.dart';");
} else {
writeln("import 'package:$packageName/protocol/protocol.dart';");
"import 'package:$packageName/src/protocol/protocol_internal.dart';");
List<ImpliedType> getClassesToEmit() {
var types = impliedTypes.values.where((ImpliedType type) {
var node = type.apiNode;
return node is TypeDefinition && node.isExternal;
types.sort((first, second) =>
return types;