De-duplicate some bound check code.

Change-Id: I75cb1b31f8b47525ee18c8d01a3fe534512ad579
Reviewed-on: https://dart-review.googlesource.com/c/85293
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
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 3b3b732..f59a18c 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
@@ -326,7 +326,7 @@
           }
         }
 
-        library.reportTypeArgumentIssues(message, charOffset, typeParameter);
+        library.reportTypeArgumentIssue(message, charOffset, typeParameter);
       }
     }
   }
@@ -361,7 +361,7 @@
                 argument, getGenericTypeName(issue.enclosingType));
           }
 
-          library.reportTypeArgumentIssues(
+          library.reportTypeArgumentIssue(
               message, parameter.fileOffset, typeParameter);
         }
       }
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 8b26a37..d322972 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
@@ -1372,7 +1372,41 @@
     addToExportScope(name, member);
   }
 
-  void reportTypeArgumentIssues(
+  void reportTypeArgumentIssues(List<TypeArgumentIssue> issues, int offset,
+      {bool inferred, String targetName}) {
+    for (TypeArgumentIssue issue in issues) {
+      DartType argument = issue.argument;
+      TypeParameter typeParameter = issue.typeParameter;
+
+      Message message;
+      bool issueInferred = inferred ?? inferredTypes.contains(argument);
+      if (argument is FunctionType && argument.typeParameters.length > 0) {
+        if (issueInferred) {
+          message = templateGenericFunctionTypeInferredAsActualTypeArgument
+              .withArguments(argument);
+        } else {
+          message = messageGenericFunctionTypeUsedAsActualTypeArgument;
+        }
+        typeParameter = null;
+      } else {
+        String enclosingName = issue.enclosingType == null
+            ? targetName
+            : getGenericTypeName(issue.enclosingType);
+        assert(enclosingName != null);
+        if (issueInferred) {
+          message = templateIncorrectTypeArgumentInferred.withArguments(
+              argument, enclosingName);
+        } else {
+          message = templateIncorrectTypeArgument.withArguments(
+              argument, enclosingName);
+        }
+      }
+
+      reportTypeArgumentIssue(message, offset, typeParameter);
+    }
+  }
+
+  void reportTypeArgumentIssue(
       Message message, int fileOffset, TypeParameter typeParameter) {
     List<LocatedMessage> context;
     if (typeParameter != null && typeParameter.fileOffset != -1) {
@@ -1388,37 +1422,8 @@
 
   void checkBoundsInField(Field field, TypeEnvironment typeEnvironment) {
     if (loader.target.legacyMode) return;
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        field.type, typeEnvironment,
+    checkBoundsInType(field.type, typeEnvironment, field.fileOffset,
         allowSuperBounded: true);
-    if (issues != null) {
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-
-        Message message;
-        bool inferred = inferredTypes.contains(argument);
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          }
-        }
-
-        reportTypeArgumentIssues(message, field.fileOffset, typeParameter);
-      }
-    }
   }
 
   void checkBoundsInFunctionNodeParts(
@@ -1430,116 +1435,21 @@
     if (loader.target.legacyMode) return;
     if (typeParameters != null) {
       for (TypeParameter parameter in typeParameters) {
-        List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-            parameter.bound, typeEnvironment,
+        checkBoundsInType(
+            parameter.bound, typeEnvironment, parameter.fileOffset,
             allowSuperBounded: false);
-        if (issues != null) {
-          int offset = parameter.fileOffset;
-          for (TypeArgumentIssue issue in issues) {
-            DartType argument = issue.argument;
-            TypeParameter typeParameter = issue.typeParameter;
-
-            Message message;
-            bool inferred = inferredTypes.contains(argument);
-            if (argument is FunctionType &&
-                argument.typeParameters.length > 0) {
-              if (inferred) {
-                message =
-                    templateGenericFunctionTypeInferredAsActualTypeArgument
-                        .withArguments(argument);
-              } else {
-                message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-              }
-              typeParameter = null;
-            } else {
-              if (inferred) {
-                message = templateIncorrectTypeArgumentInferred.withArguments(
-                    argument, getGenericTypeName(issue.enclosingType));
-              } else {
-                message = templateIncorrectTypeArgument.withArguments(
-                    argument, getGenericTypeName(issue.enclosingType));
-              }
-            }
-
-            reportTypeArgumentIssues(message, offset, typeParameter);
-          }
-        }
       }
     }
     if (positionalParameters != null) {
       for (VariableDeclaration formal in positionalParameters) {
-        List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-            formal.type, typeEnvironment,
+        checkBoundsInType(formal.type, typeEnvironment, formal.fileOffset,
             allowSuperBounded: true);
-        if (issues != null) {
-          int offset = formal.fileOffset;
-          for (TypeArgumentIssue issue in issues) {
-            DartType argument = issue.argument;
-            TypeParameter typeParameter = issue.typeParameter;
-
-            Message message;
-            bool inferred = inferredTypes.contains(argument);
-            if (argument is FunctionType &&
-                argument.typeParameters.length > 0) {
-              if (inferred) {
-                message =
-                    templateGenericFunctionTypeInferredAsActualTypeArgument
-                        .withArguments(argument);
-              } else {
-                message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-              }
-              typeParameter = null;
-            } else {
-              if (inferred) {
-                message = templateIncorrectTypeArgumentInferred.withArguments(
-                    argument, getGenericTypeName(issue.enclosingType));
-              } else {
-                message = templateIncorrectTypeArgument.withArguments(
-                    argument, getGenericTypeName(issue.enclosingType));
-              }
-            }
-
-            reportTypeArgumentIssues(message, offset, typeParameter);
-          }
-        }
       }
     }
     if (namedParameters != null) {
       for (VariableDeclaration named in namedParameters) {
-        List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-            named.type, typeEnvironment,
+        checkBoundsInType(named.type, typeEnvironment, named.fileOffset,
             allowSuperBounded: true);
-        if (issues != null) {
-          int offset = named.fileOffset;
-          for (TypeArgumentIssue issue in issues) {
-            DartType argument = issue.argument;
-            TypeParameter typeParameter = issue.typeParameter;
-
-            Message message;
-            bool inferred = inferredTypes.contains(argument);
-            if (argument is FunctionType &&
-                argument.typeParameters.length > 0) {
-              if (inferred) {
-                message =
-                    templateGenericFunctionTypeInferredAsActualTypeArgument
-                        .withArguments(argument);
-              } else {
-                message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-              }
-              typeParameter = null;
-            } else {
-              if (inferred) {
-                message = templateIncorrectTypeArgumentInferred.withArguments(
-                    argument, getGenericTypeName(issue.enclosingType));
-              } else {
-                message = templateIncorrectTypeArgument.withArguments(
-                    argument, getGenericTypeName(issue.enclosingType));
-              }
-            }
-
-            reportTypeArgumentIssues(message, offset, typeParameter);
-          }
-        }
       }
     }
     if (returnType != null) {
@@ -1564,7 +1474,7 @@
                 argument, getGenericTypeName(issue.enclosingType));
           }
 
-          reportTypeArgumentIssues(message, offset, typeParameter);
+          reportTypeArgumentIssue(message, offset, typeParameter);
         }
       }
     }
@@ -1599,37 +1509,13 @@
 
   void checkBoundsInType(
       DartType type, TypeEnvironment typeEnvironment, int offset,
-      {bool inferred = false, bool allowSuperBounded = true}) {
+      {bool inferred, bool allowSuperBounded = true}) {
     if (loader.target.legacyMode) return;
     List<TypeArgumentIssue> issues = findTypeArgumentIssues(
         type, typeEnvironment,
         allowSuperBounded: allowSuperBounded);
     if (issues != null) {
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          }
-        }
-
-        reportTypeArgumentIssues(message, offset, typeParameter);
-      }
+      reportTypeArgumentIssues(issues, offset, inferred: inferred);
     }
   }
 
@@ -1638,36 +1524,8 @@
       {bool inferred = false}) {
     if (loader.target.legacyMode) return;
     if (node.type == null) return;
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        node.type, typeEnvironment,
-        allowSuperBounded: true);
-    if (issues != null) {
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          }
-        }
-
-        reportTypeArgumentIssues(message, node.fileOffset, typeParameter);
-      }
-    }
+    checkBoundsInType(node.type, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
   }
 
   void checkBoundsInConstructorInvocation(
@@ -1678,36 +1536,8 @@
     Constructor constructor = node.target;
     Class klass = constructor.enclosingClass;
     DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        constructedType, typeEnvironment,
-        allowSuperBounded: false);
-    if (issues != null) {
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          }
-        }
-
-        reportTypeArgumentIssues(message, node.fileOffset, typeParameter);
-      }
-    }
+    checkBoundsInType(constructedType, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: false);
   }
 
   void checkBoundsInFactoryInvocation(
@@ -1719,36 +1549,8 @@
     assert(factory.isFactory);
     Class klass = factory.enclosingClass;
     DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        constructedType, typeEnvironment,
-        allowSuperBounded: false);
-    if (issues != null) {
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, getGenericTypeName(issue.enclosingType));
-          }
-        }
-
-        reportTypeArgumentIssues(message, node.fileOffset, typeParameter);
-      }
-    }
+    checkBoundsInType(constructedType, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: false);
   }
 
   void checkBoundsInStaticInvocation(
@@ -1770,34 +1572,8 @@
       } else {
         targetName = "${klass.name}.${node.target.name.name}";
       }
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-        String enclosingName = issue.enclosingType == null
-            ? targetName
-            : getGenericTypeName(issue.enclosingType);
-
-        Message message;
-        if (argument is FunctionType) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, enclosingName);
-          }
-        }
-
-        reportTypeArgumentIssues(message, node.fileOffset, typeParameter);
-      }
+      reportTypeArgumentIssues(issues, node.fileOffset,
+          inferred: inferred, targetName: targetName);
     }
   }
 
@@ -1857,34 +1633,8 @@
         targetName += ">";
       }
       targetName += ".${name.name}";
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-        String enclosingName = issue.enclosingType == null
-            ? targetName
-            : getGenericTypeName(issue.enclosingType);
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, enclosingName);
-          }
-        }
-
-        reportTypeArgumentIssues(message, offset, typeParameter);
-      }
+      reportTypeArgumentIssues(issues, offset,
+          inferred: inferred, targetName: targetName);
     }
   }