diff --git a/IDEHelper/Compiler/BfAst.cpp b/IDEHelper/Compiler/BfAst.cpp index d0acb927..ed99bb21 100644 --- a/IDEHelper/Compiler/BfAst.cpp +++ b/IDEHelper/Compiler/BfAst.cpp @@ -738,6 +738,16 @@ bool BfAstNode::IsMissingSemicolon() { if (auto deferStmt = BfNodeDynCast(this)) return BfNodeDynCastExact(deferStmt->mTargetNode) == NULL; + if (auto stmt = BfNodeDynCast(this)) + { + if (auto repeatStmt = BfNodeDynCast(this)) + { + if (repeatStmt->mWhileToken == NULL) + return false; + } + else + return false; + } if (auto stmt = BfNodeDynCast(this)) return stmt->mTrailingSemicolon == NULL; diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 91d79d29..24d0705e 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -3891,8 +3891,8 @@ void BfCompiler::ProcessAutocompleteTempType() if (fieldInstance->mConstIdx != -1) { auto constant = typeInst->mConstHolder->GetConstantById(fieldInstance->mConstIdx); - auto retVal = module->ConstantToCurrent(constant, typeInst->mConstHolder, typeInst); - BfTypedValue typedValue = BfTypedValue(retVal, typeInst); + auto retVal = module->ConstantToCurrent(constant, typeInst->mConstHolder, fieldInstance->mResolvedType); + BfTypedValue typedValue = BfTypedValue(retVal, fieldInstance->mResolvedType); autoComplete->CheckResult(fieldDef->GetRefNode(), typedValue); } } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index cfd5dedd..6f6eee04 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -1176,12 +1176,23 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst (targetTypeInstance != NULL) && (targetTypeInstance->IsObject())) { mModule->PopulateType(targetTypeInstance, BfPopulateType_DataAndMethods); - BfVirtualMethodEntry& vEntry = targetTypeInstance->mVirtualMethodTable[methodInstance->mVirtualTableIdx]; - auto implMethod = (BfMethodInstance*)vEntry.mImplementingMethod; - if (implMethod != methodInstance) + if ((methodInstance->mVirtualTableIdx < targetTypeInstance->mVirtualMethodTable.mSize) && (methodInstance->mVirtualTableIdx >= 0)) { - SetAndRestoreValue prevBypassVirtual(mBypassVirtual, true); - return CheckMethod(targetTypeInstance, implMethod->GetOwner(), implMethod->mMethodDef, isFailurePass); + BfVirtualMethodEntry& vEntry = targetTypeInstance->mVirtualMethodTable[methodInstance->mVirtualTableIdx]; + auto implMethod = (BfMethodInstance*)vEntry.mImplementingMethod; + if (implMethod != methodInstance) + { + SetAndRestoreValue prevBypassVirtual(mBypassVirtual, true); + return CheckMethod(targetTypeInstance, implMethod->GetOwner(), implMethod->mMethodDef, isFailurePass); + } + } + else + { + // Being in autocomplete mode is the only excuse for not having the virtual method table slotted + if ((!mModule->mCompiler->IsAutocomplete()) && (!targetTypeInstance->mTypeFailed)) + { + mModule->AssertErrorState(); + } } } diff --git a/IDEHelper/Compiler/BfParser.cpp b/IDEHelper/Compiler/BfParser.cpp index ea3db6a3..a9deab82 100644 --- a/IDEHelper/Compiler/BfParser.cpp +++ b/IDEHelper/Compiler/BfParser.cpp @@ -3507,7 +3507,9 @@ BF_EXPORT const char* BF_CALLTYPE BfParser_GetDebugExpressionAt(BfParser* bfPars if ((exprNode->IsA()) || (exprNode->IsA()) || - (exprNode->IsA())) + (exprNode->IsA()) || + (exprNode->IsA()) + ) { return NULL; }