2
0

BfExprEvaluator.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. };
  19. enum BfResolveArgFlags
  20. {
  21. BfResolveArgFlag_None = 0,
  22. BfResolveArgFlag_DeferFixits = 1,
  23. BfResolveArgFlag_DeferParamValues = 2, // We still evaluate but don't generate code until the method is selected (for SkipCall support)
  24. BfResolveArgFlag_DeferParamEval = 4,
  25. BfResolveArgFlag_AllowUnresolvedTypes = 8,
  26. };
  27. class BfResolvedArg
  28. {
  29. public:
  30. BfTypedValue mTypedValue;
  31. BfType* mResolvedType;
  32. BfAstNode* mExpression;
  33. BfArgFlags mArgFlags;
  34. BfType* mExpectedType;
  35. BfType* mBestBoundType;
  36. bool mWantsRecalc;
  37. public:
  38. BfResolvedArg()
  39. {
  40. mResolvedType = NULL;
  41. mExpression = NULL;
  42. mArgFlags = BfArgFlag_None;
  43. mExpectedType = NULL;
  44. mBestBoundType = NULL;
  45. mWantsRecalc = false;
  46. }
  47. bool IsDeferredEval()
  48. {
  49. return (mArgFlags & (BfArgFlag_DelegateBindAttempt | BfArgFlag_LambdaBindAttempt | BfArgFlag_UnqualifiedDotAttempt | BfArgFlag_UntypedDefault | BfArgFlag_DeferredEval)) != 0;
  50. }
  51. };
  52. struct BfResolvedArgs
  53. {
  54. SizedArray<BfResolvedArg, 4> mResolvedArgs;
  55. BfTokenNode* mOpenToken;
  56. const BfSizedArray<BfExpression*>* mArguments;
  57. const BfSizedArray<BfTokenNode*>* mCommas;
  58. BfTokenNode* mCloseToken;
  59. public:
  60. BfResolvedArgs()
  61. {
  62. mOpenToken = NULL;
  63. mArguments = NULL;
  64. mCommas = NULL;
  65. mCloseToken = NULL;
  66. }
  67. BfResolvedArgs(BfSizedArray<BfExpression*>* args)
  68. {
  69. mOpenToken = NULL;
  70. mArguments = args;
  71. mCommas = NULL;
  72. mCloseToken = NULL;
  73. }
  74. BfResolvedArgs(BfTokenNode* openToken, BfSizedArray<BfExpression*>* args, BfSizedArray<BfTokenNode*>* commas, BfTokenNode* closeToken)
  75. {
  76. mOpenToken = openToken;
  77. mArguments = args;
  78. mCommas = commas;
  79. mCloseToken = closeToken;
  80. }
  81. void Init(const BfSizedArray<BfExpression*>* args)
  82. {
  83. mOpenToken = NULL;
  84. mArguments = args;
  85. mCommas = NULL;
  86. mCloseToken = NULL;
  87. }
  88. void HandleFixits(BfModule* module);
  89. };
  90. class BfMethodMatcher
  91. {
  92. public:
  93. struct BfAmbiguousEntry
  94. {
  95. BfMethodInstance* mMethodInstance;
  96. BfTypeVector mBestMethodGenericArguments;
  97. };
  98. enum MatchFailKind
  99. {
  100. MatchFailKind_None,
  101. MatchFailKind_Protection,
  102. MatchFailKind_CheckedMismatch
  103. };
  104. public:
  105. BfAstNode* mTargetSrc;
  106. BfModule* mModule;
  107. BfTypeDef* mActiveTypeDef;
  108. String mMethodName;
  109. BfMethodInstance* mInterfaceMethodInstance;
  110. SizedArrayImpl<BfResolvedArg>& mArguments;
  111. BfMethodType mMethodType;
  112. BfCheckedKind mCheckedKind;
  113. bool mHadExplicitGenericArguments;
  114. bool mHasVarArguments;
  115. bool mBypassVirtual;
  116. bool mAllowImplicitThis;
  117. bool mAllowStatic;
  118. bool mAllowNonStatic;
  119. bool mSkipImplicitParams;
  120. int mMethodCheckCount;
  121. int mInferGenericProgressIdx;
  122. BfType* mExplicitInterfaceCheck;
  123. MatchFailKind mMatchFailKind;
  124. BfTypeVector mCheckMethodGenericArguments;
  125. SizedArray<BfIRValue, 4> mPrevArgValues;
  126. BfType* mSelfType; // Only when matching interfaces when 'Self' needs to refer back to the implementing type
  127. BfMethodDef* mBackupMethodDef;
  128. int mBackupArgMatchCount;
  129. BfMethodDef* mBestMethodDef;
  130. BfTypeInstance* mBestMethodTypeInstance;
  131. BfModuleMethodInstance mBestMethodInstance;
  132. SizedArray<int, 4> mBestMethodGenericArgumentSrcs;
  133. BfTypeVector mBestMethodGenericArguments;
  134. BfTypeVector mExplicitMethodGenericArguments;
  135. bool mFakeConcreteTarget;
  136. Array<BfAmbiguousEntry> mAmbiguousEntries;
  137. public:
  138. BfTypedValue ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute);
  139. bool InferGenericArgument(BfMethodInstance* methodInstance, BfType* argType, BfType* wantType, BfIRValue argValue);
  140. bool InferFromGenericConstraints(BfGenericParamInstance* genericParamInst, BfTypeVector* methodGenericArgs);
  141. void CompareMethods(BfMethodInstance* prevMethodInstance, BfTypeVector* prevGenericArgumentsSubstitute,
  142. BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute,
  143. bool* outNewIsBetter, bool* outNewIsWorse, bool allowSpecializeFail);
  144. void FlushAmbiguityError();
  145. public:
  146. BfMethodMatcher(BfAstNode* targetSrc, BfModule* module, const StringImpl& methodName, SizedArrayImpl<BfResolvedArg>& arguments, BfSizedArray<ASTREF(BfTypeReference*)>* methodGenericArguments);
  147. BfMethodMatcher(BfAstNode* targetSrc, BfModule* module, BfMethodInstance* interfaceMethodInstance, SizedArrayImpl<BfResolvedArg>& arguments, BfSizedArray<ASTREF(BfTypeReference*)>* methodGenericArguments = NULL);
  148. void Init(/*SizedArrayImpl<BfResolvedArg>& arguments, */BfSizedArray<ASTREF(BfTypeReference*)>* methodGenericArguments);
  149. bool IsMemberAccessible(BfTypeInstance* typeInst, BfTypeDef* declaringType);
  150. bool CheckType(BfTypeInstance* typeInstance, BfTypedValue target, bool isFailurePass);
  151. void CheckOuterTypeStaticMethods(BfTypeInstance* typeInstance, bool isFailurePass);
  152. bool WantsCheckMethod(BfProtectionCheckFlags& flags, BfTypeInstance* startTypeInstance, BfTypeInstance* checkTypeInstance, BfMethodDef* methodDef);
  153. bool CheckMethod(BfTypeInstance* typeInstance, BfMethodDef* checkMethod, bool isFailurePass);
  154. void TryDevirtualizeCall(BfTypedValue target, BfTypedValue* origTarget = NULL, BfTypedValue* staticResult = NULL);
  155. };
  156. class BfBaseClassWalker
  157. {
  158. public:
  159. struct Entry
  160. {
  161. BfType* mSrcType;
  162. BfTypeInstance* mTypeInstance;
  163. Entry(BfType* srcType, BfTypeInstance* typeInstance)
  164. {
  165. mSrcType = srcType;
  166. mTypeInstance = typeInstance;
  167. }
  168. Entry()
  169. {
  170. mSrcType = NULL;
  171. mTypeInstance = NULL;
  172. }
  173. bool operator==(const Entry& rhs)
  174. {
  175. return (mSrcType == rhs.mSrcType) && (mTypeInstance == rhs.mTypeInstance);
  176. }
  177. };
  178. BfTypeInstance* mTypes[2];
  179. Array<Entry> mManualList;
  180. bool mMayBeFromInterface;
  181. public:
  182. BfBaseClassWalker();
  183. BfBaseClassWalker(BfType* typeA, BfType* typeB, BfModule* module);
  184. void AddConstraints(BfType* srcType, BfGenericParamInstance* genericParam);
  185. public:
  186. Entry Next();
  187. };
  188. class BfFunctionBindResult
  189. {
  190. public:
  191. BfTypedValue mOrigTarget;
  192. BfTypedValue mTarget;
  193. BfIRValue mFunc;
  194. BfMethodInstance* mMethodInstance;
  195. bool mSkipThis;
  196. bool mSkipMutCheck;
  197. bool mWantsArgs;
  198. bool mCheckedMultipleMethods;
  199. SizedArray<BfIRValue, 2> mIRArgs;
  200. public:
  201. BfFunctionBindResult()
  202. {
  203. mMethodInstance = NULL;
  204. mSkipMutCheck = false;
  205. mWantsArgs = false;
  206. mSkipThis = false;
  207. mCheckedMultipleMethods = false;
  208. }
  209. };
  210. struct DeferredTupleAssignData
  211. {
  212. struct Entry
  213. {
  214. BfExpression* mExpr;
  215. BfExprEvaluator* mExprEvaluator;
  216. DeferredTupleAssignData* mInnerTuple;
  217. };
  218. Array<Entry> mChildren;
  219. BfTupleType* mTupleType;
  220. ~DeferredTupleAssignData();
  221. };
  222. enum BfImplicitParamKind
  223. {
  224. BfImplicitParamKind_General,
  225. BfImplicitParamKind_GenericMethodMember,
  226. BfImplicitParamKind_GenericTypeMember,
  227. BfImplicitParamKind_GenericTypeMember_Addr,
  228. };
  229. enum BfLookupFieldFlags
  230. {
  231. BfLookupFieldFlag_None = 0,
  232. BfLookupFieldFlag_IsImplicitThis = 1,
  233. BfLookupFieldFlag_CheckingOuter = 2
  234. };
  235. enum BfBinOpFlags
  236. {
  237. BfBinOpFlag_None = 0,
  238. BfBinOpFlag_NoClassify = 1,
  239. BfBinOpFlag_ForceLeftType = 2
  240. };
  241. class BfExprEvaluator : public BfStructuralVisitor
  242. {
  243. public:
  244. BfModule* mModule;
  245. BfTypedValue mResult;
  246. BfEvalExprFlags mBfEvalExprFlags;
  247. BfLocalVariable* mResultLocalVar;
  248. int mResultLocalVarField;
  249. int mResultLocalVarFieldCount; // > 1 for structs with multiple members
  250. BfAstNode* mResultLocalVarRefNode;
  251. BfAstNode* mPropSrc;
  252. BfTypedValue mPropTarget;
  253. BfTypedValue mOrigPropTarget;
  254. BfGetMethodInstanceFlags mPropGetMethodFlags;
  255. BfCheckedKind mPropCheckedKind;
  256. BfPropertyDef* mPropDef;
  257. BfType* mExpectingType;
  258. BfAttributeState* mPrefixedAttributeState;
  259. BfTypedValue* mReceivingValue;
  260. BfFunctionBindResult* mFunctionBindResult;
  261. SizedArray<BfResolvedArg, 2> mIndexerValues;
  262. BfAstNode* mDeferCallRef;
  263. BfScopeData* mDeferScopeAlloc;
  264. bool mUsedAsStatement;
  265. bool mPropDefBypassVirtual;
  266. bool mExplicitCast;
  267. bool mResolveGenericParam;
  268. bool mNoBind;
  269. bool mIsVolatileReference;
  270. bool mIsHeapReference;
  271. bool mResultIsTempComposite;
  272. bool mAllowReadOnlyReference;
  273. public:
  274. BfExprEvaluator(BfModule* module);
  275. ~BfExprEvaluator();
  276. void GetLiteral(BfAstNode* refNode, const BfVariant& variant);
  277. void FinishExpressionResult();
  278. virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode);
  279. BfAutoComplete* GetAutoComplete();
  280. BfTypedValue SetupNullConditional(BfTypedValue target, BfTokenNode* dotToken);
  281. void Evaluate(BfAstNode* astNode, bool propogateNullConditional = false, bool ignoreNullConditional = false, bool allowSplat = true);
  282. BfType* BindGenericType(BfAstNode* node, BfType* bindType);
  283. BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
  284. void ResolveGenericType();
  285. void ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgFlags flags = BfResolveArgFlag_None);
  286. BfAllocTarget ResolveAllocTarget(BfAstNode* newNode, BfTokenNode*& newToken);
  287. BfTypedValue ResolveArgValue(BfResolvedArg& resolvedArg, BfType* wantType, BfTypedValue* receivingValue = NULL, BfParamKind paramKind = BfParamKind_Normal);
  288. BfMethodDef* GetPropertyMethodDef(BfPropertyDef* propDef, BfMethodType methodType, BfCheckedKind checkedKind);
  289. BfModuleMethodInstance GetPropertyMethodInstance(BfMethodDef* methodDef);
  290. void CheckPropFail(BfMethodDef* propMethodDef, BfMethodInstance* methodInstance);
  291. BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false);
  292. void CheckResultForReading(BfTypedValue& typedValue);
  293. void MarkResultUsed();
  294. void MarkResultAssigned();
  295. void MakeResultAsValue();
  296. bool CheckModifyResult(BfTypedValue typeValue, BfAstNode* refNode, const char* modifyType, bool onlyNeedsMut = false);
  297. BfTypedValue LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags = BfLookupFieldFlag_None);
  298. void CheckObjectCreateTypeRef(BfType* expectingType, BfAstNode* afterNode);
  299. void LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ignoreInitialError = false, bool* hadError = NULL);
  300. void LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreInitialError, bool* hadError = NULL);
  301. void LookupQualifiedStaticField(BfQualifiedNameNode* nameNode, bool ignoreIdentifierNotFoundError);
  302. void LookupQualifiedStaticField(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreIdentifierNotFoundError);
  303. bool CheckConstCompare(BfBinaryOp binaryOp, BfAstNode* opToken, const BfTypedValue& leftValue, const BfTypedValue& rightValue);
  304. void PerformBinaryOperation(BfType* resultType, BfIRValue convLeftValue, BfIRValue convRightValue, BfBinaryOp binaryOp, BfAstNode* opToken);
  305. void PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue);
  306. void PerformBinaryOperation(BfExpression* leftNode, BfExpression* rightNode, BfBinaryOp binaryOp, BfTokenNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue);
  307. void PerformBinaryOperation(BfExpression* leftNode, BfExpression* rightNode, BfBinaryOp binaryOp, BfTokenNode* opToken, BfBinOpFlags flags);
  308. BfTypedValue LoadLocal(BfLocalVariable* varDecl, bool allowRef = false);
  309. BfTypedValue LookupIdentifier(BfAstNode* identifierNode, const StringImpl& findName, bool ignoreInitialError = false, bool* hadError = NULL);
  310. BfTypedValue LookupIdentifier(BfIdentifierNode* identifierNode, bool ignoreInitialError = false, bool* hadError = NULL);
  311. void AddCallDependencies(BfMethodInstance* methodInstance);
  312. void PerformCallChecks(BfMethodInstance* methodInstance, BfAstNode* targetSrc);
  313. BfTypedValue CreateCall(BfMethodInstance* methodInstance, BfIRValue func, bool bypassVirtual, SizedArrayImpl<BfIRValue>& irArgs, BfTypedValue* sret = NULL, bool isTailCall = false);
  314. BfTypedValue CreateCall(BfAstNode* targetSrc, const BfTypedValue& target, const BfTypedValue& origTarget, BfMethodDef* methodDef, BfModuleMethodInstance methodInstance, bool bypassVirtual, SizedArrayImpl<BfResolvedArg>& argValues, bool skipThis = false);
  315. BfTypedValue CreateCall(BfMethodMatcher* methodMatcher, BfTypedValue target);
  316. void MakeBaseConcrete(BfTypedValue& typedValue);
  317. void SplatArgs(BfTypedValue value, SizedArrayImpl<BfIRValue>& irArgs);
  318. void PushArg(BfTypedValue argVal, SizedArrayImpl<BfIRValue>& irArgs, bool disableSplat = false, bool disableLowering = false);
  319. void PushThis(BfAstNode* targetSrc, BfTypedValue callTarget, BfMethodInstance* methodInstance, SizedArrayImpl<BfIRValue>& irArgs, bool skipMutCheck = false);
  320. BfTypedValue MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType,
  321. BfResolvedArgs& argValues, bool callCtorBodyOnly, bool allowAppendAlloc, BfTypedValue* appendIndexValue = NULL);
  322. BfTypedValue CheckEnumCreation(BfAstNode* targetSrc, BfTypeInstance* enumType, const StringImpl& caseName, BfResolvedArgs& argValues);
  323. BfTypedValue MatchMethod(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, bool allowImplicitThis, bool bypassVirtual, const StringImpl& name,
  324. BfResolvedArgs& argValue, BfSizedArray<ASTREF(BfTypeReference*)>* methodGenericArguments, BfCheckedKind checkedKind = BfCheckedKind_NotSet);
  325. BfTypedValue MakeCallableTarget(BfAstNode* targetSrc, BfTypedValue target);
  326. BfModuleMethodInstance GetSelectedMethod(BfAstNode* targetSrc, BfTypeInstance* curTypeInst, BfMethodDef* methodDef, BfMethodMatcher& methodMatcher);
  327. bool CheckVariableDeclaration(BfAstNode* checkNode, bool requireSimpleIfExpr, bool exprMustBeTrue, bool silentFail);
  328. bool HasVariableDeclaration(BfAstNode* checkNode);
  329. void DoInvocation(BfAstNode* target, BfMethodBoundExpression* methodBoundExpr, const BfSizedArray<BfExpression*>& args, BfSizedArray<ASTREF(BfTypeReference*)>* methodGenericArgs, BfTypedValue* outCascadeValue = NULL);
  330. int GetMixinVariable();
  331. void CheckLocalMethods(BfAstNode* targetSrc, BfTypeInstance* typeInstance, const StringImpl& methodName, BfMethodMatcher& methodMatcher, BfMethodType methodType);
  332. void InjectMixin(BfAstNode* targetSrc, BfTypedValue target, bool allowImplicitThis, const StringImpl& name, const BfSizedArray<BfExpression*>& arguments, BfSizedArray<ASTREF(BfTypeReference*)>* methodGenericArgs);
  333. void SetMethodElementType(BfAstNode* target);
  334. BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfIdentifierNode* identifierNode);
  335. BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfMethodInstance* methodInstance, int paramIdx, bool& failed, BfImplicitParamKind paramKind = BfImplicitParamKind_General, const BfTypedValue& methodRefTarget = BfTypedValue());
  336. bool CanBindDelegate(BfDelegateBindExpression* delegateBindExpr, BfMethodInstance** boundMethod = NULL);
  337. bool IsExactMethodMatch(BfMethodInstance* methodA, BfMethodInstance* methodB, bool ignoreImplicitParams = false);
  338. BfTypeInstance* VerifyBaseDelegateType(BfTypeInstance* delegateType);
  339. void ConstResolve(BfExpression* expr);
  340. void ProcessArrayInitializer(BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, int dimensions, SizedArrayImpl<int64>& dimLengths, int dim, bool& hasFailed);
  341. BfLambdaInstance* GetLambdaInstance(BfLambdaBindExpression* lambdaBindExpr, BfAllocTarget& allocTarget);
  342. void VisitLambdaBodies(BfAstNode* body, BfFieldDtorDeclaration* fieldDtor);
  343. void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic);
  344. void PerformUnaryOperation(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken);
  345. void PerformUnaryOperation_OnResult(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken);
  346. void PerformAssignment(BfAssignmentExpression* assignExpr, bool evaluatedLeft, BfTypedValue rightValue, BfTypedValue* outCascadeValue = NULL);
  347. void PopulateDeferrredTupleAssignData(BfTupleExpression* tupleExr, DeferredTupleAssignData& deferredTupleAssignData);
  348. void AssignDeferrredTupleAssignData(BfAssignmentExpression* assignExpr, DeferredTupleAssignData& deferredTupleAssignData, BfTypedValue rightValue);
  349. void DoTupleAssignment(BfAssignmentExpression* assignExpr);
  350. void FinishDeferredEvals(SizedArrayImpl<BfResolvedArg>& argValues);
  351. bool LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifierNode* propName);
  352. void DoTypeIntAttr(BfTypeReference* typeRef, BfToken token);
  353. //void InitializedSizedArray(BfTupleExpression* createExpr, BfSizedArrayType* arrayType);
  354. void InitializedSizedArray(BfSizedArrayType* sizedArrayType, BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, BfTypedValue* receivingValue = NULL);
  355. void CheckDotToken(BfTokenNode* tokenNode);
  356. void DoMemberReference(BfMemberReferenceExpression* memberRefExpr, BfTypedValue* outCascadeValue);
  357. //////////////////////////////////////////////////////////////////////////
  358. virtual void Visit(BfTypeReference* typeRef) override;
  359. virtual void Visit(BfAttributedExpression* attribExpr) override;
  360. virtual void Visit(BfBlock* blockExpr) override;
  361. virtual void Visit(BfVariableDeclaration* varDecl) override;
  362. virtual void Visit(BfCaseExpression* caseExpr) override;
  363. virtual void Visit(BfTypedValueExpression* typedValueExpr) override;
  364. virtual void Visit(BfLiteralExpression* literalExpr) override;
  365. virtual void Visit(BfIdentifierNode* identifierNode) override;
  366. virtual void Visit(BfAttributedIdentifierNode* attrIdentifierNode) override;
  367. virtual void Visit(BfQualifiedNameNode* nameNode) override;
  368. virtual void Visit(BfThisExpression* thisExpr) override;
  369. virtual void Visit(BfBaseExpression* baseExpr) override;
  370. virtual void Visit(BfMixinExpression* mixinExpr) override;
  371. virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
  372. virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
  373. virtual void Visit(BfParamsExpression* paramsExpr) override;
  374. virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
  375. virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
  376. virtual void Visit(BfAlignOfExpression* alignOfExpr) override;
  377. virtual void Visit(BfStrideOfExpression* strideOfExpr) override;
  378. virtual void Visit(BfDefaultExpression* defaultExpr) override;
  379. virtual void Visit(BfUninitializedExpression* uninitialziedExpr) override;
  380. virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
  381. virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
  382. virtual void Visit(BfCastExpression* castExpr) override;
  383. virtual void Visit(BfDelegateBindExpression* delegateBindExpr) override;
  384. virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
  385. virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;
  386. virtual void Visit(BfBoxExpression* boxExpr) override;
  387. virtual void Visit(BfInvocationExpression* invocationExpr) override;
  388. virtual void Visit(BfConditionalExpression* condExpr) override;
  389. virtual void Visit(BfAssignmentExpression* assignExpr) override;
  390. virtual void Visit(BfParenthesizedExpression* parenExpr) override;
  391. virtual void Visit(BfTupleExpression* tupleExpr) override;
  392. virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
  393. virtual void Visit(BfIndexerExpression* indexerExpr) override;
  394. virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
  395. virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
  396. };
  397. NS_BF_END