@@ -562,11 +562,50 @@ static Type applyGenericTypeReprArgs(TypeChecker &TC, Type type, SourceLoc loc,
562
562
563
563
// / \brief Diagnose a use of an unbound generic type.
564
564
static void diagnoseUnboundGenericType (TypeChecker &tc, Type ty,SourceLoc loc) {
565
- tc.diagnose (loc, diag::generic_type_requires_arguments, ty);
566
565
auto unbound = ty->castTo <UnboundGenericType>();
566
+ {
567
+ InFlightDiagnostic diag = tc.diagnose (loc,
568
+ diag::generic_type_requires_arguments, ty);
569
+ if (auto *genericD = unbound->getDecl ()) {
570
+
571
+ // Tries to infer the type arguments to pass.
572
+ // Currently it only works if all the generic arguments have a super type,
573
+ // or it requires a class, in which case it infers 'AnyObject'.
574
+ auto inferGenericArgs = [](GenericTypeDecl *genericD)->std ::string {
575
+ GenericParamList *genParamList = genericD->getGenericParams ();
576
+ if (!genParamList)
577
+ return std::string ();
578
+ auto params= genParamList->getParams ();
579
+ if (params.empty ())
580
+ return std::string ();
581
+ std::string argsToAdd = " <" ;
582
+ for (unsigned i = 0 , e = params.size (); i != e; ++i) {
583
+ auto param = params[i];
584
+ auto archTy = param->getArchetype ();
585
+ if (!archTy)
586
+ return std::string ();
587
+ if (auto superTy = archTy->getSuperclass ()) {
588
+ argsToAdd += superTy.getString ();
589
+ } else if (archTy->requiresClass ()) {
590
+ argsToAdd += " AnyObject" ;
591
+ } else {
592
+ return std::string (); // give up.
593
+ }
594
+ if (i < e-1 )
595
+ argsToAdd += " , " ;
596
+ }
597
+ argsToAdd += " >" ;
598
+ return argsToAdd;
599
+ };
600
+
601
+ std::string genericArgsToAdd = inferGenericArgs (genericD);
602
+ if (!genericArgsToAdd.empty ()) {
603
+ diag.fixItInsertAfter (loc, genericArgsToAdd);
604
+ }
605
+ }
606
+ }
567
607
tc.diagnose (unbound->getDecl ()->getLoc (), diag::generic_type_declared_here,
568
608
unbound->getDecl ()->getName ());
569
- // TODO: emit fixit for "NSArray" -> "NSArray<AnyObject>", etc.
570
609
}
571
610
572
611
// / \brief Returns a valid type or ErrorType in case of an error.
0 commit comments