BfDeferEvalChecker.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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_Negate:
  124. case BfUnaryOp_Positive:
  125. case BfUnaryOp_InvertBits:
  126. VisitChild(unaryOpExpr->mExpression);
  127. break;
  128. // case BfUnaryOp_Params:
  129. // mNeedsDeferEval = true;
  130. // break;
  131. default:
  132. mNeedsDeferEval = false;
  133. }
  134. }
  135. void BfDeferEvalChecker::Visit(BfObjectCreateExpression * objCreateExpr)
  136. {
  137. if (objCreateExpr->mTypeRef != NULL)
  138. {
  139. if (objCreateExpr->mTypeRef->IsExact<BfDotTypeReference>())
  140. mNeedsDeferEval = true;
  141. }
  142. }
  143. void BfDeferEvalChecker::Visit(BfBinaryOperatorExpression* binOpExpr)
  144. {
  145. switch (binOpExpr->mOp)
  146. {
  147. case BfBinaryOp_Add:
  148. case BfBinaryOp_Subtract:
  149. case BfBinaryOp_Multiply:
  150. case BfBinaryOp_Divide:
  151. case BfBinaryOp_Modulus:
  152. case BfBinaryOp_BitwiseAnd:
  153. case BfBinaryOp_BitwiseOr:
  154. case BfBinaryOp_ExclusiveOr:
  155. case BfBinaryOp_LeftShift:
  156. case BfBinaryOp_RightShift:
  157. case BfBinaryOp_GreaterThan:
  158. case BfBinaryOp_LessThan:
  159. case BfBinaryOp_GreaterThanOrEqual:
  160. case BfBinaryOp_LessThanOrEqual:
  161. {
  162. VisitChild(binOpExpr->mLeft);
  163. bool prev = mNeedsDeferEval;
  164. VisitChild(binOpExpr->mRight);
  165. mNeedsDeferEval |= prev;
  166. }
  167. break;
  168. default:
  169. mNeedsDeferEval = false;
  170. }
  171. }
  172. void BfDeferEvalChecker::Visit(BfDefaultExpression* defaultExpr)
  173. {
  174. if (defaultExpr->mTypeRef == NULL)
  175. mNeedsDeferEval = true;
  176. }
  177. void BfDeferEvalChecker::Visit(BfVariableDeclaration* varDecl)
  178. {
  179. if (varDecl != mRootNode)
  180. mNeedsDeferEval = true;
  181. }