@@ -183,9 +183,6 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
183
183
#define FUNC_DECL (Name, Id ) FuncDecl *Get##Name = nullptr ;
184
184
#include " swift/AST/KnownDecls.def"
185
185
186
- // / Swift.Bool.init(_builtinBooleanLiteral:)
187
- ConstructorDecl *BoolBuiltinInitDecl = nullptr ;
188
-
189
186
// / func ==(Int, Int) -> Bool
190
187
FuncDecl *EqualIntDecl = nullptr ;
191
188
@@ -277,6 +274,10 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
277
274
// / to the original property with the delegate.
278
275
llvm::DenseMap<const VarDecl *, VarDecl *> OriginalDelegatedProperties;
279
276
277
+ // / The builtin initializer witness for a literal. Used when building
278
+ // / LiteralExprs in fully-checked AST.
279
+ llvm::DenseMap<const NominalTypeDecl *, ConcreteDeclRef> BuiltinInitWitness;
280
+
280
281
// / Structure that captures data that is segregated into different
281
282
// / arenas.
282
283
struct Arena {
@@ -963,27 +964,80 @@ lookupOperatorFunc(const ASTContext &ctx, StringRef oper, Type contextType,
963
964
return nullptr ;
964
965
}
965
966
966
- ConstructorDecl *ASTContext::getBoolBuiltinInitDecl () const {
967
- if (getImpl ().BoolBuiltinInitDecl )
968
- return getImpl ().BoolBuiltinInitDecl ;
967
+ ConcreteDeclRef ASTContext::getBoolBuiltinInitDecl () const {
968
+ auto fn = [&](ASTContext &ctx) {
969
+ return DeclName (ctx, DeclBaseName::createConstructor (),
970
+ { Id_builtinBooleanLiteral });
971
+ };
972
+ auto builtinProtocolKind =
973
+ KnownProtocolKind::ExpressibleByBuiltinBooleanLiteral;
974
+ return getBuiltinInitDecl (getBoolDecl (), builtinProtocolKind, fn);
975
+ }
969
976
970
- if (!getBoolDecl ())
971
- return nullptr ;
977
+ ConcreteDeclRef
978
+ ASTContext::getIntBuiltinInitDecl (NominalTypeDecl *intDecl) const {
979
+ auto fn = [&](ASTContext &ctx) {
980
+ return DeclName (ctx, DeclBaseName::createConstructor (),
981
+ { Id_builtinIntegerLiteral });
982
+ };
983
+ auto builtinProtocolKind =
984
+ KnownProtocolKind::ExpressibleByBuiltinIntegerLiteral;
985
+ return getBuiltinInitDecl (intDecl, builtinProtocolKind, fn);
986
+ }
972
987
973
- DeclName initName (*const_cast <ASTContext *>(this ),
974
- DeclBaseName::createConstructor (),
975
- { Id_builtinBooleanLiteral });
976
- auto members = getBoolDecl ()->lookupDirect (initName);
988
+ ConcreteDeclRef
989
+ ASTContext::getFloatBuiltinInitDecl (NominalTypeDecl *floatDecl) const {
990
+ auto fn = [&](ASTContext &ctx) {
991
+ return DeclName (ctx, DeclBaseName::createConstructor (),
992
+ { Id_builtinFloatLiteral });
993
+ };
977
994
978
- if (members.size () != 1 )
979
- return nullptr ;
995
+ auto builtinProtocolKind =
996
+ KnownProtocolKind::ExpressibleByBuiltinFloatLiteral;
997
+ return getBuiltinInitDecl (floatDecl, builtinProtocolKind, fn);
998
+ }
999
+
1000
+ ConcreteDeclRef
1001
+ ASTContext::getStringBuiltinInitDecl (NominalTypeDecl *stringDecl) const {
1002
+ auto fn = [&](ASTContext &ctx) {
1003
+ return DeclName (ctx, DeclBaseName::createConstructor (),
1004
+ { Id_builtinStringLiteral,
1005
+ getIdentifier (" utf8CodeUnitCount" ),
1006
+ getIdentifier (" isASCII" ) });
1007
+ };
1008
+
1009
+ auto builtinProtocolKind =
1010
+ KnownProtocolKind::ExpressibleByBuiltinStringLiteral;
1011
+ return getBuiltinInitDecl (stringDecl, builtinProtocolKind, fn);
1012
+ }
1013
+
1014
+ ConcreteDeclRef
1015
+ ASTContext::getBuiltinInitDecl (NominalTypeDecl *decl,
1016
+ KnownProtocolKind builtinProtocolKind,
1017
+ llvm::function_ref<DeclName (ASTContext &ctx)> initName) const {
1018
+ auto &witness = getImpl ().BuiltinInitWitness [decl];
1019
+ if (witness)
1020
+ return witness;
980
1021
981
- if (auto init = dyn_cast<ConstructorDecl>(members[0 ])) {
982
- getImpl ().BoolBuiltinInitDecl = init;
983
- return init;
1022
+ auto type = decl->getDeclaredType ();
1023
+ auto builtinProtocol = getProtocol (builtinProtocolKind);
1024
+ auto builtinConformance = getStdlibModule ()->lookupConformance (
1025
+ type, builtinProtocol);
1026
+ if (!builtinConformance) {
1027
+ assert (false && " Missing required conformance" );
1028
+ witness = ConcreteDeclRef ();
1029
+ return witness;
984
1030
}
985
1031
986
- return nullptr ;
1032
+ auto *ctx = const_cast <ASTContext *>(this );
1033
+ witness = builtinConformance->getWitnessByName (type, initName (*ctx));
1034
+ if (!witness) {
1035
+ assert (false && " Missing required witness" );
1036
+ witness = ConcreteDeclRef ();
1037
+ return witness;
1038
+ }
1039
+
1040
+ return witness;
987
1041
}
988
1042
989
1043
FuncDecl *ASTContext::getEqualIntDecl () const {
0 commit comments