@@ -303,80 +303,19 @@ LookupResult &ConstraintSystem::lookupMember(Type base, DeclNameRef name) {
303303 return *result;
304304}
305305
306- ArrayRef<Type> ConstraintSystem::
307- getAlternativeLiteralTypes (KnownProtocolKind kind) {
308- unsigned index;
309-
310- switch (kind) {
311- #define PROTOCOL_WITH_NAME (Id, Name ) \
312- case KnownProtocolKind::Id: llvm_unreachable (" Not a literal protocol" );
313- #define EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME (Id, Name, __, ___ )
314- #include " swift/AST/KnownProtocols.def"
315-
316- case KnownProtocolKind::ExpressibleByArrayLiteral: index = 0 ; break ;
317- case KnownProtocolKind::ExpressibleByDictionaryLiteral:index = 1 ; break ;
318- case KnownProtocolKind::ExpressibleByExtendedGraphemeClusterLiteral: index = 2 ;
319- break ;
320- case KnownProtocolKind::ExpressibleByFloatLiteral: index = 3 ; break ;
321- case KnownProtocolKind::ExpressibleByIntegerLiteral: index = 4 ; break ;
322- case KnownProtocolKind::ExpressibleByStringInterpolation: index = 5 ; break ;
323- case KnownProtocolKind::ExpressibleByStringLiteral: index = 6 ; break ;
324- case KnownProtocolKind::ExpressibleByNilLiteral: index = 7 ; break ;
325- case KnownProtocolKind::ExpressibleByBooleanLiteral: index = 8 ; break ;
326- case KnownProtocolKind::ExpressibleByUnicodeScalarLiteral: index = 9 ; break ;
327- case KnownProtocolKind::ExpressibleByColorLiteral: index = 10 ; break ;
328- case KnownProtocolKind::ExpressibleByImageLiteral: index = 11 ; break ;
329- case KnownProtocolKind::ExpressibleByFileReferenceLiteral: index = 12 ; break ;
330- }
331- static_assert (NumAlternativeLiteralTypes == 13 , " Wrong # of literal types" );
332-
333- // If we already looked for alternative literal types, return those results.
334- if (AlternativeLiteralTypes[index])
335- return *AlternativeLiteralTypes[index];
336-
337- SmallVector<Type, 4 > types;
338-
339- // Some literal kinds are related.
340- switch (kind) {
341- #define PROTOCOL_WITH_NAME (Id, Name ) \
342- case KnownProtocolKind::Id: llvm_unreachable (" Not a literal protocol" );
343- #define EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME (Id, Name, __, ___ )
344- #include " swift/AST/KnownProtocols.def"
345-
346- case KnownProtocolKind::ExpressibleByArrayLiteral:
347- case KnownProtocolKind::ExpressibleByDictionaryLiteral:
348- break ;
349-
350- case KnownProtocolKind::ExpressibleByExtendedGraphemeClusterLiteral:
351- case KnownProtocolKind::ExpressibleByStringInterpolation:
352- case KnownProtocolKind::ExpressibleByStringLiteral:
353- case KnownProtocolKind::ExpressibleByUnicodeScalarLiteral:
354- break ;
355-
356- case KnownProtocolKind::ExpressibleByIntegerLiteral:
306+ ArrayRef<Type>
307+ ConstraintSystem::getAlternativeLiteralTypes (KnownProtocolKind kind,
308+ SmallVectorImpl<Type> &scratch) {
309+ assert (scratch.empty ());
310+ if (kind == KnownProtocolKind::ExpressibleByIntegerLiteral) {
357311 // Integer literals can be treated as floating point literals.
358312 if (auto floatProto = getASTContext ().getProtocol (
359313 KnownProtocolKind::ExpressibleByFloatLiteral)) {
360- if (auto defaultType = TypeChecker::getDefaultType (floatProto, DC)) {
361- types.push_back (defaultType);
362- }
314+ if (auto defaultType = TypeChecker::getDefaultType (floatProto, DC))
315+ scratch.push_back (defaultType);
363316 }
364- break ;
365-
366- case KnownProtocolKind::ExpressibleByFloatLiteral:
367- break ;
368-
369- case KnownProtocolKind::ExpressibleByNilLiteral:
370- case KnownProtocolKind::ExpressibleByBooleanLiteral:
371- break ;
372- case KnownProtocolKind::ExpressibleByColorLiteral:
373- case KnownProtocolKind::ExpressibleByImageLiteral:
374- case KnownProtocolKind::ExpressibleByFileReferenceLiteral:
375- break ;
376317 }
377-
378- AlternativeLiteralTypes[index] = allocateCopy (types);
379- return *AlternativeLiteralTypes[index];
318+ return scratch;
380319}
381320
382321bool ConstraintSystem::containsCodeCompletionLoc (Expr *expr) const {
0 commit comments