public void Visit(ReturnAst ast) { PrintWrap("Return", () => { if (ast.ReturnExpression != null) { ast.ReturnExpression.Visit(this); } }); }
private void ReturnDo(ReturnAst returnAst) { if (returnAst.ReturnExpression != null) { var value = Exec(returnAst.ReturnExpression); throw new ReturnException(value); } throw new ReturnException(null); }
public void Visit(ReturnAst ast) { if (ast.ReturnExpression != null) { ast.ReturnExpression.Visit(this); ast.AstSymbolType = ast.ReturnExpression.AstSymbolType; CurrentMethod.ReturnAst = ast; } }
public void Visit(ReturnAst ast) { Exec(ast); }
public void Visit(VarDeclrAst ast) { var isVar = ast.DeclarationType.Token.TokenType == TokenType.Infer; if (ast.DeclarationType != null && !isVar) { var symbol = ScopeUtil.DefineUserSymbol(ast.DeclarationType, ast.VariableName); symbol.IsArray = ast is ArrayDeclrAst; DefineToScope(ast, symbol); ast.AstSymbolType = symbol.Type; } if (ast.VariableValue == null && isVar) { var symbol = ScopeUtil.DefineUserSymbol(ast.DeclarationType, ast.VariableName); DefineToScope(ast, symbol); ast.AstSymbolType = symbol.Type; } else if (ast.VariableValue != null) { ast.VariableValue.Visit(this); // if its type inferred, determine the declaration by the value's type if (isVar) { // if the right hand side is a method declaration, make sure to track the source value // this way we can reference it later to determine not only that this is a method type, but what // is the expected return value for static type checking later var val = ast.VariableValue.ConvertedExpression ?? ast.VariableValue; ast.AstSymbolType = val is MethodDeclr ? new BuiltInType(ExpressionTypes.Method, val) : val.AstSymbolType; var symbol = ScopeUtil.DefineUserSymbol(ast.AstSymbolType, ast.VariableName); symbol.IsArray = ast is ArrayDeclrAst; DefineToScope(ast, symbol); } else if (ResolvingTypes) { var declaredType = ScopeUtil.CreateSymbolType(ast.DeclarationType); var value = ast.VariableValue.ConvertedExpression ?? ast.VariableValue; ReturnAst returnType = null; // when we're resolving types check if the rhs is a function invoke. if it is, see // what the return value of the src expression is so we can make sure that the // lhs and the rhs match. try { returnType = value is FuncInvoke ? ((value as FuncInvoke).AstSymbolType) != null ? ((value as FuncInvoke).AstSymbolType.Src as MethodDeclr).ReturnAst : null : null; } catch { } value = returnType != null ? returnType.ReturnExpression : value; if (!TokenUtil.EqualOrPromotable(value.AstSymbolType.ExpressionType, declaredType.ExpressionType)) { throw new InvalidSyntax(String.Format("Cannot assign {0} of type {1} to {2}", ast.VariableValue, value.AstSymbolType.ExpressionType, declaredType.ExpressionType)); } } } SetScope(ast); }