コード例 #1
0
        public override bool Validate(Context context, Scope scope, IStatement statement, out string message)
        {
            if (!(statement is FunctionStatement funcDefStt))
            {
                throw new InvalidOperationException();
            }

            if (funcDefStt.Parameters != null && funcDefStt.Parameters.Length > 0)
            {
                scope = new Scope(context, scope);
                foreach (var p in funcDefStt.Parameters)
                {
                    scope.ReserveNewVariable(p.TypeDescriptor, p.Name);
                }
            }

            var functionName = funcDefStt.Name;

            if (scope.IsIdentifierExists(functionName))
            {
                message = IdentifierNameExistsCompilerException.CreateMessage(functionName, funcDefStt.Info);
                return(false);
            }

            if (funcDefStt.TypeDescriptor.IsVoid())
            {
                if (!CheckVoidReturn(context, scope, funcDefStt))
                {
                    //throw new InvalidStatementStructureCompilerException("Non void return on a void function.", funcDefStt.Info);
                    message = "Non-void return inside a void function";
                    return(false);
                }
            }
            else
            {
                var(assertion, assertTarget) =
                    CheckReturnOnAllPaths(context, scope, funcDefStt.TypeDescriptor, funcDefStt);
                if (assertion != 0)
                {
                    //throw new InvalidStatementStructureCompilerException("Not all paths return a value.", funcDefStt.Info);
                    message = assertion == 2
                        ? "Void return inside a non-void function"
                        : "Not all paths return a value";
                    return(false);
                }
            }

            return(base.Validate(context, scope, statement, out message));
        }
        public override bool Validate(Context context, Scope scope, IStatement statement, out string message)
        {
            if (!(statement is VariableDefinitionStatement varDefStt))
            {
                throw new InvalidOperationException();
            }

            var variableName = varDefStt.Name;

            if (scope.IsIdentifierExists(variableName))
            {
                message = IdentifierNameExistsCompilerException.CreateMessage(variableName, varDefStt.Info);
                return(false);
            }

            return(base.Validate(context, scope, statement, out message));
        }