// 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);
     }
 }
示例#3
0
            // 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();
                }
            }