diff --git a/BeefLibs/corlib/src/Compiler.bf b/BeefLibs/corlib/src/Compiler.bf index 3c0be7ea..dab43c89 100644 --- a/BeefLibs/corlib/src/Compiler.bf +++ b/BeefLibs/corlib/src/Compiler.bf @@ -267,7 +267,7 @@ namespace System static extern void Comptime_EmitAddInterface(int32 typeId, int32 ifaceTypeId); static extern void Comptime_EmitMethodEntry(int64 methodHandle, StringView text); static extern void Comptime_EmitMethodExit(int64 methodHandle, StringView text); - static extern void Comptime_EmitMixin(String text); + static extern void Comptime_EmitMixin(StringView text); [Comptime(OnlyFromComptime=true)] public static MethodBuilder CreateMethod(Type owner, StringView methodName, Type returnType, MethodFlags methodFlags) @@ -302,14 +302,14 @@ namespace System } [Comptime(ConstEval=true)] - public static void Mixin(String text) + public static void Mixin(StringView text) { if (Compiler.IsComptime) Comptime_EmitMixin(text); } [Comptime] - public static void MixinRoot(String text) + public static void MixinRoot(StringView text) { if (Compiler.IsComptime) Comptime_EmitMixin(text); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index b255a7a4..566a96bb 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3066,6 +3066,11 @@ bool BfExprEvaluator::IsComptime() return (mModule->mIsComptimeModule) || ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0); } +bool BfExprEvaluator::IsConstEval() +{ + return ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0); +} + bool BfExprEvaluator::IsComptimeEntry() { if (mModule->mIsComptimeModule) @@ -3741,7 +3746,7 @@ void BfExprEvaluator::Visit(BfLiteralExpression* literalExpr) void BfExprEvaluator::Visit(BfStringInterpolationExpression* stringInterpolationExpression) { - if (IsComptimeEntry()) + if (IsConstEval()) { mModule->Fail("Const evaluation of string interpolation not allowed", stringInterpolationExpression); } @@ -4267,6 +4272,7 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfIdentifierNode* identifierNode, void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode) { auto autoComplete = GetAutoComplete(); + if (autoComplete != NULL) autoComplete->CheckIdentifier(identifierNode, true); @@ -4276,7 +4282,11 @@ void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode) mModule->CheckTypeRefFixit(identifierNode); if ((autoComplete != NULL) && (autoComplete->CheckFixit(identifierNode))) { - if (mModule->mCurMethodInstance != NULL) + if ((mModule->mCurMethodState != NULL) && (mModule->mCurMethodState->mClosureState != NULL) && (mModule->mCurMethodState->mClosureState->mCapturing)) + { + // During this phase we don't have lambda and local method params available so they would result in erroneous fixits + } + else if (mModule->mCurMethodInstance != NULL) { BfType* fieldType = mExpectingType; if (fieldType == NULL) @@ -5751,6 +5761,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance* } } + if (methodInstance->mReturnType->IsValuelessType()) + return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), returnType); return mModule->GetDefaultTypedValue(returnType, true, BfDefaultValueKind_Undef); } @@ -6920,7 +6932,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu if (methodDef->mMethodType == BfMethodType_Extension) numElements++; - if (IsComptimeEntry()) + if (IsConstEval()) { if ((wantType->IsArray()) || (wantType->IsInstanceOf(mModule->mCompiler->mSpanTypeDef))) { @@ -7410,7 +7422,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu else { // We need to make a temp and get the addr of that - if ((!wantsSplat) && (!argValue.IsValuelessType()) && (!argValue.IsAddr()) && (!IsComptimeEntry())) + if ((!wantsSplat) && (!argValue.IsValuelessType()) && (!argValue.IsAddr()) && (!IsConstEval())) { argValue = mModule->MakeAddressable(argValue); } @@ -7430,7 +7442,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu { if (argValue) { - if (IsComptimeEntry()) + if (IsConstEval()) { auto constant = mModule->mBfIRBuilder->GetConstant(expandedParamsArray.mValue); BF_ASSERT(constant->mConstType == BfConstType_Agg); @@ -8008,7 +8020,7 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst BfIRValue enumValue; BfTypedValue result; - bool wantConst = IsComptimeEntry(); + bool wantConst = IsConstEval(); if (wantConst) { @@ -15158,7 +15170,7 @@ BfTypedValue BfExprEvaluator::MakeCallableTarget(BfAstNode* targetSrc, BfTypedVa if ((target.mType->IsStruct()) && (!target.IsAddr())) { - if (IsComptimeEntry()) + if (IsConstEval()) return target; target = mModule->MakeAddressable(target); } diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index 93d3a70f..50620b48 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -410,6 +410,7 @@ public: virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode); BfAutoComplete* GetAutoComplete(); bool IsComptime(); + bool IsConstEval(); bool IsComptimeEntry(); int GetStructRetIdx(BfMethodInstance* methodInstance, bool forceStatic = false); BfTypedValue SetupNullConditional(BfTypedValue target, BfTokenNode* dotToken); diff --git a/IDEHelper/Compiler/CeMachine.cpp b/IDEHelper/Compiler/CeMachine.cpp index 04e1145a..5d0e51ac 100644 --- a/IDEHelper/Compiler/CeMachine.cpp +++ b/IDEHelper/Compiler/CeMachine.cpp @@ -5078,11 +5078,19 @@ bool CeContext::Execute(CeFunction* startFunction, uint8* startStackPtr, uint8* SetAndRestoreValue prevMethodInstance(mCurModule->mCurMethodInstance, mCallerMethodInstance); SetAndRestoreValue prevTypeInstance(mCurModule->mCurTypeInstance, mCallerTypeInstance); - int32 strInstAddr = *(int32*)((uint8*)stackPtr + 0); +// int32 strInstAddr = *(int32*)((uint8*)stackPtr + 0); +// String emitStr; +// if (!GetStringFromAddr(strInstAddr, emitStr)) +// { +// _Fail("Invalid String"); +// return false; +// } + + addr_ce strViewPtr = *(addr_ce*)((uint8*)stackPtr); String emitStr; - if (!GetStringFromAddr(strInstAddr, emitStr)) + if (!GetStringFromStringView(strViewPtr, emitStr)) { - _Fail("Invalid String"); + _Fail("Invalid StringView"); return false; } diff --git a/IDEHelper/Tests/src/Comptime.bf b/IDEHelper/Tests/src/Comptime.bf index 6bcaef69..f02b0eca 100644 --- a/IDEHelper/Tests/src/Comptime.bf +++ b/IDEHelper/Tests/src/Comptime.bf @@ -424,6 +424,15 @@ namespace Tests } } + [Comptime] + static int GetMixinVal() + { + int a = 23; + Compiler.Mixin("a += 100;"); + Compiler.MixinRoot(scope String("b += 200;")); + return a; + } + [Test] public static void TestBasics() { @@ -493,6 +502,10 @@ namespace Tests GetTupleField.Type tupType1; Test.Assert(typeof(decltype(tupType0)) == typeof(int16)); Test.Assert(typeof(decltype(tupType1)) == typeof(float)); + + int b = 34; + Test.Assert(GetMixinVal() == 123); + Test.Assert(b == 234); } } }