Files
sdk/pkg/analyzer_plugin/tool/spec/codegen_protocol_common.dart
T
Sam Rawlins 73443c8603 DAS: Generated protocol 'enums' can be real enums
File sizes are reduced:

```
analysis_server_client's protocol_common.dart    - 132k -> 102k (-23%)
analysis_server_client's protocol_generated.dart - 453k -> 433k (- 4%)
analysis_server's        protocol_generated.dart - 528k -> 509k (- 3%)
analyzer_plugin's        protocol_common.dart    - 139k -> 108k (-22%)
```

Change-Id: I8018f1d09e053c9d3df340ba31cdb07cbd29acf7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/392842
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2024-11-07 17:27:18 +00:00

72 lines
2.6 KiB
Dart

// 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,
CodegenUriConverterKind uriConverterKind) =>
GeneratedFile(
'../analysis_server_client/lib/src/protocol/protocol_common.dart',
(String pkgPath) async {
var visitor = CodegenCommonVisitor(path.basename(pkgPath),
responseRequiresRequestTime, uriConverterKind, readApi(pkgPath),
forClient: true);
return visitor.collectCode(visitor.visitApi);
});
GeneratedFile pluginTarget(bool responseRequiresRequestTime,
CodegenUriConverterKind uriConverterKind) =>
GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) async {
var visitor = CodegenCommonVisitor(path.basename(pkgPath),
responseRequiresRequestTime, uriConverterKind, 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.
CodegenCommonVisitor(super.packageName, super.responseRequiresRequestTime,
super.uriConverterKind, super.api,
{this.forClient = false});
@override
void emitImports() {
writeln("import 'dart:convert' hide JsonDecoder;");
writeln();
if (forClient) {
writeln(
"import 'package:analysis_server_client/src/protocol/protocol_internal.dart';");
} else {
writeln(
"import 'package:$packageName/src/protocol/protocol_internal.dart';");
writeln(
"import 'package:$packageName/src/utilities/client_uri_converter.dart';");
}
writeln();
writeln('// ignore_for_file: flutter_style_todos');
}
@override
List<ImpliedType> getClassesToEmit() {
var types = impliedTypes.values.where((ImpliedType type) {
var node = type.apiNode;
return node is TypeDefinition && node.isExternal;
}).toList();
types.sort((first, second) =>
capitalize(first.camelName).compareTo(capitalize(second.camelName)));
return types;
}
}