Generate common types into a separate library

R=danrubel@google.com

Review-Url: https://codereview.chromium.org/2880443006 .
This commit is contained in:
Brian Wilkerson 2017-05-13 08:12:13 -07:00
parent 28e742a31c
commit 3085734ef6
36 changed files with 5611 additions and 5463 deletions

View file

@ -11,6 +11,7 @@ import 'package:analysis_server/src/plugin/result_converter.dart';
import 'package:analysis_server/src/plugin/result_merger.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;

View file

@ -15,6 +15,7 @@ import 'package:analyzer/src/generated/gn.dart';
import 'package:analyzer/src/util/glob.dart';
import 'package:analyzer_plugin/channel/channel.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_constants.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/src/channel/isolate_channel.dart';

View file

@ -4,6 +4,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart' as server;
import 'package:analysis_server/src/protocol/protocol_internal.dart' as server;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
/**

View file

@ -4,6 +4,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart' as server;
import 'package:analysis_server/src/protocol/protocol_internal.dart' as server;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
/**

View file

@ -6,6 +6,7 @@ import 'dart:collection';
import 'package:analysis_server/protocol/protocol_generated.dart'
hide AnalysisErrorFixes;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:meta/meta.dart';

View file

@ -14,6 +14,7 @@ import 'package:analyzer/dart/ast/standard_resolution_map.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

View file

@ -14,6 +14,7 @@ import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
import 'package:analysis_server/src/services/completion/dart/contribution_sorter.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';

View file

@ -9,6 +9,7 @@ import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart' as plugin;
import 'package:plugin/manager.dart';

View file

@ -9,6 +9,7 @@ import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart' as plugin;
import 'package:plugin/manager.dart';

View file

@ -8,6 +8,7 @@ import 'package:analysis_server/src/channel/channel.dart';
import 'package:analysis_server/src/plugin/notification_manager.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';

View file

@ -13,6 +13,7 @@ import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
import 'package:analyzer_plugin/channel/channel.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart'
hide ContextRoot;
import 'package:path/path.dart' as path;

View file

@ -4,6 +4,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart' as server;
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;

View file

@ -5,6 +5,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart' as server;
import 'package:analysis_server/src/plugin/request_converter.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart' as server;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

View file

@ -5,6 +5,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart' as server;
import 'package:analysis_server/src/plugin/result_converter.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart' as server;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

View file

@ -4,6 +4,7 @@
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/plugin/result_merger.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

View file

@ -12,6 +12,7 @@ import 'package:analyzer/src/dart/analysis/file_state.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/channel/channel.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_constants.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart';

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -6,6 +6,7 @@ import 'dart:collection';
import 'dart:convert' hide JsonDecoder;
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
final Map<String, RefactoringKind> REQUEST_ID_REFACTORING_KINDS =

View file

@ -5,7 +5,7 @@
import 'dart:async';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
/**

View file

@ -13,7 +13,7 @@ import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart'
import 'package:analyzer_plugin/protocol/protocol_common.dart'
hide Element, ElementKind;
import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/src/utilities/string_utilities.dart';

View file

@ -10,6 +10,7 @@ import 'package:analyzer/source/error_processor.dart' as analyzer;
import 'package:analyzer/src/generated/engine.dart' as analyzer;
import 'package:analyzer/src/generated/source.dart' as analyzer;
import 'package:analyzer/src/generated/utilities_dart.dart' as analyzer;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;

View file

@ -5,7 +5,7 @@
import 'dart:async';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
import 'package:meta/meta.dart';

View file

@ -17,6 +17,7 @@ import 'package:test/test.dart';
import 'integration_tests.dart';
import 'protocol_matchers.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/**
* Convenience methods for running integration tests

View file

@ -7,6 +7,7 @@ import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:path/path.dart';
import 'package:test/test.dart';

View file

@ -8,6 +8,7 @@ import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer_plugin/plugin/plugin.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:path/src/context.dart';
import 'package:test/test.dart';

View file

@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:test/test.dart';

View file

@ -14,7 +14,7 @@ import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/testing/test_type_provider.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';

View file

@ -13,6 +13,7 @@ import 'package:analyzer/src/error/codes.dart' as analyzer;
import 'package:analyzer/src/generated/engine.dart' as analyzer;
import 'package:analyzer/src/generated/source.dart' as analyzer;
import 'package:analyzer/src/generated/utilities_dart.dart' as analyzer;
import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_plugin/utilities/analyzer_converter.dart';

View file

@ -358,6 +358,8 @@ class TypeDefinition extends ApiNode {
final String name;
final TypeDecl type;
bool isExternal = false;
TypeDefinition(this.name, this.type, dom.Element html,
{bool experimental, bool deprecated})
: super(html, experimental, deprecated);
@ -492,6 +494,8 @@ class TypeReference extends TypeDecl {
class Types extends ApiNode with IterableMixin<TypeDefinition> {
final Map<String, TypeDefinition> types;
List<String> importUris = <String>[];
Types(this.types, dom.Element html, {bool experimental})
: super(html, experimental, false);

View file

@ -119,12 +119,9 @@ class CodegenProtocolVisitor extends DartCodegenVisitor with CodeGenerator {
}
/**
* Translate each type implied by the API to a class.
* Translate each of the given [types] implied by the API to a class.
*/
void emitClasses() {
List<ImpliedType> types = impliedTypes.values.toList();
types.sort((first, second) =>
capitalize(first.camelName).compareTo(capitalize(second.camelName)));
void emitClasses(List<ImpliedType> types) {
for (ImpliedType impliedType in types) {
TypeDecl type = impliedType.type;
String dartTypeName = capitalize(impliedType.camelName);
@ -395,6 +392,20 @@ class CodegenProtocolVisitor extends DartCodegenVisitor with CodeGenerator {
writeln('}');
}
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';");
for (String uri in api.types.importUris) {
write("import '");
write(uri);
writeln("';");
}
}
/**
* Emit the class to encapsulate an object type.
*/
@ -1051,6 +1062,19 @@ class CodegenProtocolVisitor extends DartCodegenVisitor with CodeGenerator {
}
}
/**
* Return a list of the classes to be emitted.
*/
List<ImpliedType> getClassesToEmit() {
List<ImpliedType> 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;
}
/**
* True if the constructor argument for the given field should be optional.
*/
@ -1131,13 +1155,8 @@ class CodegenProtocolVisitor extends DartCodegenVisitor with CodeGenerator {
visitApi() {
outputHeader(year: '2017');
writeln();
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';");
emitClasses();
emitImports();
emitClasses(getClassesToEmit());
}
}

View file

@ -111,6 +111,11 @@ class CodegenInttestMethodsVisitor extends DartCodegenVisitor
writeln();
writeln("import 'integration_tests.dart';");
writeln("import 'protocol_matchers.dart';");
for (String uri in api.types.importUris) {
write("import '");
write(uri);
writeln("';");
}
writeln();
writeln('/**');
writeln(' * Convenience methods for running integration tests');

View file

@ -0,0 +1,53 @@
// 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/src/codegen/tools.dart';
import 'package:front_end/src/codegen/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';
final GeneratedFile target =
new GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) {
CodegenCommonVisitor visitor =
new CodegenCommonVisitor(path.basename(pkgPath), 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, Api api) : super(packageName, 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<ImpliedType> getClassesToEmit() {
List<ImpliedType> 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;
}
}

View file

@ -572,27 +572,35 @@ class ApiReader {
checkName(html, 'types');
String context = 'types';
checkAttributes(html, [], context);
Map<String, TypeDefinition> types = <String, TypeDefinition>{};
List<String> importUris = <String>[];
Map<String, TypeDefinition> typeMap = <String, TypeDefinition>{};
List<dom.Element> childElements = <dom.Element>[];
recurse(html, context, {
'include': (dom.Element child) {
String importUri = child.attributes['import'];
if (importUri != null) {
importUris.add(importUri);
}
String relativePath = child.attributes['path'];
String path = normalize(join(dirname(filePath), relativePath));
ApiReader reader = new ApiReader(path);
Api api = reader.readApi();
for (TypeDefinition typeDefinition in api.types) {
typeDefinition.isExternal = true;
childElements.add(typeDefinition.html);
types[typeDefinition.name] = typeDefinition;
typeMap[typeDefinition.name] = typeDefinition;
}
},
'type': (dom.Element child) {
TypeDefinition typeDefinition = typeDefinitionFromHtml(child);
types[typeDefinition.name] = typeDefinition;
typeMap[typeDefinition.name] = typeDefinition;
}
});
for (dom.Element element in childElements) {
html.append(element);
}
return new Types(types, html);
Types types = new Types(typeMap, html);
types.importUris.addAll(importUris);
return types;
}
}

View file

@ -10,6 +10,7 @@ import 'package:path/path.dart';
import 'codegen_dart_protocol.dart' as codegen_dart_protocol;
import 'codegen_inttest_methods.dart' as codegen_inttest_methods;
import 'codegen_matchers.dart' as codegen_matchers;
import 'codegen_protocol_common.dart' as codegen_protocol_common;
import 'codegen_protocol_constants.dart' as codegen_protocol_constants;
import 'to_html.dart' as to_html;
@ -30,6 +31,7 @@ List<GeneratedContent> get allTargets {
targets.add(codegen_dart_protocol.target);
targets.add(codegen_inttest_methods.target);
targets.add(codegen_matchers.target);
targets.add(codegen_protocol_common.target);
targets.add(codegen_protocol_constants.target);
targets.add(to_html.target);
return targets;

View file

@ -793,7 +793,8 @@
This section contains descriptions of the data types referenced in the APIs
of the various domains.
</p>
<include path="common_types_spec.html"></include>
<include path="common_types_spec.html"
import="package:analyzer_plugin/protocol/protocol_common.dart"></include>
<type name="AnalysisErrorFixes">
<p>
A list of fixes associated with a specific error
@ -1216,34 +1217,44 @@
</p>
<feedback>
<field name="coveringExpressionOffsets" optional="true">
<list><ref>int</ref></list>
<list>
<ref>int</ref>
</list>
<p>
The offsets of the expressions that cover the specified selection,
from the down most to the up most.
</p>
</field>
<field name="coveringExpressionLengths" optional="true">
<list><ref>int</ref></list>
<list>
<ref>int</ref>
</list>
<p>
The lengths of the expressions that cover the specified selection,
from the down most to the up most.
</p>
</field>
<field name="names">
<list><ref>String</ref></list>
<list>
<ref>String</ref>
</list>
<p>
The proposed names for the local variable.
</p>
</field>
<field name="offsets">
<list><ref>int</ref></list>
<list>
<ref>int</ref>
</list>
<p>
The offsets of the expressions that would be replaced by a reference
to the variable.
</p>
</field>
<field name="lengths">
<list><ref>int</ref></list>
<list>
<ref>int</ref>
</list>
<p>
The lengths of the expressions that would be replaced by a reference
to the variable. The lengths correspond to the offsets. In other
@ -1303,7 +1314,9 @@
</p>
</field>
<field name="names">
<list><ref>String</ref></list>
<list>
<ref>String</ref>
</list>
<p>
The proposed names for the method.
</p>
@ -1315,20 +1328,26 @@
</p>
</field>
<field name="parameters">
<list><ref>RefactoringMethodParameter</ref></list>
<list>
<ref>RefactoringMethodParameter</ref>
</list>
<p>
The proposed parameters for the method.
</p>
</field>
<field name="offsets">
<list><ref>int</ref></list>
<list>
<ref>int</ref>
</list>
<p>
The offsets of the expressions or statements that would be replaced by
an invocation of the method.
</p>
</field>
<field name="lengths">
<list><ref>int</ref></list>
<list>
<ref>int</ref>
</list>
<p>
The lengths of the expressions or statements that would be replaced by
an invocation of the method. The lengths correspond to the offsets. In
@ -1359,7 +1378,9 @@
</p>
</field>
<field name="parameters">
<list><ref>RefactoringMethodParameter</ref></list>
<list>
<ref>RefactoringMethodParameter</ref>
</list>
<p>
The parameters that should be defined for the method.
</p>