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:
parent
1519a60104
commit
8406e00a60
3 changed files with 52 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue