1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Made Compiler 'Caller' values work inside mixins

This commit is contained in:
Brian Fiete 2021-01-31 10:23:39 -08:00
parent 1519a60104
commit 8406e00a60
3 changed files with 52 additions and 0 deletions

View file

@ -6889,6 +6889,12 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
argValue = BfTypedValue(mModule->GetStringObjectValue(projectName),
mModule->ResolveTypeDef(mModule->mCompiler->mStringTypeDef));
}
else if (strcmp(globalVar->mName, "#ProjectName") == 0)
{
String projectName = methodInstance->mMethodDef->mDeclaringType->mProject->mName;
argValue = BfTypedValue(mModule->GetStringObjectValue(projectName),
mModule->ResolveTypeDef(mModule->mCompiler->mStringTypeDef));
}
else
{
argValue = mModule->GetCompilerFieldValue(globalVar->mName);
@ -15185,6 +15191,7 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo
auto rootMethodState = mModule->mCurMethodState->GetRootMethodState();
BfMixinState* mixinState = rootMethodState->mMixinStates.Alloc();
mixinState->mInjectFilePosition = mModule->mCurFilePosition;
mixinState->mPrevMixinState = curMethodState->mMixinState;
mixinState->mLocalsStartIdx = (int)mModule->mCurMethodState->mLocals.size();
mixinState->mMixinMethodInstance = methodInstance;

View file

@ -13521,6 +13521,50 @@ BfTypedValue BfModule::GetCompilerFieldValue(const StringImpl& str)
if (mProject != NULL)
return BfTypedValue(GetStringObjectValue(mProject->mName), ResolveTypeDef(mCompiler->mStringTypeDef));
}
if (mCurMethodState->mMixinState != NULL)
{
if (str == "#CallerLineNum")
{
return BfTypedValue(GetConstValue(mCurMethodState->mMixinState->mInjectFilePosition.mCurLine + 1), GetPrimitiveType(BfTypeCode_Int32));
}
else if (str == "#CallerFilePath")
{
String filePath = "";
if (mCurMethodState->mMixinState->mInjectFilePosition.mFileInstance != NULL)
filePath = mCurMethodState->mMixinState->mInjectFilePosition.mFileInstance->mParser->mFileName;
return BfTypedValue(GetStringObjectValue(filePath), ResolveTypeDef(mCompiler->mStringTypeDef));
}
else if (str == "#CallerFileName")
{
String filePath = "";
if (mCurMethodState->mMixinState->mInjectFilePosition.mFileInstance != NULL)
filePath = mCurMethodState->mMixinState->mInjectFilePosition.mFileInstance->mParser->mFileName;
return BfTypedValue(GetStringObjectValue(GetFileName(filePath)), ResolveTypeDef(mCompiler->mStringTypeDef));
}
else if (str == "#CallerFileDir")
{
String filePath = "";
if (mCurMethodState->mMixinState->mInjectFilePosition.mFileInstance != NULL)
filePath = mCurMethodState->mMixinState->mInjectFilePosition.mFileInstance->mParser->mFileName;
return BfTypedValue(GetStringObjectValue(GetFileDir(filePath)), ResolveTypeDef(mCompiler->mStringTypeDef));
}
else if (str == "#CallerMemberName")
{
String memberName = "";
if (mCurMethodState->mMixinState->mMixinMethodInstance)
memberName = MethodToString(mCurMethodState->mMixinState->mMixinMethodInstance);
return BfTypedValue(GetStringObjectValue(memberName), ResolveTypeDef(mCompiler->mStringTypeDef));
}
else if (str == "#CallerProject")
{
BfProject* project = NULL;
project = mCurMethodState->mMixinState->mMixinMethodInstance->mMethodDef->mDeclaringType->mProject;
if (project != NULL)
return BfTypedValue(GetStringObjectValue(mProject->mName), ResolveTypeDef(mCompiler->mStringTypeDef));
}
}
if (str == "#TimeLocal")
{
time_t rawtime;

View file

@ -767,6 +767,7 @@ public:
BfAstNode* mSource;
BfScopeData* mCallerScope;
BfScopeData* mTargetScope; // Equals caller scope unless user explicitly calls specifies scope override
BfFilePosition mInjectFilePosition;
BfMethodInstance* mMixinMethodInstance;
BfAstNode* mResultExpr;
int mLocalsStartIdx;