blob: 724bb6fde77f981200a79222ebb557ae56644f68 [file] [log] [blame]
// Copyright (c) 2020, 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:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/completion/yaml/producer.dart';
import 'package:analysis_server/src/services/completion/yaml/yaml_completion_generator.dart';
import 'package:analysis_server/src/services/pub/pub_package_service.dart';
import 'package:analyzer/file_system/file_system.dart';
/// An object that represents the location of a package name.
class PubPackageNameProducer extends KeyValueProducer {
const PubPackageNameProducer();
@override
Producer producerForKey(String key) => PubPackageVersionProducer(key);
@override
Iterable<CompletionSuggestion> suggestions(
YamlCompletionRequest request) sync* {
final cachedPackages = request.pubPackageService?.cachedPackages;
if (cachedPackages != null) {
var relevance = cachedPackages.length;
yield* cachedPackages.map((package) =>
packageName('${package.packageName}: ', relevance: relevance--));
}
}
}
/// An object that represents the location of the version number for a pub
/// package.
class PubPackageVersionProducer extends Producer {
final String package;
const PubPackageVersionProducer(this.package);
@override
Iterable<CompletionSuggestion> suggestions(
YamlCompletionRequest request) sync* {
// TOOD(dantup): Consider supporting async completion requests so this
// could call packageDetails() (with a short timeout, and pub retries
// disabled). A user that explicitly invokes completion in the location
// of a version may be prepared to wait a short period for a web request
// to get completion versions (this is also the only way for non-LSP
// clients to get them, since there are no resolve calls).
//
// Supporting this will require making the completion async further up.
final details = request.pubPackageService?.cachedPackageDetails(package);
final version = details?.latestVersion;
if (version != null) {
yield identifier('^$version');
}
}
}
/// A completion generator that can produce completion suggestions for pubspec
/// files.
class PubspecGenerator extends YamlCompletionGenerator {
/// The producer representing the known valid structure of a pubspec file.
static const MapProducer pubspecProducer = MapProducer({
'name': EmptyProducer(),
'version': EmptyProducer(),
'description': EmptyProducer(),
'homepage': EmptyProducer(),
'repository': EmptyProducer(),
'issue_tracker': EmptyProducer(),
'documentation': EmptyProducer(),
'executables': EmptyProducer(),
'publish_to': EmptyProducer(),
'environment': MapProducer({
'flutter': EmptyProducer(),
'sdk': EmptyProducer(),
}),
'dependencies': PubPackageNameProducer(),
'dev_dependencies': PubPackageNameProducer(),
// TODO(brianwilkerson) Suggest names already listed under 'dependencies'
// and 'dev_dependencies'.
'dependency_overrides': EmptyProducer(),
'flutter': MapProducer({
'assets': ListProducer(FilePathProducer()),
'fonts': ListProducer(MapProducer({
'family': EmptyProducer(),
'fonts': ListProducer(MapProducer({
'asset': EmptyProducer(),
'style': EnumProducer(['italic', 'normal']),
'weight': EnumProducer(
['100', '200', '300', '400', '500', '600', '700', '800', '900']),
})),
})),
'generate': BooleanProducer(),
'module': MapProducer({
'androidX': BooleanProducer(),
'androidPackage': EmptyProducer(),
'iosBundleIdentifier': EmptyProducer(),
}),
'plugin': MapProducer({
'platforms': MapProducer({
'android': MapProducer({
'package': EmptyProducer(),
'pluginClass': EmptyProducer(),
}),
'ios': MapProducer({
'pluginClass': EmptyProducer(),
}),
'linux': MapProducer({
'dartPluginClass': EmptyProducer(),
'pluginClass': EmptyProducer(),
}),
'macos': MapProducer({
'dartPluginClass': EmptyProducer(),
'pluginClass': EmptyProducer(),
}),
'web': MapProducer({
'fileName': EmptyProducer(),
'pluginClass': EmptyProducer(),
}),
'windows': MapProducer({
'dartPluginClass': EmptyProducer(),
'pluginClass': EmptyProducer(),
}),
}),
}),
'uses-material-design': BooleanProducer(),
}),
});
/// Initialize a newly created suggestion generator for pubspec files.
PubspecGenerator(
ResourceProvider resourceProvider, PubPackageService pubPackageService)
: super(resourceProvider, pubPackageService);
@override
Producer get topLevelProducer => pubspecProducer;
}