1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/IDEHelper/Compiler/BfExprEvaluator.h

591 lines
26 KiB
C
Raw Normal View History

2019-08-23 11:56:54 -07:00
#pragma once
#include "BfCompiler.h"
#include "BfSourceClassifier.h"
NS_BF_BEGIN
enum BfArgFlags
{
2022-07-26 13:27:03 -04:00
BfArgFlag_None = 0,
2019-08-23 11:56:54 -07:00
BfArgFlag_DelegateBindAttempt = 1,
BfArgFlag_LambdaBindAttempt = 2,
BfArgFlag_UnqualifiedDotAttempt = 4,
BfArgFlag_DeferredValue = 8,
BfArgFlag_FromParamComposite = 0x10,
BfArgFlag_UntypedDefault = 0x20,
BfArgFlag_DeferredEval = 0x40,
BfArgFlag_ExpectedTypeCast = 0x80,
BfArgFlag_VariableDeclaration = 0x100,
2020-09-07 15:24:42 -07:00
BfArgFlag_ParamsExpr = 0x200,
2020-11-11 05:46:52 -08:00
BfArgFlag_UninitializedExpr = 0x400,
BfArgFlag_StringInterpolateFormat = 0x800,
2021-01-02 08:11:07 -08:00
BfArgFlag_StringInterpolateArg = 0x1000,
2022-06-14 06:57:24 -07:00
BfArgFlag_Cascade = 0x2000,
2022-06-24 18:41:54 -07:00
BfArgFlag_Volatile = 0x8000,
BfArgFlag_Finalized = 0x10000,
2019-08-23 11:56:54 -07:00
};
enum BfResolveArgsFlags
{
BfResolveArgsFlag_None = 0,
BfResolveArgsFlag_DeferFixits = 1,
BfResolveArgsFlag_DeferParamValues = 2, // We still evaluate but don't generate code until the method is selected (for SkipCall support)
BfResolveArgsFlag_DeferParamEval = 4,
BfResolveArgsFlag_AllowUnresolvedTypes = 8,
2021-10-31 10:17:41 -07:00
BfResolveArgsFlag_InsideStringInterpolationAlloc = 0x10,
BfResolveArgsFlag_FromIndexer = 0x20,
BfResolveArgsFlag_DeferStrings = 0x40
};
2019-08-23 11:56:54 -07:00
enum BfResolveArgFlags
{
BfResolveArgFlag_None = 0,
2021-01-14 06:24:34 -08:00
BfResolveArgFlag_FromGeneric = 1,
BfResolveArgFlag_FromGenericParam = 2
2019-08-23 11:56:54 -07:00
};
enum BfCreateCallFlags
{
BfCreateCallFlags_None,
BfCreateCallFlags_BypassVirtual = 1,
BfCreateCallFlags_SkipThis = 2,
BfCreateCallFlags_AllowImplicitRef = 4,
BfCreateCallFlags_TailCall = 8,
BfCreateCallFlags_GenericParamThis = 0x10
};
2019-08-23 11:56:54 -07:00
class BfResolvedArg
{
public:
BfTypedValue mTypedValue;
2022-06-06 11:27:07 -07:00
BfTypedValue mUncastedTypedValue;
2022-06-24 18:41:54 -07:00
BfIdentifierNode* mNameNode;
2019-08-23 11:56:54 -07:00
BfType* mResolvedType;
BfAstNode* mExpression;
2022-07-26 13:27:03 -04:00
BfArgFlags mArgFlags;
2019-08-23 11:56:54 -07:00
BfType* mExpectedType;
BfType* mBestBoundType;
bool mWantsRecalc;
public:
BfResolvedArg()
{
2022-06-24 18:41:54 -07:00
mNameNode = NULL;
2019-08-23 11:56:54 -07:00
mResolvedType = NULL;
mExpression = NULL;
mArgFlags = BfArgFlag_None;
mExpectedType = NULL;
mBestBoundType = NULL;
mWantsRecalc = false;
}
bool IsDeferredEval()
{
return (mArgFlags & (BfArgFlag_DelegateBindAttempt | BfArgFlag_LambdaBindAttempt | BfArgFlag_UnqualifiedDotAttempt | BfArgFlag_UntypedDefault | BfArgFlag_DeferredEval)) != 0;
}
bool IsDeferredValue()
{
return (mArgFlags & (BfArgFlag_DelegateBindAttempt | BfArgFlag_LambdaBindAttempt | BfArgFlag_UnqualifiedDotAttempt | BfArgFlag_UntypedDefault | BfArgFlag_DeferredEval | BfArgFlag_DeferredValue)) != 0;
}
2019-08-23 11:56:54 -07:00
};
struct BfResolvedArgs
{
2022-07-26 13:27:03 -04:00
SizedArray<BfResolvedArg, 4> mResolvedArgs;
2019-08-23 11:56:54 -07:00
BfTokenNode* mOpenToken;
const BfSizedArray<BfExpression*>* mArguments;
2022-07-26 13:27:03 -04:00
const BfSizedArray<BfTokenNode*>* mCommas;
2019-08-23 11:56:54 -07:00
BfTokenNode* mCloseToken;
public:
BfResolvedArgs()
{
mOpenToken = NULL;
mArguments = NULL;
mCommas = NULL;
mCloseToken = NULL;
}
BfResolvedArgs(BfSizedArray<BfExpression*>* args)
{
mOpenToken = NULL;
mArguments = args;
mCommas = NULL;
mCloseToken = NULL;
}
BfResolvedArgs(BfTokenNode* openToken, BfSizedArray<BfExpression*>* args, BfSizedArray<BfTokenNode*>* commas, BfTokenNode* closeToken)
{
mOpenToken = openToken;
mArguments = args;
mCommas = commas;
mCloseToken = closeToken;
}
2020-11-11 05:46:52 -08:00
void Init(BfTokenNode* openToken, BfSizedArray<BfExpression*>* args, BfSizedArray<BfTokenNode*>* commas, BfTokenNode* closeToken)
{
mOpenToken = openToken;
mArguments = args;
mCommas = commas;
mCloseToken = closeToken;
}
2019-08-23 11:56:54 -07:00
void Init(const BfSizedArray<BfExpression*>* args)
{
mOpenToken = NULL;
mArguments = args;
mCommas = NULL;
mCloseToken = NULL;
}
2022-07-26 13:27:03 -04:00
void HandleFixits(BfModule* module);
2019-08-23 11:56:54 -07:00
};
2020-06-03 05:22:11 -07:00
class BfGenericInferContext
{
public:
HashSet<int64> mCheckedTypeSet;
2020-06-03 05:22:11 -07:00
BfModule* mModule;
BfTypeVector* mCheckMethodGenericArguments;
SizedArray<BfIRValue, 4> mPrevArgValues;
2022-07-26 13:27:03 -04:00
int mInferredCount;
2020-06-03 05:22:11 -07:00
public:
BfGenericInferContext()
{
mModule = NULL;
2022-07-26 13:27:03 -04:00
mInferredCount = 0;
}
bool AddToCheckedSet(BfType* argType, BfType* wantType);
bool InferGenericArgument(BfMethodInstance* methodInstance, BfType* argType, BfType* wantType, BfIRValue argValue, bool checkCheckedSet = false);
int GetUnresolvedCount()
{
return (int)mCheckMethodGenericArguments->size() - mInferredCount;
}
2021-01-15 14:28:21 -08:00
bool InferGenericArguments(BfMethodInstance* methodInstance, int srcGenericIdx);
2021-01-14 06:24:34 -08:00
void InferGenericArguments(BfMethodInstance* methodInstance);
2020-06-03 05:22:11 -07:00
};
struct BfMethodGenericArguments
{
2022-07-26 13:27:03 -04:00
BfSizedArray<BfAstNode*>* mArguments;
bool mIsPartial;
bool mIsOpen; // Ends with ...
BfMethodGenericArguments()
{
2022-07-26 13:27:03 -04:00
mArguments = NULL;
mIsPartial = false;
mIsOpen = false;
}
};
2019-08-23 11:56:54 -07:00
class BfMethodMatcher
{
public:
struct BfAmbiguousEntry
{
BfMethodInstance* mMethodInstance;
BfTypeVector mBestMethodGenericArguments;
};
enum MatchFailKind
{
MatchFailKind_None,
MatchFailKind_Protection,
MatchFailKind_CheckedMismatch
};
enum BackupMatchKind
{
BackupMatchKind_None,
BackupMatchKind_TooManyArgs,
2022-07-26 13:27:03 -04:00
BackupMatchKind_EarlyMismatch,
BackupMatchKind_PartialLastArgMatch
};
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
public:
BfAstNode* mTargetSrc;
2020-06-03 05:22:11 -07:00
BfTypedValue mTarget;
BfTypedValue mOrigTarget;
2019-08-23 11:56:54 -07:00
BfModule* mModule;
BfTypeDef* mActiveTypeDef;
2022-07-26 13:27:03 -04:00
String mMethodName;
2019-08-23 11:56:54 -07:00
BfMethodInstance* mInterfaceMethodInstance;
SizedArrayImpl<BfResolvedArg>& mArguments;
BfType* mCheckReturnType;
2019-08-23 11:56:54 -07:00
BfMethodType mMethodType;
BfCheckedKind mCheckedKind;
2022-07-10 07:50:08 -04:00
Array<SizedArray<BfUsingFieldData::MemberRef, 1>*>* mUsingLists;
2022-06-24 18:41:54 -07:00
bool mHasArgNames;
2022-07-26 13:27:03 -04:00
bool mHadExplicitGenericArguments;
bool mHadOpenGenericArguments;
bool mHadPartialGenericArguments;
2022-07-26 13:27:03 -04:00
bool mHasVarArguments;
2020-06-01 07:32:40 -07:00
bool mHadVarConflictingReturnType;
2019-08-23 11:56:54 -07:00
bool mBypassVirtual;
bool mAllowImplicitThis;
bool mAllowImplicitRef;
bool mAllowImplicitWrap;
2019-08-23 11:56:54 -07:00
bool mAllowStatic;
2022-07-26 13:27:03 -04:00
bool mAllowNonStatic;
bool mSkipImplicitParams;
bool mAutoFlushAmbiguityErrors;
BfEvalExprFlags mBfEvalExprFlags;
2022-07-26 13:27:03 -04:00
int mMethodCheckCount;
BfType* mExplicitInterfaceCheck;
2019-08-23 11:56:54 -07:00
MatchFailKind mMatchFailKind;
2022-07-26 13:27:03 -04:00
BfTypeVector mCheckMethodGenericArguments;
2019-08-23 11:56:54 -07:00
BfType* mSelfType; // Only when matching interfaces when 'Self' needs to refer back to the implementing type
BfMethodDef* mBackupMethodDef;
2022-07-26 13:27:03 -04:00
BackupMatchKind mBackupMatchKind;
int mBackupArgMatchCount;
2019-08-23 11:56:54 -07:00
BfMethodDef* mBestMethodDef;
2022-07-26 13:27:03 -04:00
BfTypeInstance* mBestMethodTypeInstance;
2020-06-01 07:32:40 -07:00
BfMethodInstance* mBestRawMethodInstance;
2019-08-23 11:56:54 -07:00
BfModuleMethodInstance mBestMethodInstance;
SizedArray<int, 4> mBestMethodGenericArgumentSrcs;
BfTypeVector mBestMethodGenericArguments;
BfTypeVector mExplicitMethodGenericArguments;
bool mFakeConcreteTarget;
2022-06-24 18:41:54 -07:00
Array<BfAmbiguousEntry> mAmbiguousEntries;
2019-08-23 11:56:54 -07:00
public:
BfTypedValue ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType = NULL, BfResolveArgFlags flags = BfResolveArgFlag_None);
2021-01-15 14:28:21 -08:00
bool InferFromGenericConstraints(BfMethodInstance* methodInstance, BfGenericParamInstance* genericParamInst, BfTypeVector* methodGenericArgs);
2019-08-23 11:56:54 -07:00
void CompareMethods(BfMethodInstance* prevMethodInstance, BfTypeVector* prevGenericArgumentsSubstitute,
2022-07-26 13:27:03 -04:00
BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute,
2019-08-23 11:56:54 -07:00
bool* outNewIsBetter, bool* outNewIsWorse, bool allowSpecializeFail);
2022-07-26 13:27:03 -04:00
void FlushAmbiguityError();
bool IsType(BfTypedValue& val, BfType* type);
int GetMostSpecificType(BfType* lhs, BfType* rhs); // 0, 1, or -1
2019-08-23 11:56:54 -07:00
public:
BfMethodMatcher(BfAstNode* targetSrc, BfModule* module, const StringImpl& methodName, SizedArrayImpl<BfResolvedArg>& arguments, const BfMethodGenericArguments& methodGenericArguments);
BfMethodMatcher(BfAstNode* targetSrc, BfModule* module, BfMethodInstance* interfaceMethodInstance, SizedArrayImpl<BfResolvedArg>& arguments, const BfMethodGenericArguments& methodGenericArguments);
void Init(const BfMethodGenericArguments& methodGenericArguments);
bool IsMemberAccessible(BfTypeInstance* typeInst, BfTypeDef* declaringType);
2020-06-03 05:22:11 -07:00
bool CheckType(BfTypeInstance* typeInstance, BfTypedValue target, bool isFailurePass, bool forceOuterCheck = false);
2019-08-23 11:56:54 -07:00
void CheckOuterTypeStaticMethods(BfTypeInstance* typeInstance, bool isFailurePass);
bool WantsCheckMethod(BfProtectionCheckFlags& flags, BfTypeInstance* startTypeInstance, BfTypeInstance* checkTypeInstance, BfMethodDef* methodDef);
bool CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInstance* typeInstance, BfMethodDef* checkMethod, bool isFailurePass);
void TryDevirtualizeCall(BfTypedValue target, BfTypedValue* origTarget = NULL, BfTypedValue* staticResult = NULL);
2020-06-01 07:32:40 -07:00
bool HasVarGenerics();
bool IsVarCall(BfType*& outReturnType);
2019-08-23 11:56:54 -07:00
};
class BfBaseClassWalker
{
public:
struct Entry
{
BfType* mSrcType;
BfTypeInstance* mTypeInstance;
Entry(BfType* srcType, BfTypeInstance* typeInstance)
{
mSrcType = srcType;
mTypeInstance = typeInstance;
}
Entry()
{
mSrcType = NULL;
mTypeInstance = NULL;
}
bool operator==(const Entry& rhs)
{
return (mSrcType == rhs.mSrcType) && (mTypeInstance == rhs.mTypeInstance);
}
};
BfTypeInstance* mTypes[2];
Array<Entry> mManualList;
bool mMayBeFromInterface;
public:
BfBaseClassWalker();
BfBaseClassWalker(BfType* typeA, BfType* typeB, BfModule* module);
void AddConstraints(BfType* srcType, BfGenericParamInstance* genericParam);
public:
Entry Next();
};
class BfFunctionBindResult
{
public:
BfTypedValue mOrigTarget;
2022-07-26 13:27:03 -04:00
BfTypedValue mTarget;
BfIRValue mFunc;
2019-08-23 11:56:54 -07:00
BfMethodInstance* mMethodInstance;
BfType* mBindType;
2019-08-23 11:56:54 -07:00
bool mSkipThis;
bool mSkipMutCheck;
2019-08-23 11:56:54 -07:00
bool mWantsArgs;
bool mCheckedMultipleMethods;
SizedArray<BfIRValue, 2> mIRArgs;
public:
BfFunctionBindResult()
2022-07-26 13:27:03 -04:00
{
2019-08-23 11:56:54 -07:00
mMethodInstance = NULL;
mBindType = NULL;
mSkipMutCheck = false;
2019-08-23 11:56:54 -07:00
mWantsArgs = false;
mSkipThis = false;
mCheckedMultipleMethods = false;
}
};
struct DeferredTupleAssignData
{
struct Entry
2022-07-26 13:27:03 -04:00
{
2019-08-23 11:56:54 -07:00
BfExpression* mExpr;
BfType* mVarType;
BfAstNode* mVarNameNode;
2019-08-23 11:56:54 -07:00
BfExprEvaluator* mExprEvaluator;
DeferredTupleAssignData* mInnerTuple;
};
Array<Entry> mChildren;
2020-06-04 15:02:46 -07:00
BfTypeInstance* mTupleType;
2019-08-23 11:56:54 -07:00
~DeferredTupleAssignData();
};
enum BfImplicitParamKind
{
BfImplicitParamKind_General,
2022-07-26 13:27:03 -04:00
BfImplicitParamKind_GenericMethodMember,
BfImplicitParamKind_GenericTypeMember,
2019-08-23 11:56:54 -07:00
BfImplicitParamKind_GenericTypeMember_Addr,
};
enum BfLookupFieldFlags
{
BfLookupFieldFlag_None = 0,
BfLookupFieldFlag_IsImplicitThis = 1,
2020-12-06 07:32:01 -08:00
BfLookupFieldFlag_BaseLookup = 2,
BfLookupFieldFlag_CheckingOuter = 4,
BfLookupFieldFlag_IgnoreProtection = 8,
2022-02-19 07:38:05 -05:00
BfLookupFieldFlag_BindOnly = 0x10,
BfLookupFieldFlag_IsFailurePass = 0x20,
BfLookupFieldFlag_IsAnonymous = 0x40
2019-08-23 11:56:54 -07:00
};
enum BfUnaryOpFlags
{
BfUnaryOpFlag_None = 0,
BfUnaryOpFlag_IsConstraintCheck = 1
};
2019-08-23 11:56:54 -07:00
enum BfBinOpFlags
{
BfBinOpFlag_None = 0,
BfBinOpFlag_NoClassify = 1,
2020-08-23 05:42:42 -07:00
BfBinOpFlag_ForceLeftType = 2,
BfBinOpFlag_IgnoreOperatorWithWrongResult = 4,
BfBinOpFlag_IsConstraintCheck = 8,
BfBinOpFlag_DeferRight = 0x10
2019-08-23 11:56:54 -07:00
};
class BfExprEvaluator : public BfStructuralVisitor
{
public:
BfModule* mModule;
BfTypedValue mResult;
BfEvalExprFlags mBfEvalExprFlags;
BfLocalVariable* mResultLocalVar;
BfFieldInstance* mResultFieldInstance;
2019-08-23 11:56:54 -07:00
int mResultLocalVarField;
int mResultLocalVarFieldCount; // > 1 for structs with multiple members
BfAstNode* mResultLocalVarRefNode;
BfAstNode* mPropSrc;
BfTypedValue mPropTarget;
BfTypedValue mOrigPropTarget;
BfGetMethodInstanceFlags mPropGetMethodFlags;
BfCheckedKind mPropCheckedKind;
BfPropertyDef* mPropDef;
2022-07-26 13:27:03 -04:00
BfType* mExpectingType;
2019-08-23 11:56:54 -07:00
BfAttributeState* mPrefixedAttributeState;
2022-07-26 13:27:03 -04:00
BfTypedValue* mReceivingValue;
2019-08-23 11:56:54 -07:00
BfFunctionBindResult* mFunctionBindResult;
2022-07-26 13:27:03 -04:00
SizedArray<BfResolvedArg, 2> mIndexerValues;
2019-08-23 11:56:54 -07:00
BfAstNode* mDeferCallRef;
BfScopeData* mDeferScopeAlloc;
bool mUsedAsStatement;
bool mPropDefBypassVirtual;
bool mExplicitCast;
bool mResolveGenericParam;
bool mNoBind;
bool mIsVolatileReference;
bool mIsHeapReference;
bool mResultIsTempComposite;
bool mAllowReadOnlyReference;
bool mInsidePendingNullable;
2019-08-23 11:56:54 -07:00
public:
BfExprEvaluator(BfModule* module);
~BfExprEvaluator();
2022-07-06 12:19:01 -07:00
bool CheckForMethodName(BfAstNode* refNode, BfTypeInstance* typeInst, const StringImpl& findName);
2022-01-22 07:01:57 -05:00
bool IsVar(BfType* type, bool forceIgnoreWrites = false);
2019-08-23 11:56:54 -07:00
void GetLiteral(BfAstNode* refNode, const BfVariant& variant);
2022-07-26 13:27:03 -04:00
void FinishExpressionResult();
virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode);
BfAutoComplete* GetAutoComplete();
bool IsComptime();
bool IsConstEval();
bool IsComptimeEntry();
int GetStructRetIdx(BfMethodInstance* methodInstance, bool forceStatic = false);
2019-08-23 11:56:54 -07:00
BfTypedValue SetupNullConditional(BfTypedValue target, BfTokenNode* dotToken);
2022-07-26 13:27:03 -04:00
void Evaluate(BfAstNode* astNode, bool propogateNullConditional = false, bool ignoreNullConditional = false, bool allowSplat = true);
2019-08-23 11:56:54 -07:00
BfType* BindGenericType(BfAstNode* node, BfType* bindType);
BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
2022-07-26 13:27:03 -04:00
void ResolveGenericType();
void ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgsFlags flags = BfResolveArgsFlag_None);
void ResolveAllocTarget(BfAllocTarget& allocTarget, BfAstNode* newNode, BfTokenNode*& newToken, BfCustomAttributes** outCustomAttributes = NULL);
2020-09-07 15:24:42 -07:00
BfTypedValue ResolveArgValue(BfResolvedArg& resolvedArg, BfType* wantType, BfTypedValue* receivingValue = NULL, BfParamKind paramKind = BfParamKind_Normal, BfIdentifierNode* paramNameNode = NULL);
BfMethodDef* GetPropertyMethodDef(BfPropertyDef* propDef, BfMethodType methodType, BfCheckedKind checkedKind, BfTypedValue propTarget);
2019-08-23 11:56:54 -07:00
BfModuleMethodInstance GetPropertyMethodInstance(BfMethodDef* methodDef);
2020-03-09 06:51:41 -07:00
void CheckPropFail(BfMethodDef* propMethodDef, BfMethodInstance* methodInstance, bool checkProt);
2020-02-11 08:37:52 -08:00
bool HasResult();
2022-07-26 13:27:03 -04:00
BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false);
2019-08-23 11:56:54 -07:00
void CheckResultForReading(BfTypedValue& typedValue);
void MarkResultUsed();
void MarkResultAssigned();
2022-07-26 13:27:03 -04:00
void MakeResultAsValue();
bool CheckIsBase(BfAstNode* checkNode);
2022-03-01 09:49:02 -08:00
bool CheckModifyResult(BfTypedValue& typeValue, BfAstNode* refNode, const char* modifyType, bool onlyNeedsMut = false, bool emitWarning = false, bool skipCopyOnMutate = false);
bool CheckGenericCtor(BfGenericParamType* genericParamType, BfResolvedArgs& argValues, BfAstNode* targetSrc);
2022-02-19 07:38:05 -05:00
BfTypedValue LoadProperty(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfPropertyDef* prop, BfLookupFieldFlags flags, BfCheckedKind checkedKind, bool isInline);
BfTypedValue LoadField(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfFieldDef* fieldDef, BfLookupFieldFlags flags);
2022-07-26 13:27:03 -04:00
BfTypedValue LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags = BfLookupFieldFlag_None);
2019-08-23 11:56:54 -07:00
void CheckObjectCreateTypeRef(BfType* expectingType, BfAstNode* afterNode);
void LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ignoreInitialError = false, bool* hadError = NULL);
void LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreInitialError, bool* hadError = NULL);
2022-07-26 13:27:03 -04:00
void LookupQualifiedStaticField(BfQualifiedNameNode* nameNode, bool ignoreIdentifierNotFoundError);
2019-08-23 11:56:54 -07:00
void LookupQualifiedStaticField(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreIdentifierNotFoundError);
bool CheckConstCompare(BfBinaryOp binaryOp, BfAstNode* opToken, const BfTypedValue& leftValue, const BfTypedValue& rightValue);
void AddStrings(const BfTypedValue& leftValue, const BfTypedValue& rightValue, BfAstNode* refNode);
2021-02-26 14:47:11 -08:00
bool PerformBinaryOperation_NullCoalesce(BfTokenNode* opToken, BfExpression* leftExpression, BfExpression* rightExpression, BfTypedValue leftValue, BfType* wantType, BfTypedValue* assignTo = NULL);
bool PerformBinaryOperation_Numeric(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue);
2019-08-23 11:56:54 -07:00
void PerformBinaryOperation(BfType* resultType, BfIRValue convLeftValue, BfIRValue convRightValue, BfBinaryOp binaryOp, BfAstNode* opToken);
void PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue);
void PerformBinaryOperation(BfExpression* leftNode, BfExpression* rightNode, BfBinaryOp binaryOp, BfTokenNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue);
void PerformBinaryOperation(BfExpression* leftNode, BfExpression* rightNode, BfBinaryOp binaryOp, BfTokenNode* opToken, BfBinOpFlags flags);
BfTypedValue LoadLocal(BfLocalVariable* varDecl, bool allowRef = false);
BfTypedValue LookupIdentifier(BfAstNode* identifierNode, const StringImpl& findName, bool ignoreInitialError = false, bool* hadError = NULL);
BfTypedValue LookupIdentifier(BfIdentifierNode* identifierNode, bool ignoreInitialError = false, bool* hadError = NULL);
void AddCallDependencies(BfMethodInstance* methodInstance);
void PerformCallChecks(BfMethodInstance* methodInstance, BfAstNode* targetSrc);
void CheckSkipCall(BfAstNode* targetSrc, SizedArrayImpl<BfResolvedArg>& argValues);
BfTypedValue CreateCall(BfAstNode* targetSrc, BfMethodInstance* methodInstance, BfIRValue func, bool bypassVirtual, SizedArrayImpl<BfIRValue>& irArgs, BfTypedValue* sret = NULL, BfCreateCallFlags callFlags = BfCreateCallFlags_None, BfType* origTargetType = NULL);
BfTypedValue CreateCall(BfAstNode* targetSrc, const BfTypedValue& target, const BfTypedValue& origTarget, BfMethodDef* methodDef, BfModuleMethodInstance methodInstance, BfCreateCallFlags callFlags, SizedArrayImpl<BfResolvedArg>& argValues, BfTypedValue* argCascade = NULL);
2019-08-23 11:56:54 -07:00
BfTypedValue CreateCall(BfMethodMatcher* methodMatcher, BfTypedValue target);
void MakeBaseConcrete(BfTypedValue& typedValue);
void SplatArgs(BfTypedValue value, SizedArrayImpl<BfIRValue>& irArgs);
void PushArg(BfTypedValue argVal, SizedArrayImpl<BfIRValue>& irArgs, bool disableSplat = false, bool disableLowering = false, bool isIntrinsic = false, bool createCompositeCopy = false);
2019-08-23 11:56:54 -07:00
void PushThis(BfAstNode* targetSrc, BfTypedValue callTarget, BfMethodInstance* methodInstance, SizedArrayImpl<BfIRValue>& irArgs, bool skipMutCheck = false);
2022-07-26 13:27:03 -04:00
BfTypedValue MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType,
2019-08-23 11:56:54 -07:00
BfResolvedArgs& argValues, bool callCtorBodyOnly, bool allowAppendAlloc, BfTypedValue* appendIndexValue = NULL);
BfTypedValue CheckEnumCreation(BfAstNode* targetSrc, BfTypeInstance* enumType, const StringImpl& caseName, BfResolvedArgs& argValues);
2022-07-26 13:27:03 -04:00
BfTypedValue MatchMethod(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, bool allowImplicitThis, bool bypassVirtual, const StringImpl& name,
BfResolvedArgs& argValue, const BfMethodGenericArguments& methodGenericArguments, BfCheckedKind checkedKind = BfCheckedKind_NotSet);
2022-07-26 13:27:03 -04:00
BfTypedValue MakeCallableTarget(BfAstNode* targetSrc, BfTypedValue target);
BfModuleMethodInstance GetSelectedMethod(BfAstNode* targetSrc, BfTypeInstance* curTypeInst, BfMethodDef* methodDef, BfMethodMatcher& methodMatcher, BfType** overrideReturnType = NULL);
BfModuleMethodInstance GetSelectedMethod(BfMethodMatcher& methodMatcher);
2019-08-23 11:56:54 -07:00
bool CheckVariableDeclaration(BfAstNode* checkNode, bool requireSimpleIfExpr, bool exprMustBeTrue, bool silentFail);
bool HasVariableDeclaration(BfAstNode* checkNode);
2022-07-26 13:27:03 -04:00
void DoInvocation(BfAstNode* target, BfMethodBoundExpression* methodBoundExpr, const BfSizedArray<BfExpression*>& args, const BfMethodGenericArguments& methodGenericArgs, BfTypedValue* outCascadeValue = NULL);
int GetMixinVariable();
2019-08-23 11:56:54 -07:00
void CheckLocalMethods(BfAstNode* targetSrc, BfTypeInstance* typeInstance, const StringImpl& methodName, BfMethodMatcher& methodMatcher, BfMethodType methodType);
void InjectMixin(BfAstNode* targetSrc, BfTypedValue target, bool allowImplicitThis, const StringImpl& name, const BfSizedArray<BfExpression*>& arguments, const BfMethodGenericArguments& methodGenericArgs);
2019-08-23 11:56:54 -07:00
void SetMethodElementType(BfAstNode* target);
BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfIdentifierNode* identifierNode, int shadowIdx);
2019-08-23 11:56:54 -07:00
BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfMethodInstance* methodInstance, int paramIdx, bool& failed, BfImplicitParamKind paramKind = BfImplicitParamKind_General, const BfTypedValue& methodRefTarget = BfTypedValue());
bool CanBindDelegate(BfDelegateBindExpression* delegateBindExpr, BfMethodInstance** boundMethod = NULL, BfType* origMethodExpectingType = NULL, BfTypeVector* methodGenericArgumentsSubstitute = NULL);
2022-07-26 13:27:03 -04:00
bool IsExactMethodMatch(BfMethodInstance* methodA, BfMethodInstance* methodB, bool ignoreImplicitParams = false);
BfTypeInstance* VerifyBaseDelegateType(BfTypeInstance* delegateType);
2019-08-23 11:56:54 -07:00
void ConstResolve(BfExpression* expr);
void ProcessArrayInitializer(BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, int dimensions, SizedArrayImpl<int64>& dimLengths, int dim, bool& hasFailed);
BfLambdaInstance* GetLambdaInstance(BfLambdaBindExpression* lambdaBindExpr, BfAllocTarget& allocTarget);
2022-07-26 13:27:03 -04:00
void VisitLambdaBodies(BfAstNode* body, BfFieldDtorDeclaration* fieldDtor);
void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic);
BfTypedValue TryArrowLookup(BfTypedValue typedValue, BfTokenNode* arrowToken);
void PerformUnaryOperation(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
BfTypedValue PerformUnaryOperation_TryOperator(const BfTypedValue& inValue, BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
2022-07-26 13:27:03 -04:00
void PerformUnaryOperation_OnResult(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
BfTypedValue PerformAssignment_CheckOp(BfAssignmentExpression* assignExpr, bool deferBinop, BfTypedValue& leftValue, BfTypedValue& rightValue, bool& evaluatedRight);
void PerformAssignment(BfAssignmentExpression* assignExpr, bool evaluatedLeft, BfTypedValue rightValue, BfTypedValue* outCascadeValue = NULL);
2019-08-23 11:56:54 -07:00
void PopulateDeferrredTupleAssignData(BfTupleExpression* tupleExr, DeferredTupleAssignData& deferredTupleAssignData);
void AssignDeferrredTupleAssignData(BfAssignmentExpression* assignExpr, DeferredTupleAssignData& deferredTupleAssignData, BfTypedValue rightValue);
2022-07-26 13:27:03 -04:00
void DoTupleAssignment(BfAssignmentExpression* assignExpr);
void FinishDeferredEvals(SizedArrayImpl<BfResolvedArg>& argValues);
void FinishDeferredEvals(BfResolvedArgs& argValues);
2019-08-23 11:56:54 -07:00
bool LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifierNode* propName);
2021-09-10 14:21:25 -07:00
void DoTypeIntAttr(BfTypeReference* typeRef, BfTokenNode* commaToken, BfIdentifierNode* memberName, BfToken token);
2019-08-23 11:56:54 -07:00
//void InitializedSizedArray(BfTupleExpression* createExpr, BfSizedArrayType* arrayType);
void InitializedSizedArray(BfSizedArrayType* sizedArrayType, BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, BfTypedValue* receivingValue = NULL);
void CheckDotToken(BfTokenNode* tokenNode);
2019-08-23 11:56:54 -07:00
void DoMemberReference(BfMemberReferenceExpression* memberRefExpr, BfTypedValue* outCascadeValue);
2020-11-11 05:46:52 -08:00
void CreateObject(BfObjectCreateExpression* objCreateExpr, BfAstNode* allocNode, BfType* allocType);
void HandleIndexerExpression(BfIndexerExpression* indexerExpr, BfTypedValue target);
2019-08-23 11:56:54 -07:00
//////////////////////////////////////////////////////////////////////////
2022-07-26 13:27:03 -04:00
virtual void Visit(BfErrorNode* errorNode) override;
2019-08-23 11:56:54 -07:00
virtual void Visit(BfTypeReference* typeRef) override;
virtual void Visit(BfAttributedExpression* attribExpr) override;
2022-06-24 18:41:54 -07:00
virtual void Visit(BfNamedExpression* namedExpr) override;
2019-08-23 11:56:54 -07:00
virtual void Visit(BfBlock* blockExpr) override;
virtual void Visit(BfVariableDeclaration* varDecl) override;
virtual void Visit(BfCaseExpression* caseExpr) override;
virtual void Visit(BfTypedValueExpression* typedValueExpr) override;
2022-07-26 13:27:03 -04:00
virtual void Visit(BfLiteralExpression* literalExpr) override;
2020-11-11 05:46:52 -08:00
virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression) override;
2019-08-23 11:56:54 -07:00
virtual void Visit(BfIdentifierNode* identifierNode) override;
virtual void Visit(BfAttributedIdentifierNode* attrIdentifierNode) override;
virtual void Visit(BfQualifiedNameNode* nameNode) override;
virtual void Visit(BfThisExpression* thisExpr) override;
virtual void Visit(BfBaseExpression* baseExpr) override;
virtual void Visit(BfMixinExpression* mixinExpr) override;
virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
2020-06-18 06:12:14 -07:00
virtual void Visit(BfInitializerExpression* initExpr) override;
2022-07-26 13:27:03 -04:00
virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
2019-08-23 11:56:54 -07:00
virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
virtual void Visit(BfAlignOfExpression* alignOfExpr) override;
virtual void Visit(BfStrideOfExpression* strideOfExpr) override;
2021-09-10 14:21:25 -07:00
virtual void Visit(BfOffsetOfExpression* offsetOfExpr) override;
2022-07-06 12:19:01 -07:00
virtual void Visit(BfNameOfExpression* nameOfExpr) override;
virtual void Visit(BfIsConstExpression* isConstExpr) override;
2019-08-23 11:56:54 -07:00
virtual void Visit(BfDefaultExpression* defaultExpr) override;
virtual void Visit(BfUninitializedExpression* uninitialziedExpr) override;
virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
virtual void Visit(BfCastExpression* castExpr) override;
virtual void Visit(BfDelegateBindExpression* delegateBindExpr) override;
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;
virtual void Visit(BfBoxExpression* boxExpr) override;
2022-07-26 13:27:03 -04:00
virtual void Visit(BfInvocationExpression* invocationExpr) override;
2019-08-23 11:56:54 -07:00
virtual void Visit(BfConditionalExpression* condExpr) override;
virtual void Visit(BfAssignmentExpression* assignExpr) override;
virtual void Visit(BfParenthesizedExpression* parenExpr) override;
virtual void Visit(BfTupleExpression* tupleExpr) override;
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
virtual void Visit(BfIndexerExpression* indexerExpr) override;
virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
2022-07-26 13:27:03 -04:00
virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
2019-08-23 11:56:54 -07:00
};
NS_BF_END