Use writeDeclaredElement() for more nodes.

Change-Id: I904ca1c34189234614b390675aa67cb6af8bc286
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/288321
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index cf2b217..4e98a1c 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -1963,6 +1963,9 @@
   /// not be resolved.
   ConstructorElement? get constructorElement;
 
+  @override
+  FieldElement? get declaredElement;
+
   /// Return the name of the constant.
   Token get name;
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index b38a91d..e89ba3c 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3983,16 +3983,12 @@
     } else if (nameNode is EnumConstantArguments) {
       var parent = nameNode.parent;
       if (parent is EnumConstantDeclaration) {
-        var declaredElement = parent.declaredElement;
-        if (declaredElement is VariableElement) {
-          name = declaredElement.type.getDisplayString(withNullability: true);
-        }
-      }
-    } else if (nameNode is EnumConstantDeclaration) {
-      var declaredElement = nameNode.declaredElement;
-      if (declaredElement is VariableElement) {
+        var declaredElement = parent.declaredElement!;
         name = declaredElement.type.getDisplayString(withNullability: true);
       }
+    } else if (nameNode is EnumConstantDeclaration) {
+      var declaredElement = nameNode.declaredElement!;
+      name = declaredElement.type.getDisplayString(withNullability: true);
     } else if (nameNode is Annotation) {
       var nameNodeName = nameNode.name;
       name = nameNodeName is PrefixedIdentifier
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index e84591e..bff9883 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -3087,6 +3087,7 @@
         staticType: Null
       semicolon: ;
     declaredElement: self::@function::f
+      type: T Function<T>(T)
     staticType: T Function<T>(T)
   declaredElement: self::@function::f
     type: T Function<T>(T)
@@ -3129,6 +3130,7 @@
         staticType: Null*
       semicolon: ;
     declaredElement: self::@function::f
+      type: T* Function<T>(T*)*
     staticType: T* Function<T>(T*)*
   declaredElement: self::@function::f
     type: T* Function<T>(T*)*
@@ -3188,6 +3190,7 @@
         staticType: Null
       semicolon: ;
     declaredElement: self::@function::f
+      type: T Function<T extends num>(T)
     staticType: T Function<T extends num>(T)
   declaredElement: self::@function::f
     type: T Function<T extends num>(T)
@@ -3237,6 +3240,7 @@
         staticType: Null*
       semicolon: ;
     declaredElement: self::@function::f
+      type: T* Function<T extends num*>(T*)*
     staticType: T* Function<T extends num*>(T*)*
   declaredElement: self::@function::f
     type: T* Function<T extends num*>(T*)*
diff --git a/pkg/analyzer/test/src/dart/resolution/for_statement_test.dart b/pkg/analyzer/test/src/dart/resolution/for_statement_test.dart
index bb161fa..2255127 100644
--- a/pkg/analyzer/test/src/dart/resolution/for_statement_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/for_statement_test.dart
@@ -51,6 +51,7 @@
         type: int
       name: v
       declaredElement: v@56
+        type: int
     inKeyword: in
     iterable: MethodInvocation
       methodName: SimpleIdentifier
@@ -91,7 +92,8 @@
     loopVariable: DeclaredIdentifier
       keyword: var
       name: v
-      declaredElement: v@22
+      declaredElement: hasImplicitType v@22
+        type: dynamic
     inKeyword: in
     iterable: SimpleIdentifier
       token: <empty> <synthetic>
@@ -133,6 +135,7 @@
         type: dynamic
       name: v
       declaredElement: v@42
+        type: dynamic
     inKeyword: in
     iterable: SimpleIdentifier
       token: values
@@ -171,7 +174,8 @@
     loopVariable: DeclaredIdentifier
       keyword: var
       name: v
-      declaredElement: v@56
+      declaredElement: hasImplicitType v@56
+        type: Object?
     inKeyword: in
     iterable: MethodInvocation
       methodName: SimpleIdentifier
@@ -209,7 +213,8 @@
     loopVariable: DeclaredIdentifier
       keyword: var
       name: v
-      declaredElement: v@42
+      declaredElement: hasImplicitType v@42
+        type: int
     inKeyword: in
     iterable: SimpleIdentifier
       token: values
@@ -246,7 +251,8 @@
     loopVariable: DeclaredIdentifier
       keyword: var
       name: v
-      declaredElement: v@38
+      declaredElement: hasImplicitType v@38
+        type: int
     inKeyword: in
     iterable: SimpleIdentifier
       token: values
@@ -283,7 +289,8 @@
     loopVariable: DeclaredIdentifier
       keyword: var
       name: v
-      declaredElement: v@52
+      declaredElement: hasImplicitType v@52
+        type: int
     inKeyword: in
     iterable: SimpleIdentifier
       token: values
@@ -322,7 +329,8 @@
     loopVariable: DeclaredIdentifier
       keyword: var
       name: x
-      declaredElement: x@39
+      declaredElement: hasImplicitType x@39
+        type: int
     inKeyword: in
     iterable: PrefixedIdentifier
       prefix: SimpleIdentifier
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index b5c30d7..40bff5a 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -4033,6 +4033,7 @@
         leftBracket: {
         rightBracket: }
     declaredElement: @36
+      type: Null Function<T>(T)
     staticType: Null Function<T>(T)
   staticType: Null Function(int)
   typeArgumentTypes
diff --git a/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart b/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart
index 9824616..0b7b63a 100644
--- a/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart
@@ -72,6 +72,7 @@
               staticElement: <null>
               staticType: dynamic
           declaredElement: @99
+            type: int Function(Object?)
           parameter: ParameterMember
             base: root::@parameter::b
             substitution: {T: String}
@@ -136,6 +137,7 @@
               staticElement: dart:core::@class::String::@getter::length
               staticType: int
           declaredElement: @107
+            type: int Function(String)
           parameter: ParameterMember
             base: root::@parameter::b
             substitution: {T: String}
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 3b328bb..b1a9d7c 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -244,9 +244,7 @@
     _writeln('ClassDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -255,9 +253,7 @@
     _writeln('ClassTypeAlias');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -322,9 +318,7 @@
     _writeln('ConstructorDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -377,9 +371,7 @@
     _writeln('DeclaredIdentifier');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -412,7 +404,8 @@
     _writeln('DefaultFormalParameter');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _assertFormalParameterDeclaredElement(node);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -469,7 +462,7 @@
       _writeNamedChildEntities(node);
       if (_withResolution) {
         _writeElement('constructorElement', node.constructorElement);
-        _writeElement('declaredElement', node.declaredElement);
+        _writeDeclaredElement(node.declaredElement);
       }
     });
   }
@@ -479,9 +472,7 @@
     _writeln('EnumDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -523,9 +514,7 @@
     _writeln('ExtensionDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -545,9 +534,7 @@
     _writeln('FieldDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -556,7 +543,8 @@
     _writeln('FieldFormalParameter');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _assertFormalParameterDeclaredElement(node);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -637,7 +625,7 @@
     _writeln('FunctionDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -654,9 +642,7 @@
     _writeln('FunctionExpression');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
       _writeParameterElement(node);
       _writeType('staticType', node.staticType);
     });
@@ -690,9 +676,7 @@
     _writeln('FunctionTypeAlias');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -701,7 +685,8 @@
     _writeln('FunctionTypedFormalParameter');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _assertFormalParameterDeclaredElement(node);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -725,9 +710,7 @@
     _writeln('GenericTypeAlias');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -954,7 +937,7 @@
     _writeln('MethodDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -975,9 +958,7 @@
     _writeln('MixinDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -1308,7 +1289,7 @@
     _writeln('SimpleFormalParameter');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -1380,7 +1361,8 @@
     _writeln('SuperFormalParameter');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      _writeDeclaredElement(node, node.declaredElement);
+      _assertFormalParameterDeclaredElement(node);
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -1468,9 +1450,7 @@
     _writeln('TopLevelVariableDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -1505,9 +1485,7 @@
     _writeln('TypeParameter');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -1524,9 +1502,7 @@
     _writeln('VariableDeclaration');
     _withIndent(() {
       _writeNamedChildEntities(node);
-      if (_withResolution) {
-        _writeElement('declaredElement', node.declaredElement);
-      }
+      _writeDeclaredElement(node.declaredElement);
     });
   }
 
@@ -1627,6 +1603,14 @@
     }
   }
 
+  void _assertFormalParameterDeclaredElement(FormalParameter node) {
+    if (_withResolution) {
+      final declaredElement = node.declaredElement;
+      final expected = _expectedFormalParameterElements(node);
+      _assertHasIdenticalElement(expected, declaredElement);
+    }
+  }
+
   /// Check that children entities of the [node] link to each other.
   void _checkChildrenEntitiesLinking(AstNode node) {
     Token? lastEnd;
@@ -1745,27 +1729,33 @@
     });
   }
 
-  void _writeDeclaredElement(AstNode node, Element? declaredElement) {
+  void _writeDeclaredElement(Element? element) {
     if (_withResolution) {
-      if (node is FormalParameter) {
-        final expected = _expectedFormalParameterElements(node);
-        _assertHasIdenticalElement(expected, declaredElement);
-      }
-
-      _writeElement('declaredElement', declaredElement);
-
-      DartType type;
-      if (declaredElement is ExecutableElementImpl) {
-        type = declaredElement.type;
-      } else if (declaredElement is VariableElement) {
-        type = declaredElement.type;
+      if (element is LocalVariableElement) {
+        _sink.write(_indent);
+        _sink.write('declaredElement:');
+        _writeIf(element.hasImplicitType, ' hasImplicitType');
+        _writeIf(element.isConst, ' isConst');
+        _writeIf(element.isFinal, ' isFinal');
+        _writeIf(element.isLate, ' isLate');
+        // TODO(scheglov) This crashes.
+        // _writeIf(element.hasInitializer, ' hasInitializer');
+        _writeln(' ${element.name}@${element.nameOffset}');
+        _withIndent(() {
+          _writeType('type', element.type);
+        });
       } else {
-        throw StateError('Unexpected: $declaredElement');
+        _writeElement('declaredElement', element);
+        if (element is ExecutableElement) {
+          _withIndent(() {
+            _writeType('type', element.type);
+          });
+        } else if (element is ParameterElement) {
+          _withIndent(() {
+            _writeType('type', element.type);
+          });
+        }
       }
-
-      _withIndent(() {
-        _writeType('type', type);
-      });
     }
   }