[cfe] Pass fileUri to more things when issuing problems

The library builders uri might not be correct as the problems can
originate in parts.

Fixes #36990

Change-Id: I1c39a31052b88013df38033a49b662ce5bb86aad
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106083
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 2599943..cd2d313 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2092,7 +2092,7 @@
         isConst: isConst)
       ..fileOffset = identifier.charOffset
       ..fileEqualsOffset = offsetForToken(equalsToken);
-    library.checkBoundsInVariableDeclaration(variable, typeEnvironment);
+    library.checkBoundsInVariableDeclaration(variable, typeEnvironment, uri);
     push(variable);
   }
 
@@ -2464,7 +2464,7 @@
         leftBracket,
         expressions,
         rightBracket);
-    library.checkBoundsInListLiteral(node, typeEnvironment);
+    library.checkBoundsInListLiteral(node, typeEnvironment, uri);
     push(node);
   }
 
@@ -2503,7 +2503,7 @@
         leftBrace,
         expressions,
         leftBrace.endGroup);
-    library.checkBoundsInSetLiteral(node, typeEnvironment);
+    library.checkBoundsInSetLiteral(node, typeEnvironment, uri);
     if (!library.loader.target.enableSetLiterals) {
       internalProblem(
           fasta.messageSetLiteralsNotSupported, node.fileOffset, uri);
@@ -2627,7 +2627,7 @@
         leftBrace,
         entries,
         leftBrace.endGroup);
-    library.checkBoundsInMapLiteral(node, typeEnvironment);
+    library.checkBoundsInMapLiteral(node, typeEnvironment, uri);
     push(node);
   }
 
@@ -2793,7 +2793,7 @@
   void handleAsOperator(Token operator) {
     debugEvent("AsOperator");
     DartType type = buildDartType(pop());
-    library.checkBoundsInType(type, typeEnvironment, operator.charOffset);
+    library.checkBoundsInType(type, typeEnvironment, uri, operator.charOffset);
     Expression expression = popForValue();
     if (!library.loader.target.enableConstantUpdate2018 &&
         constantContext != ConstantContext.none) {
@@ -2815,7 +2815,8 @@
     bool isInverted = not != null;
     Expression isExpression =
         forest.isExpression(operand, isOperator, not, type);
-    library.checkBoundsInType(type, typeEnvironment, isOperator.charOffset);
+    library.checkBoundsInType(
+        type, typeEnvironment, uri, isOperator.charOffset);
     if (operand is VariableGet) {
       typePromoter?.handleIsCheck(isExpression, isInverted, operand.variable,
           type, functionNestingLevel);
@@ -3372,7 +3373,7 @@
           target, forest.castArguments(arguments),
           isConst: isConst)
         ..fileOffset = charOffset;
-      library.checkBoundsInConstructorInvocation(node, typeEnvironment);
+      library.checkBoundsInConstructorInvocation(node, typeEnvironment, uri);
       return node;
     } else {
       Procedure procedure = target;
@@ -3392,14 +3393,14 @@
             target, forest.castArguments(arguments),
             isConst: isConst)
           ..fileOffset = charOffset;
-        library.checkBoundsInFactoryInvocation(node, typeEnvironment);
+        library.checkBoundsInFactoryInvocation(node, typeEnvironment, uri);
         return node;
       } else {
         StaticInvocation node = new StaticInvocation(
             target, forest.castArguments(arguments),
             isConst: isConst)
           ..fileOffset = charOffset;
-        library.checkBoundsInStaticInvocation(node, typeEnvironment);
+        library.checkBoundsInStaticInvocation(node, typeEnvironment, uri);
         return node;
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 830e13a..7b2f7f5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -183,7 +183,7 @@
       KernelLibraryBuilder library = inferrer.library;
       if (!hasExplicitTypeArguments) {
         library.checkBoundsInConstructorInvocation(
-            node, inferrer.typeSchemaEnvironment,
+            node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
     }
@@ -244,7 +244,7 @@
       KernelLibraryBuilder library = inferrer.library;
       if (!hadExplicitTypeArguments) {
         library.checkBoundsInFactoryInvocation(
-            node, inferrer.typeSchemaEnvironment,
+            node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
     }
@@ -919,7 +919,8 @@
     if (!inferrer.isTopLevel) {
       KernelLibraryBuilder library = inferrer.library;
       if (inferenceNeeded) {
-        library.checkBoundsInListLiteral(node, inferrer.typeSchemaEnvironment,
+        library.checkBoundsInListLiteral(
+            node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
     }
@@ -1475,7 +1476,8 @@
       // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
       // none of them, so we may just check one.
       if (inferenceNeeded) {
-        library.checkBoundsInMapLiteral(node, inferrer.typeSchemaEnvironment,
+        library.checkBoundsInMapLiteral(
+            node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
     }
@@ -1760,7 +1762,8 @@
     if (!inferrer.isTopLevel) {
       KernelLibraryBuilder library = inferrer.library;
       if (inferenceNeeded) {
-        library.checkBoundsInSetLiteral(node, inferrer.typeSchemaEnvironment,
+        library.checkBoundsInSetLiteral(
+            node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
 
@@ -1814,7 +1817,7 @@
     inferrer.storeInferredType(node, inferenceResult.type);
     if (!hadExplicitTypeArguments && node.target != null) {
       inferrer.library?.checkBoundsInStaticInvocation(
-          node, inferrer.typeSchemaEnvironment,
+          node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
           inferred: true);
     }
   }
@@ -2025,7 +2028,7 @@
       KernelLibraryBuilder library = inferrer.library;
       if (node._implicitlyTyped) {
         library.checkBoundsInVariableDeclaration(
-            node, inferrer.typeSchemaEnvironment,
+            node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 5e4ac3a..b36770c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -340,7 +340,8 @@
           }
         }
 
-        library.reportTypeArgumentIssue(message, charOffset, typeParameter);
+        library.reportTypeArgumentIssue(
+            message, fileUri, charOffset, typeParameter);
       }
     }
   }
@@ -379,7 +380,7 @@
           }
 
           library.reportTypeArgumentIssue(
-              message, parameter.fileOffset, typeParameter);
+              message, fileUri, parameter.fileOffset, typeParameter);
         }
       }
     }
@@ -402,15 +403,17 @@
       library.checkBoundsInField(field, typeEnvironment);
     }
     for (Procedure procedure in cls.procedures) {
-      library.checkBoundsInFunctionNode(procedure.function, typeEnvironment);
+      library.checkBoundsInFunctionNode(
+          procedure.function, typeEnvironment, fileUri);
     }
     for (Constructor constructor in cls.constructors) {
-      library.checkBoundsInFunctionNode(constructor.function, typeEnvironment);
+      library.checkBoundsInFunctionNode(
+          constructor.function, typeEnvironment, fileUri);
     }
     for (RedirectingFactoryConstructor redirecting
         in cls.redirectingFactoryConstructors) {
       library.checkBoundsInFunctionNodeParts(
-          typeEnvironment, redirecting.fileOffset,
+          typeEnvironment, fileUri, redirecting.fileOffset,
           typeParameters: redirecting.typeParameters,
           positionalParameters: redirecting.positionalParameters,
           namedParameters: redirecting.namedParameters);
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 1532c58..91a846a 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
@@ -1481,7 +1481,8 @@
     addToExportScope(name, member);
   }
 
-  void reportTypeArgumentIssues(List<TypeArgumentIssue> issues, int offset,
+  void reportTypeArgumentIssues(
+      List<TypeArgumentIssue> issues, Uri fileUri, int offset,
       {bool inferred, DartType targetReceiver, String targetName}) {
     for (TypeArgumentIssue issue in issues) {
       DartType argument = issue.argument;
@@ -1542,12 +1543,12 @@
         }
       }
 
-      reportTypeArgumentIssue(message, offset, typeParameter);
+      reportTypeArgumentIssue(message, fileUri, offset, typeParameter);
     }
   }
 
-  void reportTypeArgumentIssue(
-      Message message, int fileOffset, TypeParameter typeParameter) {
+  void reportTypeArgumentIssue(Message message, Uri fileUri, int fileOffset,
+      TypeParameter typeParameter) {
     List<LocatedMessage> context;
     if (typeParameter != null && typeParameter.fileOffset != -1) {
       // It looks like when parameters come from patch files, they don't
@@ -1562,12 +1563,13 @@
 
   void checkBoundsInField(Field field, TypeEnvironment typeEnvironment) {
     if (loader.target.legacyMode) return;
-    checkBoundsInType(field.type, typeEnvironment, field.fileOffset,
+    checkBoundsInType(
+        field.type, typeEnvironment, field.fileUri, field.fileOffset,
         allowSuperBounded: true);
   }
 
   void checkBoundsInFunctionNodeParts(
-      TypeEnvironment typeEnvironment, int fileOffset,
+      TypeEnvironment typeEnvironment, Uri fileUri, int fileOffset,
       {List<TypeParameter> typeParameters,
       List<VariableDeclaration> positionalParameters,
       List<VariableDeclaration> namedParameters,
@@ -1576,19 +1578,21 @@
     if (typeParameters != null) {
       for (TypeParameter parameter in typeParameters) {
         checkBoundsInType(
-            parameter.bound, typeEnvironment, parameter.fileOffset,
+            parameter.bound, typeEnvironment, fileUri, parameter.fileOffset,
             allowSuperBounded: true);
       }
     }
     if (positionalParameters != null) {
       for (VariableDeclaration formal in positionalParameters) {
-        checkBoundsInType(formal.type, typeEnvironment, formal.fileOffset,
+        checkBoundsInType(
+            formal.type, typeEnvironment, fileUri, formal.fileOffset,
             allowSuperBounded: true);
       }
     }
     if (namedParameters != null) {
       for (VariableDeclaration named in namedParameters) {
-        checkBoundsInType(named.type, typeEnvironment, named.fileOffset,
+        checkBoundsInType(
+            named.type, typeEnvironment, fileUri, named.fileOffset,
             allowSuperBounded: true);
       }
     }
@@ -1617,16 +1621,17 @@
                 getGenericTypeName(issue.enclosingType));
           }
 
-          reportTypeArgumentIssue(message, offset, typeParameter);
+          reportTypeArgumentIssue(message, fileUri, offset, typeParameter);
         }
       }
     }
   }
 
   void checkBoundsInFunctionNode(
-      FunctionNode function, TypeEnvironment typeEnvironment) {
+      FunctionNode function, TypeEnvironment typeEnvironment, Uri fileUri) {
     if (loader.target.legacyMode) return;
-    checkBoundsInFunctionNodeParts(typeEnvironment, function.fileOffset,
+    checkBoundsInFunctionNodeParts(
+        typeEnvironment, fileUri, function.fileOffset,
         typeParameters: function.typeParameters,
         positionalParameters: function.positionalParameters,
         namedParameters: function.namedParameters,
@@ -1634,64 +1639,69 @@
   }
 
   void checkBoundsInListLiteral(
-      ListLiteral node, TypeEnvironment typeEnvironment,
+      ListLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
-    checkBoundsInType(node.typeArgument, typeEnvironment, node.fileOffset,
+    checkBoundsInType(
+        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
   }
 
-  void checkBoundsInSetLiteral(SetLiteral node, TypeEnvironment typeEnvironment,
+  void checkBoundsInSetLiteral(
+      SetLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
-    checkBoundsInType(node.typeArgument, typeEnvironment, node.fileOffset,
+    checkBoundsInType(
+        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
   }
 
-  void checkBoundsInMapLiteral(MapLiteral node, TypeEnvironment typeEnvironment,
+  void checkBoundsInMapLiteral(
+      MapLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
-    checkBoundsInType(node.keyType, typeEnvironment, node.fileOffset,
+    checkBoundsInType(node.keyType, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
-    checkBoundsInType(node.valueType, typeEnvironment, node.fileOffset,
+    checkBoundsInType(node.valueType, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
   }
 
   void checkBoundsInType(
-      DartType type, TypeEnvironment typeEnvironment, int offset,
+      DartType type, TypeEnvironment typeEnvironment, Uri fileUri, int offset,
       {bool inferred, bool allowSuperBounded = true}) {
     if (loader.target.legacyMode) return;
     List<TypeArgumentIssue> issues = findTypeArgumentIssues(
         type, typeEnvironment,
         allowSuperBounded: allowSuperBounded);
     if (issues != null) {
-      reportTypeArgumentIssues(issues, offset, inferred: inferred);
+      reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
     }
   }
 
   void checkBoundsInVariableDeclaration(
-      VariableDeclaration node, TypeEnvironment typeEnvironment,
+      VariableDeclaration node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
     if (node.type == null) return;
-    checkBoundsInType(node.type, typeEnvironment, node.fileOffset,
+    checkBoundsInType(node.type, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
   }
 
   void checkBoundsInConstructorInvocation(
-      ConstructorInvocation node, TypeEnvironment typeEnvironment,
+      ConstructorInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
     if (node.arguments.types.isEmpty) return;
     Constructor constructor = node.target;
     Class klass = constructor.enclosingClass;
     DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    checkBoundsInType(constructedType, typeEnvironment, node.fileOffset,
+    checkBoundsInType(
+        constructedType, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: false);
   }
 
   void checkBoundsInFactoryInvocation(
-      StaticInvocation node, TypeEnvironment typeEnvironment,
+      StaticInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
     if (node.arguments.types.isEmpty) return;
@@ -1699,12 +1709,13 @@
     assert(factory.isFactory);
     Class klass = factory.enclosingClass;
     DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    checkBoundsInType(constructedType, typeEnvironment, node.fileOffset,
+    checkBoundsInType(
+        constructedType, typeEnvironment, fileUri, node.fileOffset,
         inferred: inferred, allowSuperBounded: false);
   }
 
   void checkBoundsInStaticInvocation(
-      StaticInvocation node, TypeEnvironment typeEnvironment,
+      StaticInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
     if (node.arguments.types.isEmpty) return;
@@ -1721,7 +1732,7 @@
         targetReceiver = new InterfaceType(klass);
       }
       String targetName = node.target.name.name;
-      reportTypeArgumentIssues(issues, node.fileOffset,
+      reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
           inferred: inferred,
           targetReceiver: targetReceiver,
           targetName: targetName);
@@ -1736,6 +1747,7 @@
       Name name,
       Member interfaceTarget,
       Arguments arguments,
+      Uri fileUri,
       int offset,
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
@@ -1781,7 +1793,7 @@
     List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
         instantiatedMethodParameters, arguments.types, typeEnvironment);
     if (issues != null) {
-      reportTypeArgumentIssues(issues, offset,
+      reportTypeArgumentIssues(issues, fileUri, offset,
           inferred: inferred,
           targetReceiver: receiverType,
           targetName: name.name);
@@ -1796,7 +1808,8 @@
       if (declaration is KernelFieldBuilder) {
         checkBoundsInField(declaration.target, typeEnvironment);
       } else if (declaration is KernelProcedureBuilder) {
-        checkBoundsInFunctionNode(declaration.target.function, typeEnvironment);
+        checkBoundsInFunctionNode(
+            declaration.target.function, typeEnvironment, declaration.fileUri);
       } else if (declaration is KernelClassBuilder) {
         declaration.checkBoundsInOutline(typeEnvironment);
       }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 05052a6..bbe6899 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1611,6 +1611,7 @@
           actualMethodName,
           interfaceTarget,
           arguments,
+          helper.uri,
           fileOffset,
           inferred: getExplicitTypeArguments(arguments) == null);
     }
@@ -1957,9 +1958,9 @@
               mixinSuperclass.implementedTypes.length != 2)) {
         unexpected(
             'Compiler-generated mixin applications have a mixin or else '
-            'implement exactly one type',
+                'implement exactly one type',
             '$mixinSuperclass implements '
-            '${mixinSuperclass.implementedTypes.length} types',
+                '${mixinSuperclass.implementedTypes.length} types',
             mixinSuperclass.fileOffset,
             mixinSuperclass.fileUri);
       }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 415b5dc..65cb2ec 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -3,17 +3,6 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 # Not sorted --- these crashes should be fixed ASAP!
-GenericFunctionTypeInferredAsActualTypeArgument/part_wrapped_script: Crash
-GenericFunctionTypeUsedAsActualTypeArgument/part_wrapped_script1: Crash
-GenericFunctionTypeUsedAsActualTypeArgument/part_wrapped_script2: Crash
-IncorrectTypeArgument/part_wrapped_script: Crash
-IncorrectTypeArgumentInReturnType/part_wrapped_script: Crash
-IncorrectTypeArgumentInSupertype/part_wrapped_script: Crash
-IncorrectTypeArgumentInSupertypeInferred/part_wrapped_script: Crash
-IncorrectTypeArgumentInferred/part_wrapped_script: Crash
-IncorrectTypeArgumentQualified/part_wrapped_script: Crash
-IncorrectTypeArgumentQualifiedInferred/part_wrapped_script: Crash
-IntersectionTypeAsTypeArgument/part_wrapped_script: Crash
 PartTwice/part_wrapped_script: Crash
 
 AbstractClassInstantiation/example: Fail