// Expressions private bool TryResolveTypesInCallExpression(CallOperator callExpression) { LogTrace($"{nameof( TryResolveTypesInCallExpression )}( {nameof( callExpression )} = {callExpression})"); if (!Scope.TryGetDeclaration(callExpression.Identifier, out var declaration)) { // Disable for now because we import functions at compile time //LogWarning( callExpression, $"Call expression references undeclared identifier '{callExpression.Identifier.Value}'" ); } if (declaration is FunctionDeclaration functionDeclaration) { callExpression.ExpressionValueKind = functionDeclaration.ReturnType.ValueKind; callExpression.Identifier.ExpressionValueKind = ValueKind.Function; } else if (declaration is ProcedureDeclaration procedureDeclaration) { callExpression.ExpressionValueKind = procedureDeclaration.ReturnType.ValueKind; callExpression.Identifier.ExpressionValueKind = ValueKind.Procedure; } foreach (var arg in callExpression.Arguments) { if (!TryResolveTypesInExpression(arg.Expression)) { return(false); } } return(true); }
public virtual void Visit(CallOperator callOperator) { Visit(callOperator.Identifier); foreach (var argument in callOperator.Arguments) { Visit(argument); } }
// Call public override void Visit(CallOperator callOperator) { Write(callOperator.Identifier.Text); if (callOperator.Arguments.Count == 0) { Write("()"); } else { WriteOpenParenthesis(); for (int i = 0; i < callOperator.Arguments.Count; i++) { Visit(callOperator.Arguments[i]); if (i != callOperator.Arguments.Count - 1) { Write(", "); } } WriteCloseParenthesis(); } }