[analysis_server] Make CompilationUnitElement.lineInfo non-nullable

Change-Id: Ia42e2a2fd153b5af167588b9d4d473d1f998a67b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235880
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 9b829c7..7f8d2e5 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart' as engine;
 import 'package:analyzer/error/error.dart' as engine;
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/generated/source.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -299,25 +298,16 @@
 /// Creates a new [Location].
 Location _locationForArgs(
     engine.CompilationUnitElement unitElement, engine.SourceRange range) {
-  var startLine = 0;
-  var startColumn = 0;
-  var endLine = 0;
-  var endColumn = 0;
-  try {
-    var lineInfo = unitElement.lineInfo;
-    if (lineInfo != null) {
-      var startLocation = lineInfo.getLocation(range.offset);
-      startLine = startLocation.lineNumber;
-      startColumn = startLocation.columnNumber;
+  var lineInfo = unitElement.lineInfo;
 
-      var endLocation = lineInfo.getLocation(range.end);
-      endLine = endLocation.lineNumber;
-      endColumn = endLocation.columnNumber;
-    }
-  } on AnalysisException {
-    // TODO(brianwilkerson) It doesn't look like the code in the try block
-    //  should be able to throw an exception. Try removing the try statement.
-  }
+  var startLocation = lineInfo.getLocation(range.offset);
+  var endLocation = lineInfo.getLocation(range.end);
+
+  var startLine = startLocation.lineNumber;
+  var startColumn = startLocation.columnNumber;
+  var endLine = endLocation.lineNumber;
+  var endColumn = endLocation.columnNumber;
+
   return Location(unitElement.source.fullName, range.offset, range.length,
       startLine, startColumn,
       endLine: endLine, endColumn: endColumn);
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 5692f14..ccc51f6 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -8,6 +8,8 @@
 * Deprecated `AnalysisDriver.getParsedLibraryByUri`, use `getParsedLibraryByUri2` instead.
 * Deprecated `AnalysisDriver.parseFileSync`, use `parseFile` instead.
 * Deprecated `astFactory`, clients should not create AST nodes manually.
+* Changed `CompilationUnit.lineInfo` to be non-nullable.
+* Changed `CompilationUnitElement.lineInfo` to be non-nullable.
 
 ## 3.3.1
 * Report HintCode.OVERRIDE_ON_NON_OVERRIDING_xyz on enum.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index e0478a0..9c73621 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -413,8 +413,8 @@
   @Deprecated('Not useful for clients')
   bool get hasLoadLibraryFunction;
 
-  /// Return the [LineInfo] for the [source], or `null` if not computed yet.
-  LineInfo? get lineInfo;
+  /// Return the [LineInfo] for the [source].
+  LineInfo get lineInfo;
 
   /// Return a list containing all of the mixins contained in this compilation
   /// unit.
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 6df7913..988d60f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -259,7 +259,7 @@
           try {
             unitElement.accept(
               _FunctionElementVisitor((element) {
-                addDeclaration(unitElement.lineInfo!, element);
+                addDeclaration(unitElement.lineInfo, element);
               }),
             );
           } on _MaxNumberOfDeclarationsError {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 060903e..0f0720a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -974,7 +974,7 @@
   late Source source;
 
   @override
-  LineInfo? lineInfo;
+  late LineInfo lineInfo;
 
   /// The source of the library containing this compilation unit.
   ///
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index cd89eef..5492b85 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -91,12 +91,12 @@
       classTypeAlias(typeName, objectType, parameterNames);
 
   static CompilationUnitElementImpl compilationUnit(String fileName,
-      [Source? librarySource]) {
+      [Source? librarySource, LineInfo? lineInfo]) {
     Source source = NonExistingSource(fileName, toUri(fileName));
     CompilationUnitElementImpl unit = CompilationUnitElementImpl();
     unit.source = source;
-    librarySource ??= source;
-    unit.librarySource = librarySource;
+    unit.librarySource = librarySource ?? source;
+    unit.lineInfo = lineInfo ?? LineInfo([0]);
     return unit;
   }
 
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index f289112..38630e9 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -872,6 +873,7 @@
     var asyncUnit = CompilationUnitElementImpl();
     var asyncSource = analysisContext.sourceFactory.forUri('dart:async')!;
     asyncUnit.librarySource = asyncUnit.source = asyncSource;
+    asyncUnit.lineInfo = LineInfo([0]);
     asyncLibrary.definingCompilationUnit = asyncUnit;
 
     asyncUnit.classes = <ClassElement>[
@@ -890,6 +892,7 @@
 
     var coreSource = analysisContext.sourceFactory.forUri('dart:core')!;
     coreUnit.librarySource = coreUnit.source = coreSource;
+    coreUnit.lineInfo = LineInfo([0]);
 
     coreUnit.classes = <ClassElement>[
       boolElement,
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index 8c01ffe..3f5b739 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -384,6 +384,7 @@
     var definingUnit = CompilationUnitElementImpl();
     definingUnit.source = source;
     definingUnit.librarySource = source;
+    definingUnit.lineInfo = LineInfo([0]);
 
     definingUnit.enclosingElement = library;
     library.definingCompilationUnit = definingUnit;
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 575cd5b..32445d5 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart' as analyzer;
 import 'package:analyzer/error/error.dart' as analyzer;
-import 'package:analyzer/exception/exception.dart' as analyzer;
 import 'package:analyzer/source/error_processor.dart' as analyzer;
 import 'package:analyzer/src/generated/engine.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart' as analyzer;
@@ -386,27 +385,18 @@
   plugin.Location? _locationForArgs(
       analyzer.CompilationUnitElement? unitElement,
       analyzer.SourceRange range) {
-    var startLine = 0;
-    var startColumn = 0;
-    var endLine = 0;
-    var endColumn = 0;
-
     if (unitElement == null) {
       return null;
     }
-    try {
-      var lineInfo = unitElement.lineInfo;
-      if (lineInfo != null) {
-        var offsetLocation = lineInfo.getLocation(range.offset);
-        startLine = offsetLocation.lineNumber;
-        startColumn = offsetLocation.columnNumber;
-        var endLocation = lineInfo.getLocation(range.offset + range.length);
-        endLine = endLocation.lineNumber;
-        endColumn = endLocation.columnNumber;
-      }
-    } on analyzer.AnalysisException {
-      // Ignore exceptions
-    }
+
+    var lineInfo = unitElement.lineInfo;
+    var offsetLocation = lineInfo.getLocation(range.offset);
+    var endLocation = lineInfo.getLocation(range.offset + range.length);
+    var startLine = offsetLocation.lineNumber;
+    var startColumn = offsetLocation.columnNumber;
+    var endLine = endLocation.lineNumber;
+    var endColumn = endLocation.columnNumber;
+
     return plugin.Location(unitElement.source.fullName, range.offset,
         range.length, startLine, startColumn,
         endLine: endLine, endColumn: endColumn);
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index afb9bd9..4326006 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -48,7 +48,7 @@
     var path = unitElement.source.fullName;
     var offset = element.nameOffset;
 
-    var location = unitElement.lineInfo!.getLocation(offset);
+    var location = unitElement.lineInfo.getLocation(offset);
     return CodeReference(path, offset, location.lineNumber,
         location.columnNumber, _computeElementFullName(element));
   }