MCPcopy Create free account
hub / github.com/beefytech/Beef / ParseGenericParams

Method ParseGenericParams

IDEHelper/Compiler/BfDefBuilder.cpp:181–366  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

179static int sGenericParamIdx = 0;
180
181void BfDefBuilder::ParseGenericParams(BfGenericParamsDeclaration* genericParamsDecl, BfGenericConstraintsDeclaration* genericConstraints, Array<BfGenericParamDef*>& genericParams, Array<BfExternalConstraintDef>* externConstraintDefs, int outerGenericSize, bool isInGeneric)
182{
183 if (genericParamsDecl != NULL)
184 {
185 int startIdx = (int)genericParams.size();
186 for (int genericParamIdx = 0; genericParamIdx < (int)genericParamsDecl->mGenericParams.size(); genericParamIdx++)
187 {
188 BfIdentifierNode* genericParamNode = genericParamsDecl->mGenericParams[genericParamIdx];
189 String name = genericParamNode->ToString();
190
191 for (int checkParamsIdx = startIdx; checkParamsIdx < (int)genericParams.size(); checkParamsIdx++)
192 {
193 if (genericParams[checkParamsIdx]->mName == name)
194 {
195 Fail("Duplicate generic param name", genericParamNode);
196 }
197 }
198
199 auto checkTypeDef = mCurTypeDef;
200 while (checkTypeDef != NULL)
201 {
202 if (&genericParams != &checkTypeDef->mGenericParamDefs)
203 {
204 for (int checkParamsIdx = 0; checkParamsIdx < (int)checkTypeDef->mGenericParamDefs.size(); checkParamsIdx++)
205 {
206 if (checkTypeDef->mGenericParamDefs[checkParamsIdx]->mName == name)
207 {
208 mPassInstance->Warn(0, "Generic param name has same name as generic param from outer type", genericParamNode);
209 }
210 }
211 }
212
213 checkTypeDef = checkTypeDef->mOuterType;
214 }
215
216 auto genericParamDef = new BfGenericParamDef();
217 genericParamDef->mName = name;
218 genericParamDef->mNameNodes.Add(genericParamNode);
219 genericParamDef->mGenericParamFlags = BfGenericParamFlag_None;
220 genericParams.push_back(genericParamDef);
221 }
222 }
223
224 if (genericConstraints == NULL)
225 return;
226
227 for (BfAstNode* genericConstraintNode : genericConstraints->mGenericConstraints)
228 {
229 auto genericConstraint = BfNodeDynCast<BfGenericConstraint>(genericConstraintNode);
230 if (genericConstraint == NULL)
231 continue;
232 if (genericConstraint->mTypeRef == NULL)
233 continue;
234
235 BfIdentifierNode* nameNode = NULL;
236 BfGenericParamDef* genericParamDef = NULL;
237 if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(genericConstraint->mTypeRef))
238 {

Callers

nothing calls this directly

Calls 11

FailFunction · 0.85
sizeMethod · 0.45
ToStringMethod · 0.45
WarnMethod · 0.45
AddMethod · 0.45
push_backMethod · 0.45
IsEmptyMethod · 0.45
backMethod · 0.45
emptyMethod · 0.45
c_strMethod · 0.45

Tested by

no test coverage detected