add Pubspec.dependencyOverrides

Closes #34513
https://github.com/dart-lang/sdk/pull/34513

GitOrigin-RevId: 067b26fde3631f877a6a84453ab60702bd242142
Change-Id: I4eb6ec3567d6dabfbf0a5e69fe4c6094e3a22d04
Reviewed-on: https://dart-review.googlesource.com/75360
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index e4fde6c..d9050f4 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -288,9 +288,8 @@
     Source source = createSource(node.span.sourceUrl);
 
     // Cache error and location info for creating AnalysisErrorInfos
-    // Note that error columns are 1-based
     AnalysisError error = new AnalysisError(
-        source, node.span.start.column + 1, node.span.length, lintCode);
+        source, node.span.start.offset, node.span.length, lintCode);
     LineInfo lineInfo = new LineInfo.fromContent(source.contents.data);
 
     _locationInfo.add(new AnalysisErrorInfoImpl([error], lineInfo));
diff --git a/pkg/analyzer/lib/src/lint/pub.dart b/pkg/analyzer/lib/src/lint/pub.dart
index 8d12e13..1db39bf 100644
--- a/pkg/analyzer/lib/src/lint/pub.dart
+++ b/pkg/analyzer/lib/src/lint/pub.dart
@@ -122,6 +122,7 @@
   PSEntry get author;
   PSNodeList get authors;
   PSDependencyList get dependencies;
+  PSDependencyList get dependencyOverrides;
   PSEntry get description;
   PSDependencyList get devDependencies;
   PSEntry get documentation;
@@ -136,6 +137,8 @@
   T visitPackageAuthors(PSNodeList authors) => null;
   T visitPackageDependencies(PSDependencyList dependencies) => null;
   T visitPackageDependency(PSDependency dependency) => null;
+  T visitPackageDependencyOverrides(PSDependencyList dependencies) => null;
+  T visitPackageDependencyOverride(PSDependency dependency) => null;
   T visitPackageDescription(PSEntry description) => null;
   T visitPackageDevDependencies(PSDependencyList dependencies) => null;
   T visitPackageDevDependency(PSDependency dependency) => null;
@@ -318,6 +321,8 @@
   PSDependencyList dependencies;
   @override
   PSDependencyList devDependencies;
+  @override
+  PSDependencyList dependencyOverrides;
 
   _Pubspec(String src, {Uri sourceUrl}) {
     try {
@@ -352,11 +357,15 @@
     }
     if (dependencies != null) {
       visitor.visitPackageDependencies(dependencies);
-      dependencies.forEach((d) => visitor.visitPackageDependency(d));
+      dependencies.forEach(visitor.visitPackageDependency);
     }
     if (devDependencies != null) {
       visitor.visitPackageDevDependencies(devDependencies);
-      devDependencies.forEach((d) => visitor.visitPackageDevDependency(d));
+      devDependencies.forEach(visitor.visitPackageDevDependency);
+    }
+    if (dependencyOverrides != null) {
+      visitor.visitPackageDependencyOverrides(dependencyOverrides);
+      dependencyOverrides.forEach(visitor.visitPackageDependencyOverride);
     }
   }
 
@@ -371,6 +380,7 @@
     sb.writelin(homepage);
     sb.writelin(dependencies);
     sb.writelin(devDependencies);
+    sb.writelin(dependencyOverrides);
     return sb.toString();
   }
 
@@ -410,6 +420,9 @@
         case 'dev_dependencies':
           devDependencies = _processDependencies(key, v);
           break;
+        case 'dependency_overrides':
+          dependencyOverrides = _processDependencies(key, v);
+          break;
         case 'version':
           version = _processScalar(key, v);
           break;
diff --git a/pkg/analyzer/test/src/lint/pub_test.dart b/pkg/analyzer/test/src/lint/pub_test.dart
index 5a7f721..aa3412e 100644
--- a/pkg/analyzer/test/src/lint/pub_test.dart
+++ b/pkg/analyzer/test/src/lint/pub_test.dart
@@ -39,6 +39,8 @@
 dev_dependencies:
   markdown: '>=0.7.1+2 <0.8.0'
   unittest: '>=0.11.0 <0.12.0'
+dependency_overrides:
+  foo: 1.2.0
 """;
 
   Pubspec ps = new Pubspec.parse(src);
@@ -83,6 +85,10 @@
         {'markdown': '>=0.7.1+2 <0.8.0'}
       ]);
 
+      testDepListContains('dependency_overrides', ps.dependencyOverrides, [
+        {'foo': '1.2.0'}
+      ]);
+
       group('hosted', () {
         PSDependency dep =
             findDependency(ps.dependencies, name: 'transmogrify');