@@ -357,19 +357,21 @@ Type TypeChecker::applyGenericArguments(Type type,
357
357
358
358
// We must either have an unbound generic type, or a generic type alias.
359
359
if (!type->is <UnboundGenericType>()) {
360
- auto diag = diagnose (loc, diag::not_a_generic_type, type);
360
+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
361
+ auto diag = diagnose (loc, diag::not_a_generic_type, type);
362
+
363
+ // Don't add fixit on module type; that isn't the right type regardless
364
+ // of whether it had generic arguments.
365
+ if (!type->is <ModuleType>()) {
366
+ // When turning a SourceRange into CharSourceRange the closing angle
367
+ // brackets on nested generics are lexed as one token.
368
+ SourceRange angles = generic->getAngleBrackets ();
369
+ diag.fixItRemoveChars (angles.Start ,
370
+ angles.End .getAdvancedLocOrInvalid (1 ));
371
+ }
361
372
362
- // Don't add fixit on module type; that isn't the right type regardless
363
- // of whether it had generic arguments.
364
- if (!type->is <ModuleType>()) {
365
- // When turning a SourceRange into CharSourceRange the closing angle
366
- // brackets on nested generics are lexed as one token.
367
- SourceRange angles = generic->getAngleBrackets ();
368
- diag.fixItRemoveChars (angles.Start ,
369
- angles.End .getAdvancedLocOrInvalid (1 ));
373
+ generic->setInvalid ();
370
374
}
371
-
372
- generic->setInvalid ();
373
375
return type;
374
376
}
375
377
@@ -383,12 +385,14 @@ Type TypeChecker::applyGenericArguments(Type type,
383
385
auto genericArgs = generic->getGenericArgs ();
384
386
auto genericParams = genericDecl->getGenericParams ();
385
387
if (genericParams->size () != genericArgs.size ()) {
386
- diagnose (loc, diag::type_parameter_count_mismatch, decl->getName (),
387
- genericParams->size (), genericArgs.size (),
388
- genericArgs.size () < genericParams->size ())
389
- .highlight (generic->getAngleBrackets ());
390
- diagnose (decl, diag::kind_identifier_declared_here,
391
- DescriptiveDeclKind::GenericType, decl->getName ());
388
+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
389
+ diagnose (loc, diag::type_parameter_count_mismatch, decl->getName (),
390
+ genericParams->size (), genericArgs.size (),
391
+ genericArgs.size () < genericParams->size ())
392
+ .highlight (generic->getAngleBrackets ());
393
+ diagnose (decl, diag::kind_identifier_declared_here,
394
+ DescriptiveDeclKind::GenericType, decl->getName ());
395
+ }
392
396
return ErrorType::get (Context);
393
397
}
394
398
@@ -412,9 +416,11 @@ Type TypeChecker::applyGenericArguments(Type type,
412
416
413
417
// Cannot extend a bound generic type.
414
418
if (options.contains (TypeResolutionFlags::ExtensionBinding)) {
415
- diagnose (loc, diag::extension_specialization,
416
- genericDecl->getName ())
417
- .highlight (generic->getSourceRange ());
419
+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
420
+ diagnose (loc, diag::extension_specialization,
421
+ genericDecl->getName ())
422
+ .highlight (generic->getSourceRange ());
423
+ }
418
424
return ErrorType::get (Context);
419
425
}
420
426
@@ -901,14 +907,12 @@ static Type
901
907
resolveTopLevelIdentTypeComponent (TypeChecker &TC, DeclContext *DC,
902
908
ComponentIdentTypeRepr *comp,
903
909
TypeResolutionOptions options,
904
- bool diagnoseErrors,
905
910
GenericTypeResolver *resolver);
906
911
907
912
static Type
908
913
resolveGenericSignatureComponent (TypeChecker &TC, DeclContext *DC,
909
914
ComponentIdentTypeRepr *comp,
910
915
TypeResolutionOptions options,
911
- bool diagnoseErrors,
912
916
GenericTypeResolver *resolver) {
913
917
if (!DC->isInnermostContextGeneric ())
914
918
return Type ();
@@ -926,8 +930,7 @@ resolveGenericSignatureComponent(TypeChecker &TC, DeclContext *DC,
926
930
return Type ();
927
931
928
932
comp->setValue (*matchingParam, nullptr );
929
- return resolveTopLevelIdentTypeComponent (TC, DC, comp, options,
930
- diagnoseErrors, resolver);
933
+ return resolveTopLevelIdentTypeComponent (TC, DC, comp, options, resolver);
931
934
}
932
935
933
936
// If we are inside an extension of a nested type, we have to visit
@@ -944,8 +947,7 @@ resolveGenericSignatureComponent(TypeChecker &TC, DeclContext *DC,
944
947
945
948
if (matchingParam != outerParams->end ()) {
946
949
comp->setValue (*matchingParam, nullptr );
947
- return resolveTopLevelIdentTypeComponent (TC, DC, comp, options,
948
- diagnoseErrors, resolver);
950
+ return resolveTopLevelIdentTypeComponent (TC, DC, comp, options, resolver);
949
951
}
950
952
}
951
953
@@ -972,7 +974,7 @@ resolveGenericSignatureComponent(TypeChecker &TC, DeclContext *DC,
972
974
973
975
comp->setValue (typeDecl, DC);
974
976
return resolveTopLevelIdentTypeComponent (TC, DC, comp, options,
975
- diagnoseErrors, resolver);
977
+ resolver);
976
978
}
977
979
}
978
980
}
@@ -989,7 +991,6 @@ static Type
989
991
resolveTopLevelIdentTypeComponent (TypeChecker &TC, DeclContext *DC,
990
992
ComponentIdentTypeRepr *comp,
991
993
TypeResolutionOptions options,
992
- bool diagnoseErrors,
993
994
GenericTypeResolver *resolver) {
994
995
// Short-circuiting.
995
996
if (comp->isInvalid ()) return ErrorType::get (TC.Context );
@@ -1027,7 +1028,7 @@ resolveTopLevelIdentTypeComponent(TypeChecker &TC, DeclContext *DC,
1027
1028
// parameters (only), then move up to the enclosing context.
1028
1029
if (options.contains (TypeResolutionFlags::GenericSignature)) {
1029
1030
Type type = resolveGenericSignatureComponent (
1030
- TC, DC, comp, options, diagnoseErrors, resolver);
1031
+ TC, DC, comp, options, resolver);
1031
1032
if (type)
1032
1033
return type;
1033
1034
@@ -1088,7 +1089,7 @@ resolveTopLevelIdentTypeComponent(TypeChecker &TC, DeclContext *DC,
1088
1089
// Complain about any ambiguities we detected.
1089
1090
// FIXME: We could recover by looking at later components.
1090
1091
if (isAmbiguous) {
1091
- if (diagnoseErrors ) {
1092
+ if (!options. contains (TypeResolutionFlags::SilenceErrors) ) {
1092
1093
TC.diagnose (comp->getIdLoc (), diag::ambiguous_type_base,
1093
1094
comp->getIdentifier ())
1094
1095
.highlight (comp->getIdLoc ());
@@ -1105,7 +1106,7 @@ resolveTopLevelIdentTypeComponent(TypeChecker &TC, DeclContext *DC,
1105
1106
if (current.isNull ()) {
1106
1107
// If we're not allowed to complain or we couldn't fix the
1107
1108
// source, bail out.
1108
- if (!diagnoseErrors )
1109
+ if (options. contains (TypeResolutionFlags::SilenceErrors) )
1109
1110
return ErrorType::get (TC.Context );
1110
1111
1111
1112
return diagnoseUnknownType (TC, DC, nullptr , SourceRange (), comp, options,
@@ -1125,7 +1126,6 @@ static Type resolveNestedIdentTypeComponent(
1125
1126
SourceRange parentRange,
1126
1127
ComponentIdentTypeRepr *comp,
1127
1128
TypeResolutionOptions options,
1128
- bool diagnoseErrors,
1129
1129
GenericTypeResolver *resolver) {
1130
1130
auto maybeApplyGenericArgs = [&](Type memberType) {
1131
1131
// If there are generic arguments, apply them now.
@@ -1151,7 +1151,7 @@ static Type resolveNestedIdentTypeComponent(
1151
1151
AssociatedTypeDecl *inferredAssocType) {
1152
1152
// Diagnose invalid cases.
1153
1153
if (TC.isUnsupportedMemberTypeAccess (parentTy, member)) {
1154
- if (diagnoseErrors ) {
1154
+ if (!options. contains (TypeResolutionFlags::SilenceErrors) ) {
1155
1155
if (parentTy->is <UnboundGenericType>())
1156
1156
diagnoseUnboundGenericType (TC, parentTy, parentRange.End );
1157
1157
else if (parentTy->isExistentialType () &&
@@ -1172,16 +1172,16 @@ static Type resolveNestedIdentTypeComponent(
1172
1172
// be an unbound generic.
1173
1173
if (options & TypeResolutionFlags::TypeAliasUnderlyingType) {
1174
1174
if (parentTy->is <UnboundGenericType>()) {
1175
- if (diagnoseErrors )
1175
+ if (!options. contains (TypeResolutionFlags::SilenceErrors) )
1176
1176
diagnoseUnboundGenericType (TC, parentTy, parentRange.End );
1177
1177
1178
1178
return ErrorType::get (TC.Context );
1179
1179
}
1180
1180
}
1181
1181
1182
1182
// Diagnose a bad conformance reference if we need to.
1183
- if (inferredAssocType && diagnoseErrors && memberType &&
1184
- memberType->hasError ()) {
1183
+ if (!options. contains (TypeResolutionFlags::SilenceErrors) &&
1184
+ inferredAssocType && memberType && memberType->hasError ()) {
1185
1185
maybeDiagnoseBadConformanceRef (TC, DC, parentTy, comp->getLoc (),
1186
1186
inferredAssocType);
1187
1187
}
@@ -1252,7 +1252,7 @@ static Type resolveNestedIdentTypeComponent(
1252
1252
// FIXME: Could try to apply generic arguments first, and see whether
1253
1253
// that resolves things. But do we really want that to succeed?
1254
1254
if (memberTypes.size () > 1 ) {
1255
- if (diagnoseErrors )
1255
+ if (!options. contains (TypeResolutionFlags::SilenceErrors) )
1256
1256
TC.diagnoseAmbiguousMemberType (parentTy, parentRange,
1257
1257
comp->getIdentifier (), comp->getIdLoc (),
1258
1258
memberTypes);
@@ -1266,7 +1266,7 @@ static Type resolveNestedIdentTypeComponent(
1266
1266
if (!memberTypes) {
1267
1267
// If we're not allowed to complain or we couldn't fix the
1268
1268
// source, bail out.
1269
- if (!diagnoseErrors )
1269
+ if (options. contains (TypeResolutionFlags::SilenceErrors) )
1270
1270
return ErrorType::get (TC.Context );
1271
1271
1272
1272
memberType = diagnoseUnknownType (TC, DC, parentTy, parentRange, comp,
@@ -1288,22 +1288,20 @@ static Type resolveIdentTypeComponent(
1288
1288
TypeChecker &TC, DeclContext *DC,
1289
1289
ArrayRef<ComponentIdentTypeRepr *> components,
1290
1290
TypeResolutionOptions options,
1291
- bool diagnoseErrors,
1292
1291
GenericTypeResolver *resolver) {
1293
1292
auto comp = components.back ();
1294
1293
1295
1294
// The first component uses unqualified lookup.
1296
1295
auto parentComps = components.slice (0 , components.size ()-1 );
1297
1296
if (parentComps.empty ()) {
1298
- return resolveTopLevelIdentTypeComponent (TC, DC, comp, options,
1299
- diagnoseErrors, resolver);
1297
+ return resolveTopLevelIdentTypeComponent (TC, DC, comp, options, resolver);
1300
1298
}
1301
1299
1302
1300
// All remaining components use qualified lookup.
1303
1301
1304
1302
// Resolve the parent type.
1305
1303
Type parentTy = resolveIdentTypeComponent (TC, DC, parentComps, options,
1306
- diagnoseErrors, resolver);
1304
+ resolver);
1307
1305
if (!parentTy || parentTy->hasError ()) return parentTy;
1308
1306
1309
1307
SourceRange parentRange (parentComps.front ()->getIdLoc (),
@@ -1312,8 +1310,7 @@ static Type resolveIdentTypeComponent(
1312
1310
// Resolve the nested type.
1313
1311
return resolveNestedIdentTypeComponent (TC, DC, parentTy,
1314
1312
parentRange, comp,
1315
- options, diagnoseErrors,
1316
- resolver);
1313
+ options, resolver);
1317
1314
}
1318
1315
1319
1316
static bool diagnoseAvailability (IdentTypeRepr *IdType,
@@ -1373,19 +1370,18 @@ Type TypeChecker::resolveIdentifierType(
1373
1370
DeclContext *DC,
1374
1371
IdentTypeRepr *IdType,
1375
1372
TypeResolutionOptions options,
1376
- bool diagnoseErrors,
1377
1373
GenericTypeResolver *resolver) {
1378
1374
assert (resolver && " Missing generic type resolver" );
1379
1375
1380
1376
auto ComponentRange = IdType->getComponentRange ();
1381
1377
auto Components = llvm::makeArrayRef (ComponentRange.begin (),
1382
1378
ComponentRange.end ());
1383
1379
Type result = resolveIdentTypeComponent (*this , DC, Components, options,
1384
- diagnoseErrors, resolver);
1380
+ resolver);
1385
1381
if (!result) return nullptr ;
1386
1382
1387
1383
if (auto moduleTy = result->getAs <ModuleType>()) {
1388
- if (diagnoseErrors ) {
1384
+ if (!options. contains (TypeResolutionFlags::SilenceErrors) ) {
1389
1385
auto moduleName = moduleTy->getModule ()->getName ();
1390
1386
diagnose (Components.back ()->getIdLoc (),
1391
1387
diag::use_undeclared_type, moduleName);
@@ -1410,7 +1406,8 @@ Type TypeChecker::resolveIdentifierType(
1410
1406
// To support this, inside inheritance clauses we allow references to
1411
1407
// protocols that are unavailable in the current type refinement context.
1412
1408
1413
- if (!(options & TypeResolutionFlags::AllowUnavailable) &&
1409
+ if (!options.contains (TypeResolutionFlags::SilenceErrors) &&
1410
+ !options.contains (TypeResolutionFlags::AllowUnavailable) &&
1414
1411
diagnoseAvailability (IdType, DC, *this ,
1415
1412
options.contains (TypeResolutionFlags::AllowUnavailableProtocol))) {
1416
1413
Components.back ()->setInvalid ();
@@ -1594,7 +1591,7 @@ Type TypeResolver::resolveType(TypeRepr *repr, TypeResolutionOptions options) {
1594
1591
case TypeReprKind::GenericIdent:
1595
1592
case TypeReprKind::CompoundIdent:
1596
1593
return TC.resolveIdentifierType (DC, cast<IdentTypeRepr>(repr), options,
1597
- /* diagnoseErrors */ true , Resolver);
1594
+ Resolver);
1598
1595
1599
1596
case TypeReprKind::Function: {
1600
1597
if (!(options & TypeResolutionFlags::SILType)) {
0 commit comments