From e1414089cf5b18b57f2198012bb7494af2baf6a1 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Fri, 12 Mar 2021 16:50:37 +0000 Subject: [PATCH] Analyzer: avoid dynamic calls while examining Yaml Change-Id: If569c74bad1d3762deb4cc74ea617d291ec33619 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/190727 Commit-Queue: Samuel Rawlins Reviewed-by: Brian Wilkerson Reviewed-by: Konstantin Shcheglov --- pkg/analyzer/lib/src/pubspec/pubspec_validator.dart | 2 +- pkg/analyzer/lib/src/util/yaml.dart | 6 +++++- pkg/analyzer/lib/src/workspace/package_build.dart | 2 +- pkg/analyzer/tool/experiments/generate.dart | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart index 36d2133b2d8..140cbd21ac5 100644 --- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart +++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart @@ -157,7 +157,7 @@ class PubspecValidator { } for (var dependency in declaredDevDependencies.entries) { - var packageName = dependency.key; + var packageName = dependency.key as YamlNode; if (declaredDependencies.containsKey(packageName)) { _reportErrorForNode(reporter, packageName, PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY, [packageName.value]); diff --git a/pkg/analyzer/lib/src/util/yaml.dart b/pkg/analyzer/lib/src/util/yaml.dart index 1696085f8d0..98f91e80b82 100644 --- a/pkg/analyzer/lib/src/util/yaml.dart +++ b/pkg/analyzer/lib/src/util/yaml.dart @@ -118,8 +118,12 @@ class Merger { merged[k] = v; }); m2.nodes.forEach((k, v) { + // TODO(srawlins): The key should always be a [YamlNode], but is not (see + // https://pub.dev/documentation/yaml/latest/yaml/YamlMap/nodes.html). + // We could write an extension method which does this cast for us. + var value = (k as YamlNode).value; var mergedKey = - merged.keys.firstWhere((key) => key.value == k.value, orElse: () => k) + merged.keys.firstWhere((key) => key.value == value, orElse: () => k) as YamlScalar; var o1 = merged[mergedKey]; if (o1 != null) { diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart index 09a3446f987..8f09c11d9f5 100644 --- a/pkg/analyzer/lib/src/workspace/package_build.dart +++ b/pkg/analyzer/lib/src/workspace/package_build.dart @@ -287,7 +287,7 @@ class PackageBuildWorkspace extends Workspace { // pubspec, to know the package name that package:build will assume. if (dartToolBuildDir.exists && pubspec.exists) { try { - final yaml = loadYaml(pubspec.readAsStringSync()); + final yaml = loadYaml(pubspec.readAsStringSync()) as YamlMap; final packageName = yaml['name'] as String; final generatedRootPath = provider.pathContext .joinAll([folder.path, ..._generatedPathParts]); diff --git a/pkg/analyzer/tool/experiments/generate.dart b/pkg/analyzer/tool/experiments/generate.dart index f57961d9dc2..3aabe6107fd 100644 --- a/pkg/analyzer/tool/experiments/generate.dart +++ b/pkg/analyzer/tool/experiments/generate.dart @@ -68,7 +68,7 @@ part of 'experiments.dart'; features = {}; Map yamlFeatures = experimentsYaml['features']; for (MapEntry entry in yamlFeatures.entries) { - String category = entry.value['category'] ?? 'language'; + String category = (entry.value as YamlMap)['category'] ?? 'language'; if (category != "language") { // Skip a feature with a category that's not language. In the future // possibly allow e.g. 'analyzer' etc.