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)); }