BfExprEvaluator.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. #pragma once
  2. #include "BfCompiler.h"
  3. #include "BfSourceClassifier.h"
  4. NS_BF_BEGIN
  5. enum BfArgFlags
  6. {
  7. BfArgFlag_None = 0,
  8. BfArgFlag_DelegateBindAttempt = 1,
  9. BfArgFlag_LambdaBindAttempt = 2,
  10. BfArgFlag_UnqualifiedDotAttempt = 4,
  11. BfArgFlag_DeferredValue = 8,
  12. BfArgFlag_FromParamComposite = 0x10,
  13. BfArgFlag_UntypedDefault = 0x20,
  14. BfArgFlag_DeferredEval = 0x40,
  15. BfArgFlag_ExpectedTypeCast = 0x80,
  16. BfArgFlag_VariableDeclaration = 0x100,
  17. BfArgFlag_ParamsExpr = 0x200,
  18. BfArgFlag_UninitializedExpr = 0x400,
  19. BfArgFlag_StringInterpolateFormat = 0x800,
  20. BfArgFlag_StringInterpolateArg = 0x1000,
  21. BfArgFlag_Cascade = 0x2000,
  22. BfArgFlag_Volatile = 0x8000,
  23. BfArgFlag_Finalized = 0x10000,
  24. };
  25. enum BfResolveArgsFlags
  26. {
  27. BfResolveArgsFlag_None = 0,
  28. BfResolveArgsFlag_DeferFixits = 1,
  29. BfResolveArgsFlag_DeferParamValues = 2, // We still evaluate but don't generate code until the method is selected (for SkipCall support)
  30. BfResolveArgsFlag_DeferParamEval = 4,
  31. BfResolveArgsFlag_AllowUnresolvedTypes = 8,
  32. BfResolveArgsFlag_InsideStringInterpolationAlloc = 0x10,
  33. BfResolveArgsFlag_FromIndexer = 0x20,
  34. BfResolveArgsFlag_DeferStrings = 0x40
  35. };
  36. enum BfResolveArgFlags
  37. {
  38. BfResolveArgFlag_None = 0,
  39. BfResolveArgFlag_FromGeneric = 1,
  40. BfResolveArgFlag_FromGenericParam = 2
  41. };
  42. enum BfCreateCallFlags
  43. {
  44. BfCreateCallFlags_None,
  45. BfCreateCallFlags_BypassVirtual = 1,
  46. BfCreateCallFlags_SkipThis = 2,
  47. BfCreateCallFlags_AllowImplicitRef = 4,
  48. BfCreateCallFlags_TailCall = 8,
  49. BfCreateCallFlags_GenericParamThis = 0x10,
  50. BfCreateCallFlags_DelegateThunkNonStatic = 0x20,
  51. BfCreateCallFlags_DelegateThunkStatic = 0x40,
  52. };
  53. class BfResolvedArg
  54. {
  55. public:
  56. BfTypedValue mTypedValue;
  57. BfTypedValue mUncastedTypedValue;
  58. BfIdentifierNode* mNameNode;
  59. BfType* mResolvedType;
  60. BfAstNode* mExpression;
  61. BfArgFlags mArgFlags;
  62. BfType* mExpectedType;
  63. BfType* mBestBoundType;
  64. bool mWantsRecalc;
  65. public:
  66. BfResolvedArg()
  67. {
  68. mNameNode = NULL;
  69. mResolvedType = NULL;
  70. mExpression = NULL;
  71. mArgFlags = BfArgFlag_None;
  72. mExpectedType = NULL;
  73. mBestBoundType = NULL;
  74. mWantsRecalc = false;
  75. }
  76. bool IsDeferredEval()
  77. {
  78. return (mArgFlags & (BfArgFlag_DelegateBindAttempt | BfArgFlag_LambdaBindAttempt | BfArgFlag_UnqualifiedDotAttempt | BfArgFlag_UntypedDefault | BfArgFlag_DeferredEval)) != 0;
  79. }
  80. bool IsDeferredValue()
  81. {
  82. return (mArgFlags & (BfArgFlag_DelegateBindAttempt | BfArgFlag_LambdaBindAttempt | BfArgFlag_UnqualifiedDotAttempt | BfArgFlag_UntypedDefault | BfArgFlag_DeferredEval | BfArgFlag_DeferredValue)) != 0;
  83. }
  84. };
  85. struct BfResolvedArgs
  86. {
  87. SizedArray<BfResolvedArg, 4> mResolvedArgs;
  88. BfTokenNode* mOpenToken;
  89. const BfSizedArray<BfExpression*>* mArguments;
  90. const BfSizedArray<BfTokenNode*>* mCommas;
  91. BfTokenNode* mCloseToken;
  92. public:
  93. BfResolvedArgs()
  94. {
  95. mOpenToken = NULL;
  96. mArguments = NULL;
  97. mCommas = NULL;
  98. mCloseToken = NULL;
  99. }
  100. BfResolvedArgs(BfSizedArray<BfExpression*>* args)
  101. {
  102. mOpenToken = NULL;
  103. mArguments = args;
  104. mCommas = NULL;
  105. mCloseToken = NULL;
  106. }
  107. BfResolvedArgs(BfTokenNode* openToken, BfSizedArray<BfExpression*>* args, BfSizedArray<BfTokenNode*>* commas, BfTokenNode* closeToken)
  108. {
  109. mOpenToken = openToken;
  110. mArguments = args;
  111. mCommas = commas;
  112. mCloseToken = closeToken;
  113. }
  114. void Init(BfTokenNode* openToken, BfSizedArray<BfExpression*>* args, BfSizedArray<BfTokenNode*>* commas, BfTokenNode* closeToken)
  115. {
  116. mOpenToken = openToken;
  117. mArguments = args;
  118. mCommas = commas;
  119. mCloseToken = closeToken;
  120. }
  121. void Init(const BfSizedArray<BfExpression*>* args)
  122. {
  123. mOpenToken = NULL;
  124. mArguments = args;
  125. mCommas = NULL;
  126. mCloseToken = NULL;
  127. }
  128. void HandleFixits(BfModule* module);
  129. };
  130. class BfGenericInferContext
  131. {
  132. public:
  133. HashSet<int64> mCheckedTypeSet;
  134. BfModule* mModule;
  135. BfTypeVector* mCheckMethodGenericArguments;
  136. SizedArray<BfIRValue, 4> mPrevArgValues;
  137. int mInferredCount;
  138. public:
  139. BfGenericInferContext()
  140. {
  141. mModule = NULL;
  142. mInferredCount = 0;
  143. }
  144. bool AddToCheckedSet(BfType* argType, BfType* wantType);
  145. bool InferGenericArgument(BfMethodInstance* methodInstance, BfType* argType, BfType* wantType, BfIRValue argValue, bool checkCheckedSet = false);
  146. int GetUnresolvedCount()
  147. {
  148. return (int)mCheckMethodGenericArguments->size() - mInferredCount;
  149. }
  150. bool InferGenericArguments(BfMethodInstance* methodInstance, int srcGenericIdx);
  151. void InferGenericArguments(BfMethodInstance* methodInstance);
  152. };
  153. struct BfMethodGenericArguments
  154. {
  155. BfSizedArray<BfAstNode*>* mArguments;
  156. bool mIsPartial;
  157. bool mIsOpen; // Ends with ...
  158. BfMethodGenericArguments()
  159. {
  160. mArguments = NULL;
  161. mIsPartial = false;
  162. mIsOpen = false;
  163. }
  164. };
  165. class BfMethodMatcher
  166. {
  167. public:
  168. struct BfAmbiguousEntry
  169. {
  170. BfMethodInstance* mMethodInstance;
  171. BfTypeVector mBestMethodGenericArguments;
  172. };
  173. enum MatchFailKind
  174. {
  175. MatchFailKind_None,
  176. MatchFailKind_Protection,
  177. MatchFailKind_CheckedMismatch
  178. };
  179. enum BackupMatchKind
  180. {
  181. BackupMatchKind_None,
  182. BackupMatchKind_TooManyArgs,
  183. BackupMatchKind_EarlyMismatch,
  184. BackupMatchKind_PartialLastArgMatch
  185. };
  186. public:
  187. BfAstNode* mTargetSrc;
  188. BfTypedValue mTarget;
  189. BfTypedValue mOrigTarget;
  190. BfModule* mModule;
  191. BfTypeDef* mActiveTypeDef;
  192. String mMethodName;
  193. BfMethodInstance* mInterfaceMethodInstance;
  194. SizedArrayImpl<BfResolvedArg>& mArguments;
  195. BfType* mCheckReturnType;
  196. BfMethodType mMethodType;
  197. BfCheckedKind mCheckedKind;
  198. BfAllowAppendKind mAllowAppendKind;
  199. Array<SizedArray<BfUsingFieldData::MemberRef, 1>*>* mUsingLists;
  200. bool mHasArgNames;
  201. bool mHadExplicitGenericArguments;
  202. bool mHadOpenGenericArguments;
  203. bool mHadPartialGenericArguments;
  204. bool mHasVarArguments;
  205. bool mHadVarConflictingReturnType;
  206. bool mBypassVirtual;
  207. bool mAllowImplicitThis;
  208. bool mAllowImplicitRef;
  209. bool mAllowImplicitWrap;
  210. bool mAllowStatic;
  211. bool mAllowNonStatic;
  212. bool mSkipImplicitParams;
  213. bool mAutoFlushAmbiguityErrors;
  214. BfEvalExprFlags mBfEvalExprFlags;
  215. int mMethodCheckCount;
  216. BfType* mExplicitInterfaceCheck;
  217. MatchFailKind mMatchFailKind;
  218. BfTypeVector mCheckMethodGenericArguments;
  219. BfType* mSelfType; // Only when matching interfaces when 'Self' needs to refer back to the implementing type
  220. BfMethodDef* mBackupMethodDef;
  221. BackupMatchKind mBackupMatchKind;
  222. int mBackupArgMatchCount;
  223. BfMethodDef* mBestMethodDef;
  224. BfTypeInstance* mBestMethodTypeInstance;
  225. BfMethodInstance* mBestRawMethodInstance;
  226. BfModuleMethodInstance mBestMethodInstance;
  227. SizedArray<int, 4> mBestMethodGenericArgumentSrcs;
  228. BfTypeVector mBestMethodGenericArguments;
  229. BfTypeVector mExplicitMethodGenericArguments;
  230. bool mFakeConcreteTarget;
  231. Array<BfAmbiguousEntry> mAmbiguousEntries;
  232. public:
  233. BfTypedValue ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType = NULL, BfResolveArgFlags flags = BfResolveArgFlag_None);
  234. bool InferFromGenericConstraints(BfMethodInstance* methodInstance, BfGenericParamInstance* genericParamInst, BfTypeVector* methodGenericArgs);
  235. void CompareMethods(BfMethodInstance* prevMethodInstance, BfTypeVector* prevGenericArgumentsSubstitute,
  236. BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute,
  237. bool* outNewIsBetter, bool* outNewIsWorse, bool allowSpecializeFail);
  238. void FlushAmbiguityError(bool useWarning = false);
  239. bool IsType(BfTypedValue& val, BfType* type);
  240. int GetMostSpecificType(BfType* lhs, BfType* rhs); // 0, 1, or -1
  241. public:
  242. BfMethodMatcher(BfAstNode* targetSrc, BfModule* module, const StringImpl& methodName, SizedArrayImpl<BfResolvedArg>& arguments, const BfMethodGenericArguments& methodGenericArguments);
  243. BfMethodMatcher(BfAstNode* targetSrc, BfModule* module, BfMethodInstance* interfaceMethodInstance, SizedArrayImpl<BfResolvedArg>& arguments, const BfMethodGenericArguments& methodGenericArguments);
  244. void Init(const BfMethodGenericArguments& methodGenericArguments);
  245. bool IsMemberAccessible(BfTypeInstance* typeInst, BfTypeDef* declaringType);
  246. bool CheckType(BfTypeInstance* typeInstance, BfTypedValue target, bool isFailurePass, bool forceOuterCheck = false);
  247. void CheckOuterTypeStaticMethods(BfTypeInstance* typeInstance, bool isFailurePass);
  248. bool WantsCheckMethod(BfProtectionCheckFlags& flags, BfTypeInstance* startTypeInstance, BfTypeInstance* checkTypeInstance, BfMethodDef* methodDef);
  249. bool CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInstance* typeInstance, BfMethodDef* checkMethod, bool isFailurePass);
  250. void TryDevirtualizeCall(BfTypedValue target, BfTypedValue* origTarget = NULL, BfTypedValue* staticResult = NULL);
  251. bool HasVarGenerics();
  252. bool IsVarCall(BfType*& outReturnType);
  253. };
  254. class BfBaseClassWalker
  255. {
  256. public:
  257. struct Entry
  258. {
  259. BfType* mSrcType;
  260. BfTypeInstance* mTypeInstance;
  261. Entry(BfType* srcType, BfTypeInstance* typeInstance)
  262. {
  263. mSrcType = srcType;
  264. mTypeInstance = typeInstance;
  265. }
  266. Entry()
  267. {
  268. mSrcType = NULL;
  269. mTypeInstance = NULL;
  270. }
  271. bool operator==(const Entry& rhs)
  272. {
  273. return (mSrcType == rhs.mSrcType) && (mTypeInstance == rhs.mTypeInstance);
  274. }
  275. };
  276. BfTypeInstance* mTypes[2];
  277. Array<Entry> mManualList;
  278. bool mMayBeFromInterface;
  279. public:
  280. BfBaseClassWalker();
  281. BfBaseClassWalker(BfType* typeA, BfType* typeB, BfModule* module, bool allowInterfaces = false);
  282. void AddConstraints(BfType* srcType, BfGenericParamInstance* genericParam);
  283. void AddInterfaces(BfType* srcType, BfTypeInstance* typeInst);
  284. public:
  285. Entry Next();
  286. };
  287. class BfFunctionBindResult
  288. {
  289. public:
  290. BfTypedValue mOrigTarget;
  291. BfTypedValue mTarget;
  292. BfIRValue mFunc;
  293. BfMethodInstance* mMethodInstance;
  294. BfType* mBindType;
  295. bool mSkipThis;
  296. bool mSkipMutCheck;
  297. bool mWantsArgs;
  298. bool mCheckedMultipleMethods;
  299. SizedArray<BfIRValue, 2> mIRArgs;
  300. public:
  301. BfFunctionBindResult()
  302. {
  303. mMethodInstance = NULL;
  304. mBindType = NULL;
  305. mSkipMutCheck = false;
  306. mWantsArgs = false;
  307. mSkipThis = false;
  308. mCheckedMultipleMethods = false;
  309. }
  310. };
  311. struct DeferredTupleAssignData
  312. {
  313. struct Entry
  314. {
  315. BfExpression* mExpr;
  316. BfType* mVarType;
  317. BfAstNode* mVarNameNode;
  318. BfExprEvaluator* mExprEvaluator;
  319. DeferredTupleAssignData* mInnerTuple;
  320. };
  321. Array<Entry> mChildren;
  322. BfTypeInstance* mTupleType;
  323. ~DeferredTupleAssignData();
  324. };
  325. enum BfImplicitParamKind
  326. {
  327. BfImplicitParamKind_General,
  328. BfImplicitParamKind_GenericMethodMember,
  329. BfImplicitParamKind_GenericTypeMember,
  330. BfImplicitParamKind_GenericTypeMember_Addr,
  331. };
  332. enum BfLookupFieldFlags
  333. {
  334. BfLookupFieldFlag_None = 0,
  335. BfLookupFieldFlag_IsImplicitThis = 1,
  336. BfLookupFieldFlag_BaseLookup = 2,
  337. BfLookupFieldFlag_CheckingOuter = 4,
  338. BfLookupFieldFlag_IgnoreProtection = 8,
  339. BfLookupFieldFlag_BindOnly = 0x10,
  340. BfLookupFieldFlag_IsFailurePass = 0x20,
  341. BfLookupFieldFlag_IsAnonymous = 0x40,
  342. BfLookupFieldFlag_HasInstance = 0x80
  343. };
  344. enum BfUnaryOpFlags
  345. {
  346. BfUnaryOpFlag_None = 0,
  347. BfUnaryOpFlag_IsConstraintCheck = 1
  348. };
  349. enum BfBinOpFlags
  350. {
  351. BfBinOpFlag_None = 0,
  352. BfBinOpFlag_NoClassify = 1,
  353. BfBinOpFlag_ForceLeftType = 2,
  354. BfBinOpFlag_ForceRightType = 4,
  355. BfBinOpFlag_IgnoreOperatorWithWrongResult = 8,
  356. BfBinOpFlag_IsConstraintCheck = 0x10,
  357. BfBinOpFlag_DeferRight = 0x20
  358. };
  359. struct BfDeferCallData
  360. {
  361. BfAstNode* mRefNode;
  362. BfScopeData* mScopeAlloc;
  363. BfIRValue mFuncAlloca; // When we need to load
  364. BfIRValue mFuncAlloca_Orig;
  365. };
  366. class BfExprEvaluator : public BfStructuralVisitor
  367. {
  368. public:
  369. BfModule* mModule;
  370. BfTypedValue mResult;
  371. BfEvalExprFlags mBfEvalExprFlags;
  372. BfLocalVariable* mResultLocalVar;
  373. BfFieldInstance* mResultFieldInstance;
  374. int mResultLocalVarField;
  375. int mResultLocalVarFieldCount; // > 1 for structs with multiple members
  376. BfAstNode* mResultLocalVarRefNode;
  377. BfAstNode* mPropSrc;
  378. BfTypedValue mPropTarget;
  379. BfTypedValue mOrigPropTarget;
  380. BfGetMethodInstanceFlags mPropGetMethodFlags;
  381. BfCheckedKind mPropCheckedKind;
  382. BfPropertyDef* mPropDef;
  383. BfType* mExpectingType;
  384. BfAttributeState* mPrefixedAttributeState;
  385. BfTypedValue* mReceivingValue;
  386. BfFunctionBindResult* mFunctionBindResult;
  387. SizedArray<BfResolvedArg, 2> mIndexerValues;
  388. BfDeferCallData* mDeferCallData;
  389. bool mUsedAsStatement;
  390. bool mPropDefBypassVirtual;
  391. bool mExplicitCast;
  392. bool mResolveGenericParam;
  393. bool mNoBind;
  394. bool mIsVolatileReference;
  395. bool mIsHeapReference;
  396. bool mResultIsTempComposite;
  397. bool mAllowReadOnlyReference;
  398. bool mInsidePendingNullable;
  399. public:
  400. BfExprEvaluator(BfModule* module);
  401. ~BfExprEvaluator();
  402. bool CheckForMethodName(BfAstNode* refNode, BfTypeInstance* typeInst, const StringImpl& findName);
  403. bool IsVar(BfType* type, bool forceIgnoreWrites = false);
  404. void GetLiteral(BfAstNode* refNode, const BfVariant& variant, BfType* type = NULL);
  405. void FinishExpressionResult();
  406. virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode);
  407. BfAutoComplete* GetAutoComplete();
  408. bool IsComptime();
  409. bool IsConstEval();
  410. bool IsComptimeEntry();
  411. void EnsureResultNotConstant();
  412. int GetStructRetIdx(BfMethodInstance* methodInstance, bool forceStatic = false);
  413. BfTypedValue SetupNullConditional(BfTypedValue target, BfTokenNode* dotToken);
  414. void Evaluate(BfAstNode* astNode, bool propogateNullConditional = false, bool ignoreNullConditional = false, bool allowSplat = true);
  415. BfType* BindGenericType(BfAstNode* node, BfType* bindType);
  416. BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
  417. void ResolveGenericType();
  418. void ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgsFlags flags = BfResolveArgsFlag_None);
  419. void ResolveAllocTarget(BfAllocTarget& allocTarget, BfAstNode* newNode, BfTokenNode*& newToken, BfCustomAttributes** outCustomAttributes = NULL);
  420. BfTypedValue ResolveArgValue(BfResolvedArg& resolvedArg, BfType* wantType, BfTypedValue* receivingValue = NULL, BfParamKind paramKind = BfParamKind_Normal, BfIdentifierNode* paramNameNode = NULL);
  421. BfMethodDef* GetPropertyMethodDef(BfPropertyDef* propDef, BfMethodType methodType, BfCheckedKind checkedKind, BfTypedValue propTarget);
  422. BfModuleMethodInstance GetPropertyMethodInstance(BfMethodDef* methodDef);
  423. void CheckPropFail(BfMethodDef* propMethodDef, BfMethodInstance* methodInstance, bool checkProt);
  424. bool HasResult();
  425. BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false);
  426. void CheckResultForReading(BfTypedValue& typedValue);
  427. void MarkResultUsed();
  428. void MarkResultAssigned();
  429. void MakeResultAsValue();
  430. bool CheckIsBase(BfAstNode* checkNode);
  431. bool CheckModifyResult(BfTypedValue& typeValue, BfAstNode* refNode, const char* modifyType, bool onlyNeedsMut = false, bool emitWarning = false, bool skipCopyOnMutate = false);
  432. bool CheckGenericCtor(BfGenericParamType* genericParamType, BfResolvedArgs& argValues, BfAstNode* targetSrc);
  433. BfTypedValue LoadProperty(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfPropertyDef* prop, BfLookupFieldFlags flags, BfCheckedKind checkedKind, bool isInline);
  434. BfTypedValue LoadField(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfFieldDef* fieldDef, BfLookupFieldFlags flags);
  435. BfTypedValue LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags = BfLookupFieldFlag_None);
  436. void CheckObjectCreateTypeRef(BfType* expectingType, BfAstNode* afterNode);
  437. void LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ignoreInitialError = false, bool* hadError = NULL);
  438. void LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreInitialError, bool* hadError = NULL);
  439. void LookupQualifiedStaticField(BfQualifiedNameNode* nameNode, bool ignoreIdentifierNotFoundError);
  440. void LookupQualifiedStaticField(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreIdentifierNotFoundError);
  441. bool CheckConstCompare(BfBinaryOp binaryOp, BfAstNode* opToken, const BfTypedValue& leftValue, const BfTypedValue& rightValue, bool invert = false);
  442. void AddStrings(const BfTypedValue& leftValue, const BfTypedValue& rightValue, BfAstNode* refNode);
  443. bool PerformBinaryOperation_NullCoalesce(BfTokenNode* opToken, BfExpression* leftExpression, BfExpression* rightExpression, BfTypedValue leftValue, BfType* wantType, BfTypedValue* assignTo = NULL);
  444. bool PerformBinaryOperation_Numeric(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue);
  445. void PerformBinaryOperation(BfType* resultType, BfIRValue convLeftValue, BfIRValue convRightValue, BfBinaryOp binaryOp, BfAstNode* opToken);
  446. void PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue);
  447. void PerformBinaryOperation(BfExpression* leftNode, BfExpression* rightNode, BfBinaryOp binaryOp, BfTokenNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue);
  448. void PerformBinaryOperation(BfExpression* leftNode, BfExpression* rightNode, BfBinaryOp binaryOp, BfTokenNode* opToken, BfBinOpFlags flags);
  449. BfTypedValue LoadLocal(BfLocalVariable* varDecl, bool allowRef = false);
  450. BfTypedValue LookupIdentifier(BfAstNode* identifierNode, const StringImpl& findName, bool ignoreInitialError = false, bool* hadError = NULL);
  451. BfTypedValue LookupIdentifier(BfIdentifierNode* identifierNode, bool ignoreInitialError = false, bool* hadError = NULL);
  452. void AddCallDependencies(BfMethodInstance* methodInstance);
  453. void PerformCallChecks(BfMethodInstance* methodInstance, BfAstNode* targetSrc);
  454. void CheckSkipCall(BfAstNode* targetSrc, SizedArrayImpl<BfResolvedArg>& argValues);
  455. BfTypedValue CreateCall(BfAstNode* targetSrc, BfMethodInstance* methodInstance, BfIRValue func, bool bypassVirtual, SizedArrayImpl<BfIRValue>& irArgs, BfTypedValue* sret = NULL, BfCreateCallFlags callFlags = BfCreateCallFlags_None, BfType* origTargetType = NULL);
  456. BfTypedValue CreateCall(BfAstNode* targetSrc, const BfTypedValue& target, const BfTypedValue& origTarget, BfMethodDef* methodDef, BfModuleMethodInstance methodInstance, BfCreateCallFlags callFlags, SizedArrayImpl<BfResolvedArg>& argValues, BfTypedValue* argCascade = NULL);
  457. BfTypedValue CreateCall(BfMethodMatcher* methodMatcher, BfTypedValue target);
  458. void MakeBaseConcrete(BfTypedValue& typedValue);
  459. void SplatArgs(BfTypedValue value, SizedArrayImpl<BfIRValue>& irArgs);
  460. void PushArg(BfTypedValue argVal, SizedArrayImpl<BfIRValue>& irArgs, bool disableSplat = false, bool disableLowering = false, bool isIntrinsic = false, bool createCompositeCopy = false);
  461. void PushThis(BfAstNode* targetSrc, BfTypedValue callTarget, BfMethodInstance* methodInstance, SizedArrayImpl<BfIRValue>& irArgs, bool skipMutCheck = false);
  462. BfTypedValue MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType,
  463. BfResolvedArgs& argValues, bool callCtorBodyOnly, const BfMethodGenericArguments& methodGenericArguments, BfAllowAppendKind allowAppendKind, BfTypedValue* appendIndexValue = NULL);
  464. BfTypedValue CheckEnumCreation(BfAstNode* targetSrc, BfTypeInstance* enumType, const StringImpl& caseName, BfResolvedArgs& argValues);
  465. BfTypedValue MatchMethod(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, bool allowImplicitThis, bool bypassVirtual, const StringImpl& name,
  466. BfResolvedArgs& argValue, const BfMethodGenericArguments& methodGenericArguments, BfCheckedKind checkedKind = BfCheckedKind_NotSet);
  467. BfTypedValue MakeCallableTarget(BfAstNode* targetSrc, BfTypedValue target);
  468. BfModuleMethodInstance GetSelectedMethod(BfAstNode* targetSrc, BfTypeInstance* curTypeInst, BfMethodDef* methodDef, BfMethodMatcher& methodMatcher, BfType** overrideReturnType = NULL);
  469. BfModuleMethodInstance GetSelectedMethod(BfMethodMatcher& methodMatcher);
  470. bool CheckVariableDeclaration(BfAstNode* checkNode, bool requireSimpleIfExpr, bool exprMustBeTrue, bool silentFail);
  471. bool HasVariableDeclaration(BfAstNode* checkNode);
  472. void DoInvocation(BfInvocationExpression* invocationExpr);
  473. void DoInvocation(BfAstNode* target, BfMethodBoundExpression* methodBoundExpr, const BfSizedArray<BfExpression*>& args, const BfMethodGenericArguments& methodGenericArgs, BfTypedValue* outCascadeValue = NULL);
  474. void DoCaseExpression(BfTypedValue caseValAddr, BfCaseExpression* caseExpr);
  475. int GetMixinVariable();
  476. void CheckLocalMethods(BfAstNode* targetSrc, BfTypeInstance* typeInstance, const StringImpl& methodName, BfMethodMatcher& methodMatcher, BfMethodType methodType);
  477. void InjectMixin(BfAstNode* targetSrc, BfTypedValue target, bool allowImplicitThis, const StringImpl& name, const BfSizedArray<BfExpression*>& arguments, const BfMethodGenericArguments& methodGenericArgs);
  478. void SetMethodElementType(BfAstNode* target);
  479. BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfIdentifierNode* identifierNode, int shadowIdx);
  480. BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfMethodInstance* methodInstance, int paramIdx, bool& failed, BfImplicitParamKind paramKind = BfImplicitParamKind_General, const BfTypedValue& methodRefTarget = BfTypedValue());
  481. bool CanBindDelegate(BfDelegateBindExpression* delegateBindExpr, BfMethodInstance** boundMethod = NULL, BfType* origMethodExpectingType = NULL, BfTypeVector* methodGenericArgumentsSubstitute = NULL);
  482. bool IsExactMethodMatch(BfMethodInstance* methodA, BfMethodInstance* methodB, bool ignoreImplicitParams = false);
  483. BfTypeInstance* VerifyBaseDelegateType(BfTypeInstance* delegateType);
  484. void ConstResolve(BfExpression* expr);
  485. void ProcessArrayInitializer(BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, int dimensions, SizedArrayImpl<int64>& dimLengths, int dim, bool& hasFailed);
  486. BfLambdaInstance* GetLambdaInstance(BfLambdaBindExpression* lambdaBindExpr, BfAllocTarget& allocTarget);
  487. void VisitLambdaBodies(BfAstNode* body, BfFieldDtorDeclaration* fieldDtor);
  488. void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic);
  489. BfTypedValue TryArrowLookup(BfTypedValue typedValue, BfTokenNode* arrowToken);
  490. void PerformUnaryOperation(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
  491. BfTypedValue PerformUnaryOperation_TryOperator(const BfTypedValue& inValue, BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
  492. void PerformUnaryOperation_OnResult(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
  493. BfTypedValue PerformAssignment_CheckOp(BfAssignmentExpression* assignExpr, bool deferBinop, BfTypedValue& leftValue, BfTypedValue& rightValue, bool& evaluatedRight);
  494. void PerformAssignment(BfAssignmentExpression* assignExpr, bool evaluatedLeft, BfTypedValue rightValue, BfTypedValue* outCascadeValue = NULL);
  495. void PopulateDeferrredTupleAssignData(BfTupleExpression* tupleExr, DeferredTupleAssignData& deferredTupleAssignData);
  496. void AssignDeferrredTupleAssignData(BfAssignmentExpression* assignExpr, DeferredTupleAssignData& deferredTupleAssignData, BfTypedValue rightValue);
  497. void DoTupleAssignment(BfAssignmentExpression* assignExpr);
  498. void FinishDeferredEvals(SizedArrayImpl<BfResolvedArg>& argValues);
  499. void FinishDeferredEvals(BfResolvedArgs& argValues);
  500. bool LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifierNode* propName);
  501. void DoTypeIntAttr(BfTypeReference* typeRef, BfTokenNode* commaToken, BfIdentifierNode* memberName, BfToken token);
  502. //void InitializedSizedArray(BfTupleExpression* createExpr, BfSizedArrayType* arrayType);
  503. void InitializedSizedArray(BfSizedArrayType* sizedArrayType, BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, BfTypedValue* receivingValue = NULL);
  504. void CheckDotToken(BfTokenNode* tokenNode);
  505. void DoMemberReference(BfMemberReferenceExpression* memberRefExpr, BfTypedValue* outCascadeValue);
  506. void CreateObject(BfObjectCreateExpression* objCreateExpr, BfAstNode* allocNode, BfType* allocType, BfInlineTypeReference* inlineTypeRef);
  507. void HandleIndexerExpression(BfIndexerExpression* indexerExpr, BfTypedValue target);
  508. //////////////////////////////////////////////////////////////////////////
  509. virtual void Visit(BfErrorNode* errorNode) override;
  510. virtual void Visit(BfTypeReference* typeRef) override;
  511. virtual void Visit(BfAttributedExpression* attribExpr) override;
  512. virtual void Visit(BfNamedExpression* namedExpr) override;
  513. virtual void Visit(BfBlock* blockExpr) override;
  514. virtual void Visit(BfVariableDeclaration* varDecl) override;
  515. virtual void Visit(BfCaseExpression* caseExpr) override;
  516. virtual void Visit(BfTypedValueExpression* typedValueExpr) override;
  517. virtual void Visit(BfLiteralExpression* literalExpr) override;
  518. virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression) override;
  519. virtual void Visit(BfIdentifierNode* identifierNode) override;
  520. virtual void Visit(BfAttributedIdentifierNode* attrIdentifierNode) override;
  521. virtual void Visit(BfQualifiedNameNode* nameNode) override;
  522. virtual void Visit(BfThisExpression* thisExpr) override;
  523. virtual void Visit(BfBaseExpression* baseExpr) override;
  524. virtual void Visit(BfMixinExpression* mixinExpr) override;
  525. virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
  526. virtual void Visit(BfInitializerExpression* initExpr) override;
  527. virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
  528. virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
  529. virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
  530. virtual void Visit(BfAlignOfExpression* alignOfExpr) override;
  531. virtual void Visit(BfStrideOfExpression* strideOfExpr) override;
  532. virtual void Visit(BfOffsetOfExpression* offsetOfExpr) override;
  533. virtual void Visit(BfNameOfExpression* nameOfExpr) override;
  534. virtual void Visit(BfIsConstExpression* isConstExpr) override;
  535. virtual void Visit(BfDefaultExpression* defaultExpr) override;
  536. virtual void Visit(BfUninitializedExpression* uninitialziedExpr) override;
  537. virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
  538. virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
  539. virtual void Visit(BfCastExpression* castExpr) override;
  540. virtual void Visit(BfDelegateBindExpression* delegateBindExpr) override;
  541. virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
  542. virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;
  543. virtual void Visit(BfBoxExpression* boxExpr) override;
  544. virtual void Visit(BfInvocationExpression* invocationExpr) override;
  545. virtual void Visit(BfConditionalExpression* condExpr) override;
  546. virtual void Visit(BfAssignmentExpression* assignExpr) override;
  547. virtual void Visit(BfParenthesizedExpression* parenExpr) override;
  548. virtual void Visit(BfTupleExpression* tupleExpr) override;
  549. virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
  550. virtual void Visit(BfIndexerExpression* indexerExpr) override;
  551. virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
  552. virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
  553. };
  554. NS_BF_END