Store and resynthesize codeOffset/codeLength for functions and methods.

R=brianwilkerson@google.com

Change-Id: I2106fb407b7488eede8c06112f1ac582b92d6af5
Reviewed-on: https://dart-review.googlesource.com/69400
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index 7015b75..e75781d 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -1768,11 +1768,6 @@
 
   @failingTest
   @override
-  test_bad_async_targetIsSync_doesNotReturnFuture() =>
-      super.test_bad_async_targetIsSync_doesNotReturnFuture();
-
-  @failingTest
-  @override
   test_noArgument_named_hasDefault() =>
       super.test_noArgument_named_hasDefault();
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 3fc6b16..9046642 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -620,11 +620,6 @@
 
   @failingTest
   @override
-  test_checkFinalConditions_shadowedBy_MethodElement() =>
-      super.test_checkFinalConditions_shadowedBy_MethodElement();
-
-  @failingTest
-  @override
   test_checkFinalConditions_shadowsInSubClass_importedLib_hideCombinator() =>
       callFailingTest(super
           .test_checkFinalConditions_shadowsInSubClass_importedLib_hideCombinator());
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index b717bc4..9572717 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4236,6 +4236,10 @@
 
   @override
   int get codeLength {
+    if (_kernel != null) {
+      var metadata = AnalyzerMetadata.forNode(_kernel);
+      return metadata?.codeLength;
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.codeRange?.length;
     }
@@ -4244,6 +4248,10 @@
 
   @override
   int get codeOffset {
+    if (_kernel != null) {
+      var metadata = AnalyzerMetadata.forNode(_kernel);
+      return metadata?.codeOffset;
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.codeRange?.offset;
     }
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 52f448b..fe2e68b 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -1998,16 +1998,6 @@
 
   @failingTest
   @override
-  test_searchMemberReferences_qualified_unresolved() =>
-      super.test_searchMemberReferences_qualified_unresolved();
-
-  @failingTest
-  @override
-  test_searchMemberReferences_unqualified_unresolved() =>
-      super.test_searchMemberReferences_unqualified_unresolved();
-
-  @failingTest
-  @override
   test_searchReferences_ClassElement_definedInSdk_declarationSite() =>
       super.test_searchReferences_ClassElement_definedInSdk_declarationSite();
 
@@ -2028,131 +2018,21 @@
 
   @failingTest
   @override
-  test_searchReferences_ConstructorElement_default() =>
-      super.test_searchReferences_ConstructorElement_default();
-
-  @failingTest
-  @override
-  test_searchReferences_ConstructorElement_default_otherFile() =>
-      super.test_searchReferences_ConstructorElement_default_otherFile();
-
-  @failingTest
-  @override
-  test_searchReferences_ConstructorElement_named() =>
-      super.test_searchReferences_ConstructorElement_named();
-
-  @failingTest
-  @override
-  test_searchReferences_ConstructorElement_synthetic() =>
-      super.test_searchReferences_ConstructorElement_synthetic();
-
-  @failingTest
-  @override
   test_searchReferences_FieldElement() =>
       super.test_searchReferences_FieldElement();
 
   @failingTest
   @override
-  test_searchReferences_FieldElement_ofEnum() =>
-      super.test_searchReferences_FieldElement_ofEnum();
-
-  @failingTest
-  @override
-  test_searchReferences_FieldElement_synthetic() =>
-      super.test_searchReferences_FieldElement_synthetic();
-
-  @failingTest
-  @override
-  test_searchReferences_FunctionElement() =>
-      super.test_searchReferences_FunctionElement();
-
-  @failingTest
-  @override
-  test_searchReferences_FunctionElement_local() =>
-      super.test_searchReferences_FunctionElement_local();
-
-  @failingTest
-  @override
-  test_searchReferences_ImportElement_noPrefix() =>
-      super.test_searchReferences_ImportElement_noPrefix();
-
-  @failingTest
-  @override
-  test_searchReferences_ImportElement_noPrefix_inPackage() =>
-      super.test_searchReferences_ImportElement_noPrefix_inPackage();
-
-  @failingTest
-  @override
-  test_searchReferences_ImportElement_withPrefix() =>
-      super.test_searchReferences_ImportElement_withPrefix();
-
-  @failingTest
-  @override
-  test_searchReferences_ImportElement_withPrefix_forMultipleImports() =>
-      super.test_searchReferences_ImportElement_withPrefix_forMultipleImports();
-
-  @failingTest
-  @override
   test_searchReferences_LabelElement() =>
       super.test_searchReferences_LabelElement();
 
   @failingTest
   @override
-  test_searchReferences_LocalVariableElement() =>
-      super.test_searchReferences_LocalVariableElement();
-
-  @failingTest
-  @override
-  test_searchReferences_LocalVariableElement_inForEachLoop() =>
-      super.test_searchReferences_LocalVariableElement_inForEachLoop();
-
-  @failingTest
-  @override
-  test_searchReferences_LocalVariableElement_inPackage() =>
-      super.test_searchReferences_LocalVariableElement_inPackage();
-
-  @failingTest
-  @override
-  test_searchReferences_MethodElement() =>
-      super.test_searchReferences_MethodElement();
-
-  @failingTest
-  @override
-  test_searchReferences_MethodMember() =>
-      super.test_searchReferences_MethodMember();
-
-  @failingTest
-  @override
-  test_searchReferences_ParameterElement_named() =>
-      super.test_searchReferences_ParameterElement_named();
-
-  @failingTest
-  @override
   test_searchReferences_ParameterElement_ofConstructor() =>
       super.test_searchReferences_ParameterElement_ofConstructor();
 
   @failingTest
   @override
-  test_searchReferences_ParameterElement_ofLocalFunction() =>
-      super.test_searchReferences_ParameterElement_ofLocalFunction();
-
-  @failingTest
-  @override
-  test_searchReferences_ParameterElement_ofMethod() =>
-      super.test_searchReferences_ParameterElement_ofMethod();
-
-  @failingTest
-  @override
-  test_searchReferences_ParameterElement_ofTopLevelFunction() =>
-      super.test_searchReferences_ParameterElement_ofTopLevelFunction();
-
-  @failingTest
-  @override
-  test_searchReferences_ParameterElement_optionalPositional() =>
-      super.test_searchReferences_ParameterElement_optionalPositional();
-
-  @failingTest
-  @override
   test_searchReferences_PrefixElement() =>
       super.test_searchReferences_PrefixElement();
 
@@ -2178,16 +2058,6 @@
 
   @failingTest
   @override
-  test_searchReferences_PropertyAccessorElement_getter() =>
-      super.test_searchReferences_PropertyAccessorElement_getter();
-
-  @failingTest
-  @override
-  test_searchReferences_PropertyAccessorElement_setter() =>
-      super.test_searchReferences_PropertyAccessorElement_setter();
-
-  @failingTest
-  @override
   test_searchReferences_TopLevelVariableElement() =>
       super.test_searchReferences_TopLevelVariableElement();
 
@@ -2198,11 +2068,6 @@
 
   @failingTest
   @override
-  test_searchReferences_TypeParameterElement_ofLocalFunction() =>
-      super.test_searchReferences_TypeParameterElement_ofLocalFunction();
-
-  @failingTest
-  @override
   test_searchReferences_TypeParameterElement_ofMethod() =>
       super.test_searchReferences_TypeParameterElement_ofMethod();
 
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index d734785..a0a25fc 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -180,17 +180,9 @@
     writeIf(e.isMixinApplication, 'alias ');
 
     writeName(e);
+    writeCodeRange(e);
     writeTypeParameterElements(e.typeParameters);
 
-    if (withCodeRanges) {
-      var elementImpl = e as ElementImpl;
-      buffer.write('/*codeOffset=');
-      buffer.write(elementImpl.codeOffset);
-      buffer.write(', codeLength=');
-      buffer.write(elementImpl.codeLength);
-      buffer.write('*/');
-    }
-
     if (e.supertype != null && e.supertype.displayName != 'Object' ||
         e.mixins.isNotEmpty) {
       buffer.write(' extends ');
@@ -223,6 +215,17 @@
     buffer.writeln('}');
   }
 
+  void writeCodeRange(Element e) {
+    if (withCodeRanges) {
+      var elementImpl = e as ElementImpl;
+      buffer.write('/*codeOffset=');
+      buffer.write(elementImpl.codeOffset);
+      buffer.write(', codeLength=');
+      buffer.write(elementImpl.codeLength);
+      buffer.write('*/');
+    }
+  }
+
   void writeConstructorElement(ConstructorElement e) {
     writeDocumentation(e, '  ');
     writeMetadata(e, '  ', '\n');
@@ -267,9 +270,13 @@
   }
 
   void writeDocumentation(Element e, [String prefix = '']) {
-    if (e.documentationComment != null) {
+    String comment = e.documentationComment;
+    if (comment != null) {
+      if (comment.startsWith('///')) {
+        comment = comment.split('\n').join('\n$prefix');
+      }
       buffer.write(prefix);
-      buffer.writeln(e.documentationComment);
+      buffer.writeln(comment);
     }
   }
 
@@ -475,6 +482,7 @@
     writeType2(e.returnType);
 
     writeName(e);
+    writeCodeRange(e);
 
     writeTypeParameterElements(e.typeParameters);
     writeParameterElements(e.parameters);
@@ -598,6 +606,7 @@
     writeType2(e.returnType);
 
     writeName(e);
+    writeCodeRange(e);
 
     writeTypeParameterElements(e.typeParameters);
     writeParameterElements(e.parameters);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 194adcf..9aa0713 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -2672,6 +2672,112 @@
         withConstElements: false);
   }
 
+  test_codeRange_function() async {
+    var library = await checkLibrary('''
+void raw() {}
+
+/// Comment 1.
+/// Comment 2.
+void hasDocComment() {}
+
+@Object()
+void hasAnnotation() {}
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+void annotationThenComment() {}
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+void commentThenAnnotation() {}
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+void commentAroundAnnotation() {}
+''');
+    checkElementText(
+        library,
+        r'''
+void raw/*codeOffset=0, codeLength=13*/() {}
+/// Comment 1.
+/// Comment 2.
+void hasDocComment/*codeOffset=15, codeLength=53*/() {}
+@Object()
+void hasAnnotation/*codeOffset=70, codeLength=33*/() {}
+/// Comment 1.
+/// Comment 2.
+@Object()
+void annotationThenComment/*codeOffset=105, codeLength=71*/() {}
+/// Comment 1.
+/// Comment 2.
+@Object()
+void commentThenAnnotation/*codeOffset=178, codeLength=71*/() {}
+/// Comment 2.
+@Object()
+void commentAroundAnnotation/*codeOffset=266, codeLength=58*/() {}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
+  test_codeRange_method() async {
+    var library = await checkLibrary('''
+class C {
+  void raw() {}
+  
+  /// Comment 1.
+  /// Comment 2.
+  void hasDocComment() {}
+  
+  @Object()
+  void hasAnnotation() {}
+  
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  void annotationThenComment() {}
+  
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  void commentThenAnnotation() {}
+  
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  void commentAroundAnnotation() {}
+}
+''');
+    checkElementText(
+        library,
+        r'''
+class C/*codeOffset=0, codeLength=382*/ {
+  void raw/*codeOffset=12, codeLength=13*/() {}
+  /// Comment 1.
+  /// Comment 2.
+  void hasDocComment/*codeOffset=31, codeLength=57*/() {}
+  @Object()
+  void hasAnnotation/*codeOffset=94, codeLength=35*/() {}
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  void annotationThenComment/*codeOffset=135, codeLength=77*/() {}
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  void commentThenAnnotation/*codeOffset=218, codeLength=77*/() {}
+  /// Comment 2.
+  @Object()
+  void commentAroundAnnotation/*codeOffset=318, codeLength=62*/() {}
+}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
   test_const_constructor_inferred_args() async {
     if (!isStrongMode) return;
     var library = await checkLibrary('''
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 70260d6..078ccce 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -617,6 +617,8 @@
       int charOpenParenOffset,
       int charEndOffset,
       String nativeMethodName,
+      int codeStartOffset,
+      int codeEndOffset,
       {bool isTopLevel}) {
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     ProcedureBuilder procedure = new KernelProcedureBuilder(
@@ -635,6 +637,8 @@
         nativeMethodName);
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
+    metadataCollector?.setCodeStartEnd(
+        procedure.target, codeStartOffset, codeEndOffset);
     checkTypeVariables(typeVariables, procedure);
     addBuilder(name, procedure, charOffset);
     if (nativeMethodName != null) {
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 1f7b2ef..1c5db24 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -551,6 +551,11 @@
         .resolveTypes(typeVariables, library);
     final int startCharOffset =
         metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+
+    int codeStartOffset =
+        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
+    int codeEndOffset = endToken.end;
+
     library.addProcedure(
         docComment?.text,
         metadata,
@@ -565,6 +570,8 @@
         formalsOffset,
         endToken.charOffset,
         nativeMethodName,
+        codeStartOffset,
+        codeEndOffset,
         isTopLevel: true);
     nativeMethodName = null;
   }
@@ -766,6 +773,11 @@
       }
       final int startCharOffset =
           metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+
+      int codeStartOffset =
+          _chooseCodeStartOffset(docComment, metadataToken, beginToken);
+      int codeEndOffset = endToken.end;
+
       library.addProcedure(
           docComment?.text,
           metadata,
@@ -780,6 +792,8 @@
           formalsOffset,
           endToken.charOffset,
           nativeMethodName,
+          codeStartOffset,
+          codeEndOffset,
           isTopLevel: false);
     }
     nativeMethodName = null;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 956d2a0..2376e21 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -416,6 +416,8 @@
       int charOpenParenOffset,
       int charEndOffset,
       String nativeMethodName,
+      int codeStartOffset,
+      int codeEndOffset,
       {bool isTopLevel});
 
   void addEnum(