blob: 21e26391e512c6a37e7dea8e1e039ec8428d5202 [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);
visitor.visitApi();
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,
this.apiNode);
}
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';
camelNameParts.add(nameSuffix);
}
var camelName = camelJoin(camelNameParts);
impliedTypes[camelName] =
ImpliedType(camelName, humanReadableName, type, kind, apiNode);
}
@override
void visitNotification(Notification notification) {
storeType(notification.longEvent, 'params', notification.params,
'notificationParams', notification);
}
@override
void visitRefactoring(Refactoring refactoring) {
var camelKind = camelJoin(refactoring.kind.toLowerCase().split('_'));
storeType(camelKind, 'feedback', refactoring.feedback,
'refactoringFeedback', refactoring);
storeType(camelKind, 'options', refactoring.options, 'refactoringOptions',
refactoring);
}
@override
void visitRequest(Request request) {
storeType(
request.longMethod, 'params', request.params, 'requestParams', request);
storeType(
request.longMethod, 'result', request.result, 'requestResult', request);
}
@override
void visitTypeDefinition(TypeDefinition typeDefinition) {
storeType(typeDefinition.name, null, typeDefinition.type, 'typeDefinition',
typeDefinition);
}
}