Partial fix for parsing explicitly typed super formal parameters.

I need at least this much to cover a few test cases in the analyzer,
but it might be not the best implementation. It seems to not break
anything, so maybe we can land this for now, while we are waiting for
the better fix of the referenced issue?

Bug: https://github.com/dart-lang/sdk/issues/47951
Change-Id: I428e32f4435b3229cb2dc41678182cde0e2f98e8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/226200
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
index d599819..9e76440 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
@@ -251,6 +251,18 @@
 
   assert(typeParamOrArg == noTypeParamOrArg);
   next = next.next!;
+
+  // TODO(scheglov) This is a hack to partially fix.
+  // https://github.com/dart-lang/sdk/issues/47951
+  if (optional('?', next) &&
+      optional('super', next.next!) &&
+      optional('.', next.next!.next!)) {
+    return simpleNullableType;
+  }
+  if (optional('super', next) && optional('.', next.next!)) {
+    return simpleType;
+  }
+
   if (optional('.', next)) {
     next = next.next!;
     if (isValidTypeReference(next)) {
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index c592b1f..aa69ec9 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -1370,6 +1370,9 @@
       } else if (notDefault is FunctionTypedFormalParameter) {
         _writeTypeParameters(notDefault.typeParameters);
         _writeFormalParameters(notDefault.parameters);
+      } else if (notDefault is SuperFormalParameter) {
+        _writeTypeParameters(notDefault.typeParameters);
+        _writeFormalParameters(notDefault.parameters);
       } else {
         _writeTypeParameters(null);
         _writeFormalParameters(null);
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index cd93433..dfaa5e0 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -1644,7 +1644,6 @@
     );
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47951')
   void test_superFormalParameter() {
     var findNode = _parseStringToFindNode(r'''
 class A {
@@ -1666,7 +1665,6 @@
     );
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47741')
   void test_superFormalParameter_functionTyped() {
     var findNode = _parseStringToFindNode(r'''
 class A {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index b5fdd89..7a39830 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -1453,7 +1453,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47951')
   test_class_constructor_parameters_super_explicitType_function() async {
     var library = await checkLibrary('''
 class A {
@@ -1492,7 +1491,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47951')
   test_class_constructor_parameters_super_explicitType_interface() async {
     var library = await checkLibrary('''
 class A {
@@ -1518,13 +1516,45 @@
         constructors
           @47
             parameters
-              requiredPositional final super.a @49
+              requiredPositional final super.a @59
                 type: int
                 superConstructorParameter: a@18
             superConstructor: self::@class::A::@constructor::•
 ''');
   }
 
+  test_class_constructor_parameters_super_explicitType_interface_nullable() async {
+    var library = await checkLibrary('''
+class A {
+  A(num? a);
+}
+
+class B extends A {
+  B(int? super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredPositional a @19
+                type: num?
+      class B @32
+        supertype: A
+        constructors
+          @48
+            parameters
+              requiredPositional final super.a @61
+                type: int?
+                superConstructorParameter: a@19
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
   test_class_constructor_parameters_super_invalid_topFunction() async {
     var library = await checkLibrary('''
 void f(super.a) {}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
index d27a628..29ffdbc 100644
--- a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
@@ -2,13 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:17: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
 //   C5([int super.x]); // Error.
-//           ^^^^^
-//
-// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
-//   C6([int? super.x]); // Ok.
-//          ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -68,8 +65,8 @@
     ;
 }
 class C5 extends self::S5 {
-  constructor •([dynamic int = #C4]) → self::C5
-    : super self::S5::•()
+  constructor •([core::int x = #C4]) → self::C5
+    : super self::S5::•(x)
     ;
 }
 class S6 extends core::Object {
@@ -80,8 +77,8 @@
 }
 class C6 extends self::S6 {
   field core::int? b = null;
-  constructor •([dynamic int = #C4]) → self::C6
-    : super self::S6::•()
+  constructor •([core::int? x = #C4]) → self::C6
+    : super self::S6::•(x)
     ;
 }
 class S7 extends core::Object {
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
index d27a628..29ffdbc 100644
--- a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
@@ -2,13 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:17: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
 //   C5([int super.x]); // Error.
-//           ^^^^^
-//
-// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
-//   C6([int? super.x]); // Ok.
-//          ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -68,8 +65,8 @@
     ;
 }
 class C5 extends self::S5 {
-  constructor •([dynamic int = #C4]) → self::C5
-    : super self::S5::•()
+  constructor •([core::int x = #C4]) → self::C5
+    : super self::S5::•(x)
     ;
 }
 class S6 extends core::Object {
@@ -80,8 +77,8 @@
 }
 class C6 extends self::S6 {
   field core::int? b = null;
-  constructor •([dynamic int = #C4]) → self::C6
-    : super self::S6::•()
+  constructor •([core::int? x = #C4]) → self::C6
+    : super self::S6::•(x)
     ;
 }
 class S7 extends core::Object {
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
index d27a628..29ffdbc 100644
--- a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
@@ -2,13 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:17: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
 //   C5([int super.x]); // Error.
-//           ^^^^^
-//
-// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
-//   C6([int? super.x]); // Ok.
-//          ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -68,8 +65,8 @@
     ;
 }
 class C5 extends self::S5 {
-  constructor •([dynamic int = #C4]) → self::C5
-    : super self::S5::•()
+  constructor •([core::int x = #C4]) → self::C5
+    : super self::S5::•(x)
     ;
 }
 class S6 extends core::Object {
@@ -80,8 +77,8 @@
 }
 class C6 extends self::S6 {
   field core::int? b = null;
-  constructor •([dynamic int = #C4]) → self::C6
-    : super self::S6::•()
+  constructor •([core::int? x = #C4]) → self::C6
+    : super self::S6::•(x)
     ;
 }
 class S7 extends core::Object {
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
index d27a628..29ffdbc 100644
--- a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
@@ -2,13 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:17: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
 //   C5([int super.x]); // Error.
-//           ^^^^^
-//
-// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
-//   C6([int? super.x]); // Ok.
-//          ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -68,8 +65,8 @@
     ;
 }
 class C5 extends self::S5 {
-  constructor •([dynamic int = #C4]) → self::C5
-    : super self::S5::•()
+  constructor •([core::int x = #C4]) → self::C5
+    : super self::S5::•(x)
     ;
 }
 class S6 extends core::Object {
@@ -80,8 +77,8 @@
 }
 class C6 extends self::S6 {
   field core::int? b = null;
-  constructor •([dynamic int = #C4]) → self::C6
-    : super self::S6::•()
+  constructor •([core::int? x = #C4]) → self::C6
+    : super self::S6::•(x)
     ;
 }
 class S7 extends core::Object {
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
index 9cb4ff2..aca3fd0 100644
--- a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
@@ -2,13 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:17: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
 //   C5([int super.x]); // Error.
-//           ^^^^^
-//
-// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
-//   C6([int? super.x]); // Ok.
-//          ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -59,7 +56,7 @@
     ;
 }
 class C5 extends self::S5 {
-  constructor •([dynamic int]) → self::C5
+  constructor •([core::int x]) → self::C5
     ;
 }
 class S6 extends core::Object {
@@ -69,7 +66,7 @@
 }
 class C6 extends self::S6 {
   field core::int? b;
-  constructor •([dynamic int]) → self::C6
+  constructor •([core::int? x]) → self::C6
     ;
 }
 class S7 extends core::Object {
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
index d27a628..29ffdbc 100644
--- a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
@@ -2,13 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:17: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
 //   C5([int super.x]); // Error.
-//           ^^^^^
-//
-// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
-//   C6([int? super.x]); // Ok.
-//          ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -68,8 +65,8 @@
     ;
 }
 class C5 extends self::S5 {
-  constructor •([dynamic int = #C4]) → self::C5
-    : super self::S5::•()
+  constructor •([core::int x = #C4]) → self::C5
+    : super self::S5::•(x)
     ;
 }
 class S6 extends core::Object {
@@ -80,8 +77,8 @@
 }
 class C6 extends self::S6 {
   field core::int? b = null;
-  constructor •([dynamic int = #C4]) → self::C6
-    : super self::S6::•()
+  constructor •([core::int? x = #C4]) → self::C6
+    : super self::S6::•(x)
     ;
 }
 class S7 extends core::Object {