Add 'content' to FileResult.

Change-Id: I8600aed3beb712b4da9e4a157b2e87398057a9cd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/346902
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
index 1605cc0..9f2e8b6 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
@@ -131,6 +131,7 @@
         var result = engine.ErrorsResultImpl(
           session: session,
           file: optionsFile,
+          content: content,
           uri: optionsFile.toUri(),
           lineInfo: lineInfo,
           isAugmentation: false,
@@ -248,6 +249,7 @@
         var result = engine.ErrorsResultImpl(
           session: session,
           file: pubspecFile,
+          content: content,
           uri: pubspecFile.toUri(),
           lineInfo: lineInfo,
           isAugmentation: false,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart
index 278ebbe..e88bad5 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart
@@ -133,6 +133,7 @@
     return engine.ErrorsResultImpl(
         session: session,
         file: file,
+        content: file.readAsStringSync(),
         uri: server.uriConverter.toClientUri(path),
         lineInfo: lineInfo,
         isAugmentation: false,
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index b57e7a4..dad66b0 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -84,6 +84,10 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FileResult implements SomeFileResult, AnalysisResult {
+  /// The latest read content of [file], the same that was used to compute
+  /// other properties of this result.
+  String get content;
+
   /// The file resource.
   File get file;
 
@@ -210,9 +214,6 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ParsedUnitResult
     implements SomeParsedUnitResult, AnalysisResultWithErrors {
-  /// The content of the file that was scanned and parsed.
-  String get content;
-
   /// The parsed, unresolved compilation unit for the [content].
   CompilationUnit get unit;
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index f91922e..b55e1e2 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1570,6 +1570,7 @@
     return ErrorsResultImpl(
       session: currentSession,
       file: file.resource,
+      content: file.content,
       lineInfo: file.lineInfo,
       uri: file.uri,
       isAugmentation: file.kind is AugmentationFileKind,
@@ -1622,7 +1623,6 @@
     return ResolvedUnitResultImpl(
       session: currentSession,
       fileState: file,
-      content: file.content,
       unit: unitResult.unit,
       errors: unitResult.errors,
     );
@@ -1835,6 +1835,7 @@
     return ErrorsResultImpl(
       session: currentSession,
       file: file.resource,
+      content: file.content,
       lineInfo: file.lineInfo,
       uri: file.uri,
       isAugmentation: file.kind is AugmentationFileKind,
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 3ab909c..ddc9aaf 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -69,9 +69,13 @@
   @override
   File file;
 
+  @override
+  final String content;
+
   ErrorsResultImpl({
     required this.session,
     required this.file,
+    required this.content,
     required this.uri,
     required this.lineInfo,
     required this.isAugmentation,
@@ -89,6 +93,9 @@
   final FileState fileState;
 
   @override
+  final String content;
+
+  @override
   final LineInfo lineInfo;
 
   @override
@@ -103,7 +110,8 @@
   FileResultImpl({
     required super.session,
     required this.fileState,
-  })  : lineInfo = fileState.lineInfo,
+  })  : content = fileState.content,
+        lineInfo = fileState.lineInfo,
         isAugmentation = fileState.kind is AugmentationFileKind,
         isLibrary = fileState.kind is LibraryFileKind,
         isPart = fileState.kind is PartFileKind;
@@ -173,9 +181,6 @@
 
 class ParsedUnitResultImpl extends FileResultImpl implements ParsedUnitResult {
   @override
-  final String content;
-
-  @override
   final CompilationUnit unit;
 
   @override
@@ -186,7 +191,7 @@
     required super.fileState,
     required this.unit,
     required this.errors,
-  }) : content = fileState.content;
+  });
 }
 
 class ParseStringResultImpl implements ParseStringResult {
@@ -310,9 +315,6 @@
 class ResolvedUnitResultImpl extends FileResultImpl
     implements ResolvedUnitResult {
   @override
-  final String content;
-
-  @override
   final CompilationUnit unit;
 
   @override
@@ -321,7 +323,6 @@
   ResolvedUnitResultImpl({
     required super.session,
     required super.fileState,
-    required this.content,
     required this.unit,
     required this.errors,
   });
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 2fdaaf5..f9277b8 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -353,6 +353,7 @@
       return ErrorsResultImpl(
         session: contextObjects!.analysisSession,
         file: file.resource,
+        content: file.content,
         uri: file.uri,
         lineInfo: file.lineInfo,
         isAugmentation: file.kind is AugmentationFileKind,
@@ -695,7 +696,6 @@
         return ResolvedUnitResultImpl(
           session: contextObjects!.analysisSession,
           fileState: file,
-          content: file.content,
           unit: fileResult.unit,
           errors: fileResult.errors,
         );
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index b00d8eb..1e3f3b6 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1884,11 +1884,14 @@
   }
 
   test_getFileSync_library() async {
-    final a = newFile('$testPackageLibPath/a.dart', '');
+    var content = 'class A {}';
+    final a = newFile('$testPackageLibPath/a.dart', content);
     final driver = driverFor(testFile);
     final result = driver.getFileSyncValid(a);
     expect(result.path, a.path);
     expect(result.uri.toString(), 'package:test/a.dart');
+    expect(result.content, content);
+    expect(result.isLibrary, isTrue);
     expect(result.isPart, isFalse);
   }
 
@@ -1899,11 +1902,14 @@
   }
 
   test_getFileSync_part() async {
-    final a = newFile('$testPackageLibPath/a.dart', 'part of lib;');
+    var content = 'part of lib;';
+    final a = newFile('$testPackageLibPath/a.dart', content);
     final driver = driverFor(testFile);
     final result = driver.getFileSyncValid(a);
     expect(result.path, a.path);
     expect(result.uri.toString(), 'package:test/a.dart');
+    expect(result.content, content);
+    expect(result.isLibrary, isFalse);
     expect(result.isPart, isTrue);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index ec4f9c5..0fdb6da 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -230,22 +230,28 @@
   }
 
   test_getFile_library() async {
-    var a = newFile('$testPackageLibPath/a.dart', '');
+    var content = 'class A {}';
+    var a = newFile('$testPackageLibPath/a.dart', content);
 
     var session = contextFor(testFile).currentSession;
     var file = session.getFileValid(a);
     expect(file.path, a.path);
     expect(file.uri.toString(), 'package:test/a.dart');
+    expect(file.content, content);
+    expect(file.isLibrary, isTrue);
     expect(file.isPart, isFalse);
   }
 
   test_getFile_part() async {
-    var a = newFile('$testPackageLibPath/a.dart', 'part of lib;');
+    var content = 'part of lib;';
+    var a = newFile('$testPackageLibPath/a.dart', content);
 
     var session = contextFor(testFile).currentSession;
     var file = session.getFileValid(a);
     expect(file.path, a.path);
     expect(file.uri.toString(), 'package:test/a.dart');
+    expect(file.content, content);
+    expect(file.isLibrary, isFalse);
     expect(file.isPart, isTrue);
   }
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 093d85d..517d2be 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -262,6 +262,7 @@
             ErrorsResultImpl(
               session: analysisDriver.currentSession,
               file: file,
+              content: content,
               uri: pathContext.toUri(path),
               lineInfo: lineInfo,
               isAugmentation: false,
@@ -306,6 +307,7 @@
                 ErrorsResultImpl(
                   session: analysisDriver.currentSession,
                   file: file,
+                  content: content,
                   uri: pathContext.toUri(path),
                   lineInfo: lineInfo,
                   isAugmentation: false,
@@ -333,6 +335,7 @@
               ErrorsResultImpl(
                 session: analysisDriver.currentSession,
                 file: file,
+                content: content,
                 uri: pathContext.toUri(path),
                 lineInfo: lineInfo,
                 isAugmentation: false,
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index f0c2809..8fb4c08 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -115,6 +115,7 @@
   return ErrorsResultImpl(
     session: _MockAnalysisSession(),
     file: file,
+    content: '<mock>',
     uri: uri,
     lineInfo: lineInfo,
     isAugmentation: false,