BfDeferEvalChecker.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include "BfDeferEvalChecker.h"
  2. #include "BfUtil.h"
  3. USING_NS_BF;
  4. BfDeferEvalChecker::BfDeferEvalChecker()
  5. {
  6. mRootNode = NULL;
  7. mNeedsDeferEval = false;
  8. mDeferLiterals = true;
  9. mDeferStrings = false;
  10. mDeferDelegateBind = true;
  11. }
  12. void BfDeferEvalChecker::Check(BfAstNode* node)
  13. {
  14. if (auto namedNode = BfNodeDynCastExact<BfNamedExpression>(node))
  15. node = namedNode->mExpression;
  16. if (node == NULL)
  17. return;
  18. SetAndRestoreValue<BfAstNode*> rootNode(mRootNode, node);
  19. node->Accept(this);
  20. }
  21. void BfDeferEvalChecker::Visit(BfAstNode* attribExpr)
  22. {
  23. mNeedsDeferEval = false;
  24. }
  25. void BfDeferEvalChecker::Visit(BfAttributedExpression* attributedExpr)
  26. {
  27. VisitChild(attributedExpr->mExpression);
  28. }
  29. void BfDeferEvalChecker::Visit(BfInitializerExpression* collectionInitExpr)
  30. {
  31. VisitChild(collectionInitExpr->mTarget);
  32. }
  33. void BfDeferEvalChecker::Visit(BfLiteralExpression* literalExpr)
  34. {
  35. switch (literalExpr->mValue.mTypeCode)
  36. {
  37. case BfTypeCode_NullPtr:
  38. case BfTypeCode_Boolean:
  39. case BfTypeCode_Char8:
  40. case BfTypeCode_Int8:
  41. case BfTypeCode_UInt8:
  42. case BfTypeCode_Int16:
  43. case BfTypeCode_UInt16:
  44. case BfTypeCode_Int32:
  45. case BfTypeCode_UInt32:
  46. case BfTypeCode_Int64:
  47. case BfTypeCode_UInt64:
  48. case BfTypeCode_IntPtr:
  49. case BfTypeCode_UIntPtr:
  50. case BfTypeCode_IntUnknown:
  51. case BfTypeCode_UIntUnknown:
  52. if (mDeferLiterals)
  53. mNeedsDeferEval = true;
  54. break;
  55. case BfTypeCode_CharPtr:
  56. if (mDeferStrings)
  57. mNeedsDeferEval = true;
  58. break;
  59. default:
  60. mNeedsDeferEval = false;
  61. }
  62. }
  63. void BfDeferEvalChecker::Visit(BfCastExpression* castExpr)
  64. {
  65. if (auto namedTypeRef = BfNodeDynCastExact<BfNamedTypeReference>(castExpr->mTypeRef))
  66. {
  67. if (namedTypeRef->ToString() == "ExpectedType")
  68. {
  69. mNeedsDeferEval = true;
  70. }
  71. }
  72. else if (auto dotTypeRef = BfNodeDynCastExact<BfDotTypeReference>(castExpr->mTypeRef))
  73. {
  74. mNeedsDeferEval = true;
  75. }
  76. }
  77. void BfDeferEvalChecker::Visit(BfParenthesizedExpression* parenExpr)
  78. {
  79. VisitChild(parenExpr->mExpression);
  80. }
  81. void BfDeferEvalChecker::Visit(BfTupleExpression* tupleExpr)
  82. {
  83. bool needDeferEval = false;
  84. for (auto element : tupleExpr->mValues)
  85. {
  86. VisitChild(element);
  87. needDeferEval |= mNeedsDeferEval;
  88. }
  89. mNeedsDeferEval = needDeferEval;
  90. }
  91. void BfDeferEvalChecker::Visit(BfMemberReferenceExpression* memberRefExpr)
  92. {
  93. // Dotted name?
  94. mNeedsDeferEval = (memberRefExpr->mTarget == NULL);
  95. }
  96. void BfDeferEvalChecker::Visit(BfInvocationExpression* invocationExpr)
  97. {
  98. VisitChild(invocationExpr->mTarget);
  99. }
  100. void BfDeferEvalChecker::Visit(BfLambdaBindExpression* lambdaBindExpr)
  101. {
  102. if (mDeferDelegateBind)
  103. mNeedsDeferEval = true;
  104. }
  105. void BfDeferEvalChecker::Visit(BfDelegateBindExpression* delegateBindExpr)
  106. {
  107. if (mDeferDelegateBind)
  108. mNeedsDeferEval = true;
  109. }
  110. void BfDeferEvalChecker::Visit(BfConditionalExpression* condExpr)
  111. {
  112. VisitChild(condExpr->mConditionExpression);
  113. bool prev = mNeedsDeferEval;
  114. VisitChild(condExpr->mTrueExpression);
  115. prev |= mNeedsDeferEval;
  116. VisitChild(condExpr->mFalseExpression);
  117. mNeedsDeferEval |= prev;
  118. }
  119. void BfDeferEvalChecker::Visit(BfUnaryOperatorExpression* unaryOpExpr)
  120. {
  121. switch (unaryOpExpr->mOp)
  122. {
  123. case BfUnaryOp_Dereference:
  124. case BfUnaryOp_Ref:
  125. case BfUnaryOp_Not:
  126. case BfUnaryOp_Negate:
  127. case BfUnaryOp_Positive:
  128. case BfUnaryOp_InvertBits:
  129. VisitChild(unaryOpExpr->mExpression);
  130. break;
  131. // case BfUnaryOp_Params:
  132. // mNeedsDeferEval = true;
  133. // break;
  134. default:
  135. mNeedsDeferEval = false;
  136. }
  137. }
  138. void BfDeferEvalChecker::Visit(BfObjectCreateExpression * objCreateExpr)
  139. {
  140. if (objCreateExpr->mTypeRef != NULL)
  141. {
  142. if (objCreateExpr->mTypeRef->IsExact<BfDotTypeReference>())
  143. mNeedsDeferEval = true;
  144. }
  145. }
  146. void BfDeferEvalChecker::Visit(BfBinaryOperatorExpression* binOpExpr)
  147. {
  148. switch (binOpExpr->mOp)
  149. {
  150. case BfBinaryOp_Add:
  151. case BfBinaryOp_Subtract:
  152. case BfBinaryOp_Multiply:
  153. case BfBinaryOp_Divide:
  154. case BfBinaryOp_Modulus:
  155. case BfBinaryOp_BitwiseAnd:
  156. case BfBinaryOp_BitwiseOr:
  157. case BfBinaryOp_ExclusiveOr:
  158. case BfBinaryOp_LeftShift:
  159. case BfBinaryOp_RightShift:
  160. case BfBinaryOp_GreaterThan:
  161. case BfBinaryOp_LessThan:
  162. case BfBinaryOp_GreaterThanOrEqual:
  163. case BfBinaryOp_LessThanOrEqual:
  164. {
  165. VisitChild(binOpExpr->mLeft);
  166. bool prev = mNeedsDeferEval;
  167. VisitChild(binOpExpr->mRight);
  168. mNeedsDeferEval |= prev;
  169. }
  170. break;
  171. default:
  172. mNeedsDeferEval = false;
  173. }
  174. }
  175. void BfDeferEvalChecker::Visit(BfDefaultExpression* defaultExpr)
  176. {
  177. if (defaultExpr->mTypeRef == NULL)
  178. mNeedsDeferEval = true;
  179. }
  180. void BfDeferEvalChecker::Visit(BfVariableDeclaration* varDecl)
  181. {
  182. if (varDecl != mRootNode)
  183. mNeedsDeferEval = true;
  184. }