From 9c9ca4d2596bd492d7101d06ee1670be99950f12 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 5 Jun 2022 07:42:33 -0700 Subject: [PATCH] Fixed params/varargs in function/delegate typerefs --- IDEHelper/Compiler/BfDefBuilder.cpp | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 30 +++++++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index 2c5c8068..03aa0cc5 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -656,7 +656,7 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio if (paramIdx == (int)methodDeclaration->mParams.size() - 1) paramDef->mParamKind = BfParamKind_VarArgs; else - Fail("Varargs specifier must be the last parameter", methodDef->mParams[paramIdx - 1]->mParamDeclaration); + Fail("Varargs specifier must be the last parameter", paramDecl); } } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 287c1b9a..222db82e 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -8730,10 +8730,10 @@ BfType* BfModule::ResolveGenericType(BfType* unspecializedType, BfTypeVector* ty directTypeRef->Init(paramType); BfParameterDef* paramDef = new BfParameterDef(); - + paramDef->mParamKind = unspecializedParamDef->mParamKind; paramDef->mTypeRef = directTypeRef; paramDef->mName = unspecializedParamDef->mName; - methodDef->mParams.push_back(paramDef); + methodDef->mParams.push_back(paramDef); delegateInfo->mParams.Add(paramType); } @@ -11905,7 +11905,31 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula if ((paramIdx == 0) && (functionThisType != NULL)) paramDef->mParamKind = BfParamKind_ExplicitThis; methodDef->mParams.push_back(paramDef); - + if ((param->mModToken != NULL) && (param->mModToken->mToken == BfToken_Params)) + { + if (paramIdx == (int)paramTypes.size() - 1) + paramDef->mParamKind = BfParamKind_Params; + else + { + failed = true; + Fail("Params parameter must be the last parameter", param); + } + } + + if (auto dotTypeRef = BfNodeDynCast(paramDef->mTypeRef)) + { + if (dotTypeRef->mDotToken->mToken == BfToken_DotDotDot) + { + if (paramIdx == (int)paramTypes.size() - 1) + paramDef->mParamKind = BfParamKind_VarArgs; + else + { + failed = true; + Fail("Varargs specifier must be the last parameter", param); + } + } + } + delegateInfo->mParams.Add(paramType); delegateType->mGenericDepth = BF_MAX(delegateType->mGenericDepth, paramType->GetGenericDepth() + 1);