blob: fb67058c22ee5bc5295cb7ee77b3918553eae592 [file] [log] [blame]
// 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.
/// Code for enumerating the set of types implied by the API.
import 'package:analyzer_utilities/tools.dart';
import 'api.dart';
Map<String, ImpliedType> computeImpliedTypes(Api api) {
var visitor = _ImpliedTypesVisitor(api);
return visitor.impliedTypes;
class ImpliedType {
final String camelName;
final String humanReadableName;
final TypeDecl type;
/// Kind of implied type this is. One of:
/// - 'requestParams'
/// - 'requestResult'
/// - 'notificationParams'
/// - 'refactoringFeedback'
/// - 'refactoringOptions'
/// - 'typeDefinition'
final String kind;
/// API node from which this type was inferred.
final ApiNode apiNode;
ImpliedType(this.camelName, this.humanReadableName, this.type, this.kind,
class _ImpliedTypesVisitor extends HierarchicalApiVisitor {
Map<String, ImpliedType> impliedTypes = <String, ImpliedType>{};
_ImpliedTypesVisitor(Api api) : super(api);
void storeType(String name, String nameSuffix, TypeDecl type, String kind,
ApiNode apiNode) {
var humanReadableName = name;
var camelNameParts = name.split('.');
if (nameSuffix != null) {
humanReadableName += ' $nameSuffix';
var camelName = camelJoin(camelNameParts);
impliedTypes[camelName] =
ImpliedType(camelName, humanReadableName, type, kind, apiNode);
void visitNotification(Notification notification) {
storeType(notification.longEvent, 'params', notification.params,
'notificationParams', notification);
void visitRefactoring(Refactoring refactoring) {
var camelKind = camelJoin(refactoring.kind.toLowerCase().split('_'));
storeType(camelKind, 'feedback',,
'refactoringFeedback', refactoring);
storeType(camelKind, 'options', refactoring.options, 'refactoringOptions',
void visitRequest(Request request) {
request.longMethod, 'params', request.params, 'requestParams', request);
request.longMethod, 'result', request.result, 'requestResult', request);
void visitTypeDefinition(TypeDefinition typeDefinition) {
storeType(, null, typeDefinition.type, 'typeDefinition',