@@ -59,13 +59,50 @@ IntrinsicInfo::getOrCreateAttributes(ASTContext &Ctx) const {
59
59
}
60
60
61
61
Type swift::getBuiltinType (ASTContext &Context, StringRef Name) {
62
- if (Name == " FixedArray" ) {
63
- return BuiltinUnboundGenericType::get (TypeKind::BuiltinFixedArray, Context);
62
+ // We first map to a kind using a StringSwitch so that we can perform an
63
+ // exhaustive switch making it easier to know to update this code.
64
+ auto kind =
65
+ llvm::StringSwitch<std::optional<BuiltinTypeKind>>(Name)
66
+ .Case (" FixedArray" , BuiltinTypeKind::BuiltinFixedArray)
67
+ .StartsWith (" Vec" , BuiltinTypeKind::BuiltinVector)
68
+ .Case (" RawPointer" , BuiltinTypeKind::BuiltinRawPointer)
69
+ .Case (" RawUnsafeContinuation" ,
70
+ BuiltinTypeKind::BuiltinRawUnsafeContinuation)
71
+ .Case (" Job" , BuiltinTypeKind::BuiltinJob)
72
+ .Case (" DefaultActorStorage" ,
73
+ BuiltinTypeKind::BuiltinDefaultActorStorage)
74
+ .Case (" NonDefaultDistributedActorStorage" ,
75
+ BuiltinTypeKind::BuiltinNonDefaultDistributedActorStorage)
76
+ .Case (" Executor" , BuiltinTypeKind::BuiltinExecutor)
77
+ .Case (" NativeObject" , BuiltinTypeKind::BuiltinNativeObject)
78
+ .Case (" BridgeObject" , BuiltinTypeKind::BuiltinBridgeObject)
79
+ .Case (" UnsafeValueBuffer" , BuiltinTypeKind::BuiltinUnsafeValueBuffer)
80
+ .Case (" PackIndex" , BuiltinTypeKind::BuiltinPackIndex)
81
+ .StartsWith (" FP" , BuiltinTypeKind::BuiltinFloat)
82
+ .Case (" Word" , BuiltinTypeKind::BuiltinInteger)
83
+ .Case (" IntLiteral" , BuiltinTypeKind::BuiltinIntegerLiteral)
84
+ .StartsWith (" Int" , BuiltinTypeKind::BuiltinInteger)
85
+ .Default ({});
86
+
87
+ // Handle types that are not BuiltinTypeKinds.
88
+ if (!kind) {
89
+ if (Name == " SILToken" )
90
+ return Context.TheSILTokenType ;
91
+
92
+ // AnyObject is the empty class-constrained existential.
93
+ if (Name == " AnyObject" )
94
+ return CanType (ProtocolCompositionType::theAnyObjectType (Context));
95
+
96
+ return Type ();
64
97
}
65
98
66
- // Vectors are VecNxT, where "N" is the number of elements and
67
- // T is the element type.
68
- if (Name.starts_with (" Vec" )) {
99
+ switch (*kind) {
100
+ case BuiltinTypeKind::BuiltinFixedArray:
101
+ return BuiltinUnboundGenericType::get (TypeKind::BuiltinFixedArray, Context);
102
+
103
+ case BuiltinTypeKind::BuiltinVector: {
104
+ // Vectors are VecNxT, where "N" is the number of elements and
105
+ // T is the element type.
69
106
Name = Name.substr (3 );
70
107
StringRef::size_type xPos = Name.find (' x' );
71
108
if (xPos == StringRef::npos)
@@ -82,67 +119,62 @@ Type swift::getBuiltinType(ASTContext &Context, StringRef Name) {
82
119
83
120
return BuiltinVectorType::get (Context, elementType, numElements);
84
121
}
85
-
86
- if (Name == " RawPointer" )
122
+ case BuiltinTypeKind::BuiltinRawPointer:
87
123
return Context.TheRawPointerType ;
88
- if (Name == " RawUnsafeContinuation " )
124
+ case BuiltinTypeKind::BuiltinRawUnsafeContinuation:
89
125
return Context.TheRawUnsafeContinuationType ;
90
- if (Name == " Job " )
126
+ case BuiltinTypeKind::BuiltinJob:
91
127
return Context.TheJobType ;
92
- if (Name == " DefaultActorStorage " )
128
+ case BuiltinTypeKind::BuiltinDefaultActorStorage:
93
129
return Context.TheDefaultActorStorageType ;
94
- if (Name == " NonDefaultDistributedActorStorage " )
130
+ case BuiltinTypeKind::BuiltinNonDefaultDistributedActorStorage:
95
131
return Context.TheNonDefaultDistributedActorStorageType ;
96
- if (Name == " Executor " )
132
+ case BuiltinTypeKind::BuiltinExecutor:
97
133
return Context.TheExecutorType ;
98
- if (Name == " NativeObject " )
134
+ case BuiltinTypeKind::BuiltinNativeObject:
99
135
return Context.TheNativeObjectType ;
100
- if (Name == " BridgeObject " )
136
+ case BuiltinTypeKind::BuiltinBridgeObject:
101
137
return Context.TheBridgeObjectType ;
102
- if (Name == " SILToken" )
103
- return Context.TheSILTokenType ;
104
- if (Name == " UnsafeValueBuffer" )
138
+ case BuiltinTypeKind::BuiltinUnsafeValueBuffer:
105
139
return Context.TheUnsafeValueBufferType ;
106
- if (Name == " PackIndex " )
140
+ case BuiltinTypeKind::BuiltinPackIndex:
107
141
return Context.ThePackIndexType ;
108
-
109
- if (Name == " FPIEEE32" )
110
- return Context.TheIEEE32Type ;
111
- if (Name == " FPIEEE64" )
112
- return Context.TheIEEE64Type ;
142
+ case BuiltinTypeKind::BuiltinFloat:
143
+ // Target specific FP types.
144
+ if (Name == " FPIEEE32" )
145
+ return Context.TheIEEE32Type ;
146
+ if (Name == " FPIEEE64" )
147
+ return Context.TheIEEE64Type ;
148
+ if (Name == " FPIEEE16" )
149
+ return Context.TheIEEE16Type ;
150
+ if (Name == " FPIEEE80" )
151
+ return Context.TheIEEE80Type ;
152
+ if (Name == " FPIEEE128" )
153
+ return Context.TheIEEE128Type ;
154
+ if (Name == " FPPPC128" )
155
+ return Context.ThePPC128Type ;
156
+ return Type ();
157
+ case BuiltinTypeKind::BuiltinInteger:
158
+ if (Name == " Word" )
159
+ return BuiltinIntegerType::getWordType (Context);
113
160
114
- if (Name == " Word" )
115
- return BuiltinIntegerType::getWordType (Context);
161
+ if (Name == " Int" ) {
162
+ return BuiltinUnboundGenericType::get (TypeKind::BuiltinInteger, Context);
163
+ }
116
164
117
- if (Name == " IntLiteral" )
165
+ // Handle 'int8' and friends.
166
+ if (Name.substr (0 , 3 ) == " Int" ) {
167
+ unsigned BitWidth;
168
+ if (!Name.substr (3 ).getAsInteger (10 , BitWidth) && BitWidth <= 2048 &&
169
+ BitWidth != 0 ) // Cap to prevent unsound things.
170
+ return BuiltinIntegerType::get (BitWidth, Context);
171
+ }
172
+ return Type ();
173
+ case BuiltinTypeKind::BuiltinIntegerLiteral:
118
174
return Context.TheIntegerLiteralType ;
119
-
120
- if (Name == " Int" ) {
121
- return BuiltinUnboundGenericType::get (TypeKind::BuiltinInteger, Context);
122
- }
123
-
124
- // Handle 'int8' and friends.
125
- if (Name.substr (0 , 3 ) == " Int" ) {
126
- unsigned BitWidth;
127
- if (!Name.substr (3 ).getAsInteger (10 , BitWidth) &&
128
- BitWidth <= 2048 && BitWidth != 0 ) // Cap to prevent unsound things.
129
- return BuiltinIntegerType::get (BitWidth, Context);
175
+ case BuiltinTypeKind::BuiltinUnboundGeneric:
176
+ return Type ();
130
177
}
131
-
132
- // Target specific FP types.
133
- if (Name == " FPIEEE16" )
134
- return Context.TheIEEE16Type ;
135
- if (Name == " FPIEEE80" )
136
- return Context.TheIEEE80Type ;
137
- if (Name == " FPIEEE128" )
138
- return Context.TheIEEE128Type ;
139
- if (Name == " FPPPC128" )
140
- return Context.ThePPC128Type ;
141
-
142
- // AnyObject is the empty class-constrained existential.
143
- if (Name == " AnyObject" )
144
- return CanType (
145
- ProtocolCompositionType::theAnyObjectType (Context));
146
178
147
179
return Type ();
148
180
}
0 commit comments