Просмотр исходного кода

Expanded detection of unqualified-dot-attempt in arguments

Brian Fiete 1 год назад
Родитель
Сommit
fe6d5fa16f
1 измененных файлов с 30 добавлено и 20 удалено
  1. 30 20
      IDEHelper/Compiler/BfExprEvaluator.cpp

+ 30 - 20
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -6103,26 +6103,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
 		{
 			resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_LambdaBindAttempt);
 			handled = true;
-		}
-		else if (auto memberRef = BfNodeDynCast<BfMemberReferenceExpression>(argExpr))
-		{
-			if (memberRef->mTarget == NULL)
-			{
-				resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_UnqualifiedDotAttempt);
-				handled = true;
-			}
-		}
-		else if (auto invokeExpr = BfNodeDynCast<BfInvocationExpression>(argExpr))
-		{
-			if (auto memberRef = BfNodeDynCast<BfMemberReferenceExpression>(invokeExpr->mTarget))
-			{
-				if (memberRef->mTarget == NULL)
-				{
-					resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_UnqualifiedDotAttempt);
-					handled = true;
-				}
-			}
-		}
+		}		
 		else if (auto defaultExpr = BfNodeDynCast<BfDefaultExpression>(argExpr))
 		{
 			if (defaultExpr->mTypeRef == NULL)
@@ -6161,6 +6142,35 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
 			}
 		}*/
 
+		if (!handled)
+		{
+			BfAstNode* checkArgExpr = argExpr;
+			while (checkArgExpr != NULL)
+			{
+				if (auto memberRef = BfNodeDynCast<BfMemberReferenceExpression>(checkArgExpr))
+				{
+					if (memberRef->mTarget == NULL)
+					{
+						resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_UnqualifiedDotAttempt);
+						handled = true;
+						break;
+					}
+					else
+						checkArgExpr = memberRef->mTarget;
+				}
+				else if (auto invokeExpr = BfNodeDynCast<BfInvocationExpression>(checkArgExpr))
+				{
+					checkArgExpr = invokeExpr->mTarget;
+				}
+				else if (auto parenExpr = BfNodeDynCast<BfParenthesizedExpression>(checkArgExpr))
+				{
+					checkArgExpr = parenExpr->mExpression;
+				}
+				else
+					break;
+			}
+		}
+
 		if ((argExpr != NULL) && (!handled))
 		{
 			bool deferParamValues = (flags & BfResolveArgsFlag_DeferParamValues) != 0;