| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import 'package:analyzer/dart/ast/ast.dart'; | |
| 6 import 'package:analyzer/dart/ast/token.dart'; | |
| 7 import 'package:analyzer/src/dart/ast/token.dart'; | |
| 8 import 'package:analyzer/src/generated/utilities_dart.dart'; | |
| 9 import 'package:logging/logging.dart' as logger; | |
| 10 | |
| 11 final _log = new logger.Logger('dev_compiler.ast_builder'); | |
| 12 | |
| 13 // Wrappers around constructors for the dart ast. The AstBuilder class | |
| 14 // provides a higher-level interface, abstracting both from the lexical | |
| 15 // details and some of helper classes. The RawAstBuilder class provides | |
| 16 // a low-level wrapper class (below) abstracts from the lexical details | |
| 17 // but otherwise faithfully mirrors the construction API. | |
| 18 class AstBuilder { | |
| 19 static SimpleIdentifier identifierFromString(String name) { | |
| 20 return RawAstBuilder.identifierFromString(name); | |
| 21 } | |
| 22 | |
| 23 static PrefixedIdentifier prefixedIdentifier( | |
| 24 SimpleIdentifier pre, SimpleIdentifier id) { | |
| 25 return RawAstBuilder.prefixedIdentifier(pre, id); | |
| 26 } | |
| 27 | |
| 28 static TypeParameter typeParameter(SimpleIdentifier name, | |
| 29 [TypeName bound = null]) { | |
| 30 return RawAstBuilder.typeParameter(name, bound); | |
| 31 } | |
| 32 | |
| 33 static TypeParameterList typeParameterList(List<TypeParameter> params) { | |
| 34 return RawAstBuilder.typeParameterList(params); | |
| 35 } | |
| 36 | |
| 37 static TypeArgumentList typeArgumentList(List<TypeName> args) { | |
| 38 return RawAstBuilder.typeArgumentList(args); | |
| 39 } | |
| 40 | |
| 41 static ArgumentList argumentList(List<Expression> args) { | |
| 42 return RawAstBuilder.argumentList(args); | |
| 43 } | |
| 44 | |
| 45 static TypeName typeName(Identifier id, List<TypeName> args) { | |
| 46 TypeArgumentList argList = null; | |
| 47 if (args != null && args.length > 0) argList = typeArgumentList(args); | |
| 48 return RawAstBuilder.typeName(id, argList); | |
| 49 } | |
| 50 | |
| 51 static FunctionTypeAlias functionTypeAlias( | |
| 52 TypeName ret, | |
| 53 SimpleIdentifier name, | |
| 54 List<TypeParameter> tParams, | |
| 55 List<FormalParameter> params) { | |
| 56 TypeParameterList tps = | |
| 57 (tParams.length == 0) ? null : typeParameterList(tParams); | |
| 58 FormalParameterList fps = formalParameterList(params); | |
| 59 return RawAstBuilder.functionTypeAlias(ret, name, tps, fps); | |
| 60 } | |
| 61 | |
| 62 static BooleanLiteral booleanLiteral(bool b) { | |
| 63 return RawAstBuilder.booleanLiteral(b); | |
| 64 } | |
| 65 | |
| 66 static NullLiteral nullLiteral() { | |
| 67 return RawAstBuilder.nullLiteral(); | |
| 68 } | |
| 69 | |
| 70 static IntegerLiteral integerLiteral(int i) { | |
| 71 return RawAstBuilder.integerLiteral(i); | |
| 72 } | |
| 73 | |
| 74 static StringLiteral stringLiteral(String s) { | |
| 75 return RawAstBuilder.simpleStringLiteral(s); | |
| 76 } | |
| 77 | |
| 78 static StringLiteral multiLineStringLiteral(String s) { | |
| 79 return RawAstBuilder.tripleQuotedStringLiteral(s); | |
| 80 } | |
| 81 | |
| 82 static AsExpression asExpression(Expression exp, TypeName type) { | |
| 83 return RawAstBuilder.asExpression(exp, type); | |
| 84 } | |
| 85 | |
| 86 static IsExpression isExpression(Expression exp, TypeName type) { | |
| 87 return RawAstBuilder.isExpression(exp, type); | |
| 88 } | |
| 89 | |
| 90 static ParenthesizedExpression parenthesizedExpression(Expression exp) { | |
| 91 return RawAstBuilder.parenthesizedExpression(exp); | |
| 92 } | |
| 93 | |
| 94 static Expression parenthesize(Expression exp) { | |
| 95 if (exp is Identifier || | |
| 96 exp is ParenthesizedExpression || | |
| 97 exp is FunctionExpressionInvocation || | |
| 98 exp is MethodInvocation) return exp; | |
| 99 return parenthesizedExpression(exp); | |
| 100 } | |
| 101 | |
| 102 static PropertyAccess propertyAccess( | |
| 103 Expression target, SimpleIdentifier name) { | |
| 104 var p = new Token(TokenType.PERIOD, 0); | |
| 105 return new PropertyAccess(target, p, name); | |
| 106 } | |
| 107 | |
| 108 static MethodInvocation methodInvoke( | |
| 109 Expression target, SimpleIdentifier name, NodeList<Expression> args) { | |
| 110 var p = new Token(TokenType.PERIOD, 0); | |
| 111 return new MethodInvocation(target, p, name, null, argumentList(args)); | |
| 112 } | |
| 113 | |
| 114 static TokenType getTokenType(String lexeme) { | |
| 115 switch (lexeme) { | |
| 116 case "&": | |
| 117 return TokenType.AMPERSAND; | |
| 118 case "&&": | |
| 119 return TokenType.AMPERSAND_AMPERSAND; | |
| 120 case "&=": | |
| 121 return TokenType.AMPERSAND_EQ; | |
| 122 case "@": | |
| 123 return TokenType.AT; | |
| 124 case "!": | |
| 125 return TokenType.BANG; | |
| 126 case "!=": | |
| 127 return TokenType.BANG_EQ; | |
| 128 case "|": | |
| 129 return TokenType.BAR; | |
| 130 case "||": | |
| 131 return TokenType.BAR_BAR; | |
| 132 case "|=": | |
| 133 return TokenType.BAR_EQ; | |
| 134 case ":": | |
| 135 return TokenType.COLON; | |
| 136 case ",": | |
| 137 return TokenType.COMMA; | |
| 138 case "^": | |
| 139 return TokenType.CARET; | |
| 140 case "^=": | |
| 141 return TokenType.CARET_EQ; | |
| 142 case "}": | |
| 143 return TokenType.CLOSE_CURLY_BRACKET; | |
| 144 case ")": | |
| 145 return TokenType.CLOSE_PAREN; | |
| 146 case "]": | |
| 147 return TokenType.CLOSE_SQUARE_BRACKET; | |
| 148 case "=": | |
| 149 return TokenType.EQ; | |
| 150 case "==": | |
| 151 return TokenType.EQ_EQ; | |
| 152 case "=>": | |
| 153 return TokenType.FUNCTION; | |
| 154 case ">": | |
| 155 return TokenType.GT; | |
| 156 case ">=": | |
| 157 return TokenType.GT_EQ; | |
| 158 case ">>": | |
| 159 return TokenType.GT_GT; | |
| 160 case ">>=": | |
| 161 return TokenType.GT_GT_EQ; | |
| 162 case "#": | |
| 163 return TokenType.HASH; | |
| 164 case "[]": | |
| 165 return TokenType.INDEX; | |
| 166 case "[]=": | |
| 167 return TokenType.INDEX_EQ; | |
| 168 case "is": | |
| 169 return TokenType.IS; | |
| 170 case "<": | |
| 171 return TokenType.LT; | |
| 172 case "<=": | |
| 173 return TokenType.LT_EQ; | |
| 174 case "<<": | |
| 175 return TokenType.LT_LT; | |
| 176 case "<<=": | |
| 177 return TokenType.LT_LT_EQ; | |
| 178 case "-": | |
| 179 return TokenType.MINUS; | |
| 180 case "-=": | |
| 181 return TokenType.MINUS_EQ; | |
| 182 case "--": | |
| 183 return TokenType.MINUS_MINUS; | |
| 184 case "{": | |
| 185 return TokenType.OPEN_CURLY_BRACKET; | |
| 186 case "(": | |
| 187 return TokenType.OPEN_PAREN; | |
| 188 case "[": | |
| 189 return TokenType.OPEN_SQUARE_BRACKET; | |
| 190 case "%": | |
| 191 return TokenType.PERCENT; | |
| 192 case "%=": | |
| 193 return TokenType.PERCENT_EQ; | |
| 194 case ".": | |
| 195 return TokenType.PERIOD; | |
| 196 case "..": | |
| 197 return TokenType.PERIOD_PERIOD; | |
| 198 case "+": | |
| 199 return TokenType.PLUS; | |
| 200 case "+=": | |
| 201 return TokenType.PLUS_EQ; | |
| 202 case "++": | |
| 203 return TokenType.PLUS_PLUS; | |
| 204 case "?": | |
| 205 return TokenType.QUESTION; | |
| 206 case ";": | |
| 207 return TokenType.SEMICOLON; | |
| 208 case "/": | |
| 209 return TokenType.SLASH; | |
| 210 case "/=": | |
| 211 return TokenType.SLASH_EQ; | |
| 212 case "*": | |
| 213 return TokenType.STAR; | |
| 214 case "*=": | |
| 215 return TokenType.STAR_EQ; | |
| 216 case "\${": | |
| 217 return TokenType.STRING_INTERPOLATION_EXPRESSION; | |
| 218 case "\$": | |
| 219 return TokenType.STRING_INTERPOLATION_IDENTIFIER; | |
| 220 case "~": | |
| 221 return TokenType.TILDE; | |
| 222 case "~/": | |
| 223 return TokenType.TILDE_SLASH; | |
| 224 case "~/=": | |
| 225 return TokenType.TILDE_SLASH_EQ; | |
| 226 case "`": | |
| 227 return TokenType.BACKPING; | |
| 228 case "\\": | |
| 229 return TokenType.BACKSLASH; | |
| 230 case "...": | |
| 231 return TokenType.PERIOD_PERIOD_PERIOD; | |
| 232 case "??": | |
| 233 return TokenType.QUESTION_QUESTION; | |
| 234 case "??=": | |
| 235 return TokenType.QUESTION_QUESTION_EQ; | |
| 236 default: | |
| 237 return null; | |
| 238 } | |
| 239 } | |
| 240 | |
| 241 static Token _binaryOperation(String oper) { | |
| 242 var type = getTokenType(oper); | |
| 243 assert(type != null); | |
| 244 return new Token(type, 0); | |
| 245 } | |
| 246 | |
| 247 static BinaryExpression binaryExpression( | |
| 248 Expression l, String oper, Expression r) { | |
| 249 Token token = _binaryOperation(oper); | |
| 250 return RawAstBuilder.binaryExpression(l, token, r); | |
| 251 } | |
| 252 | |
| 253 static ConditionalExpression conditionalExpression( | |
| 254 Expression cond, Expression tExp, Expression fExp) { | |
| 255 return RawAstBuilder.conditionalExpression(cond, tExp, fExp); | |
| 256 } | |
| 257 | |
| 258 static Expression application(Expression function, List<Expression> es) { | |
| 259 ArgumentList args = argumentList(es); | |
| 260 return RawAstBuilder.functionExpressionInvocation(function, args); | |
| 261 } | |
| 262 | |
| 263 static FormalParameterList formalParameterList(List<FormalParameter> params) { | |
| 264 return RawAstBuilder.formalParameterList(params); | |
| 265 } | |
| 266 | |
| 267 static Block block(List<Statement> statements) { | |
| 268 return RawAstBuilder.block(statements); | |
| 269 } | |
| 270 | |
| 271 static MethodDeclaration blockMethodDeclaration( | |
| 272 TypeName rt, | |
| 273 SimpleIdentifier m, | |
| 274 List<FormalParameter> params, | |
| 275 List<Statement> statements, | |
| 276 {bool isStatic: false}) { | |
| 277 FormalParameterList fl = formalParameterList(params); | |
| 278 Block b = block(statements); | |
| 279 BlockFunctionBody body = RawAstBuilder.blockFunctionBody(b); | |
| 280 return RawAstBuilder.methodDeclaration(rt, m, fl, body, isStatic: isStatic); | |
| 281 } | |
| 282 | |
| 283 static FunctionDeclaration blockFunctionDeclaration( | |
| 284 TypeName rt, | |
| 285 SimpleIdentifier f, | |
| 286 List<FormalParameter> params, | |
| 287 List<Statement> statements) { | |
| 288 FunctionExpression fexp = blockFunction(params, statements); | |
| 289 return RawAstBuilder.functionDeclaration(rt, f, fexp); | |
| 290 } | |
| 291 | |
| 292 static FunctionExpression blockFunction( | |
| 293 List<FormalParameter> params, List<Statement> statements) { | |
| 294 FormalParameterList fl = formalParameterList(params); | |
| 295 Block b = block(statements); | |
| 296 BlockFunctionBody body = RawAstBuilder.blockFunctionBody(b); | |
| 297 return RawAstBuilder.functionExpression(fl, body); | |
| 298 } | |
| 299 | |
| 300 static FunctionExpression expressionFunction( | |
| 301 List<FormalParameter> params, Expression body, | |
| 302 [bool decl = false]) { | |
| 303 FormalParameterList fl = formalParameterList(params); | |
| 304 ExpressionFunctionBody b = RawAstBuilder.expressionFunctionBody(body, decl); | |
| 305 return RawAstBuilder.functionExpression(fl, b); | |
| 306 } | |
| 307 | |
| 308 static FunctionDeclarationStatement functionDeclarationStatement( | |
| 309 TypeName rType, SimpleIdentifier name, FunctionExpression fe) { | |
| 310 var fd = RawAstBuilder.functionDeclaration(rType, name, fe); | |
| 311 return RawAstBuilder.functionDeclarationStatement(fd); | |
| 312 } | |
| 313 | |
| 314 static Statement returnExpression([Expression e]) { | |
| 315 return RawAstBuilder.returnExpression(e); | |
| 316 } | |
| 317 | |
| 318 // let b = e1 in e2 == (\b.e2)(e1) | |
| 319 static Expression letExpression( | |
| 320 FormalParameter b, Expression e1, Expression e2) { | |
| 321 FunctionExpression l = expressionFunction(<FormalParameter>[b], e2); | |
| 322 return application(parenthesize(l), <Expression>[e1]); | |
| 323 } | |
| 324 | |
| 325 static SimpleFormalParameter simpleFormal(SimpleIdentifier v, TypeName t) { | |
| 326 return RawAstBuilder.simpleFormalParameter(v, t); | |
| 327 } | |
| 328 | |
| 329 static FunctionTypedFormalParameter functionTypedFormal( | |
| 330 TypeName ret, SimpleIdentifier v, List<FormalParameter> params) { | |
| 331 FormalParameterList ps = formalParameterList(params); | |
| 332 return RawAstBuilder.functionTypedFormalParameter(ret, v, ps); | |
| 333 } | |
| 334 | |
| 335 static FormalParameter requiredFormal(NormalFormalParameter fp) { | |
| 336 return RawAstBuilder.requiredFormalParameter(fp); | |
| 337 } | |
| 338 | |
| 339 static FormalParameter optionalFormal(NormalFormalParameter fp) { | |
| 340 return RawAstBuilder.optionalFormalParameter(fp); | |
| 341 } | |
| 342 | |
| 343 static FormalParameter namedFormal(NormalFormalParameter fp) { | |
| 344 return RawAstBuilder.namedFormalParameter(fp); | |
| 345 } | |
| 346 | |
| 347 static NamedExpression namedParameter(String s, Expression e) { | |
| 348 return namedExpression(s, e); | |
| 349 } | |
| 350 | |
| 351 static NamedExpression namedExpression(String s, Expression e) { | |
| 352 return RawAstBuilder.namedExpression(identifierFromString(s), e); | |
| 353 } | |
| 354 | |
| 355 /// Declares a single variable `var <name> = <init>` with the type and name | |
| 356 /// specified by the VariableElement. See also [variableStatement]. | |
| 357 static VariableDeclarationList declareVariable(SimpleIdentifier name, | |
| 358 [Expression init]) { | |
| 359 var eqToken = init != null ? new Token(TokenType.EQ, 0) : null; | |
| 360 var varToken = new KeywordToken(Keyword.VAR, 0); | |
| 361 return new VariableDeclarationList(null, null, varToken, null, | |
| 362 [new VariableDeclaration(name, eqToken, init)]); | |
| 363 } | |
| 364 | |
| 365 static VariableDeclarationStatement variableStatement(SimpleIdentifier name, | |
| 366 [Expression init]) { | |
| 367 return RawAstBuilder | |
| 368 .variableDeclarationStatement(declareVariable(name, init)); | |
| 369 } | |
| 370 | |
| 371 static InstanceCreationExpression instanceCreation( | |
| 372 ConstructorName ctor, List<Expression> args) { | |
| 373 var newToken = new KeywordToken(Keyword.NEW, 0); | |
| 374 return new InstanceCreationExpression( | |
| 375 newToken, ctor, RawAstBuilder.argumentList(args)); | |
| 376 } | |
| 377 } | |
| 378 | |
| 379 // This class provides a low-level wrapper around the constructors for | |
| 380 // the AST. It mostly simply abstracts from the lexical tokens. | |
| 381 class RawAstBuilder { | |
| 382 static ConstructorName constructorName(TypeName type, | |
| 383 [SimpleIdentifier name]) { | |
| 384 Token period = name != null ? new Token(TokenType.PERIOD, 0) : null; | |
| 385 return new ConstructorName(type, period, name); | |
| 386 } | |
| 387 | |
| 388 static SimpleIdentifier identifierFromString(String name) { | |
| 389 StringToken token = new SyntheticStringToken(TokenType.IDENTIFIER, name, 0); | |
| 390 return new SimpleIdentifier(token); | |
| 391 } | |
| 392 | |
| 393 static PrefixedIdentifier prefixedIdentifier( | |
| 394 SimpleIdentifier pre, SimpleIdentifier id) { | |
| 395 Token period = new Token(TokenType.PERIOD, 0); | |
| 396 return new PrefixedIdentifier(pre, period, id); | |
| 397 } | |
| 398 | |
| 399 static TypeParameter typeParameter(SimpleIdentifier name, | |
| 400 [TypeName bound = null]) { | |
| 401 Token keyword = | |
| 402 (bound == null) ? null : new KeywordToken(Keyword.EXTENDS, 0); | |
| 403 return new TypeParameter(null, null, name, keyword, bound); | |
| 404 } | |
| 405 | |
| 406 static TypeParameterList typeParameterList(List<TypeParameter> params) { | |
| 407 Token lb = new Token(TokenType.LT, 0); | |
| 408 Token rb = new Token(TokenType.GT, 0); | |
| 409 return new TypeParameterList(lb, params, rb); | |
| 410 } | |
| 411 | |
| 412 static TypeArgumentList typeArgumentList(List<TypeName> args) { | |
| 413 Token lb = new Token(TokenType.LT, 0); | |
| 414 Token rb = new Token(TokenType.GT, 0); | |
| 415 return new TypeArgumentList(lb, args, rb); | |
| 416 } | |
| 417 | |
| 418 static ArgumentList argumentList(List<Expression> args) { | |
| 419 Token lp = new BeginToken(TokenType.OPEN_PAREN, 0); | |
| 420 Token rp = new Token(TokenType.CLOSE_PAREN, 0); | |
| 421 return new ArgumentList(lp, args, rp); | |
| 422 } | |
| 423 | |
| 424 static TypeName typeName(Identifier id, TypeArgumentList l) { | |
| 425 return new TypeName(id, l); | |
| 426 } | |
| 427 | |
| 428 static FunctionTypeAlias functionTypeAlias(TypeName ret, | |
| 429 SimpleIdentifier name, TypeParameterList tps, FormalParameterList fps) { | |
| 430 Token semi = new Token(TokenType.SEMICOLON, 0); | |
| 431 Token td = new KeywordToken(Keyword.TYPEDEF, 0); | |
| 432 return new FunctionTypeAlias(null, null, td, ret, name, tps, fps, semi); | |
| 433 } | |
| 434 | |
| 435 static BooleanLiteral booleanLiteral(bool b) { | |
| 436 var k = new KeywordToken(b ? Keyword.TRUE : Keyword.FALSE, 0); | |
| 437 return new BooleanLiteral(k, b); | |
| 438 } | |
| 439 | |
| 440 static NullLiteral nullLiteral() { | |
| 441 var n = new KeywordToken(Keyword.NULL, 0); | |
| 442 return new NullLiteral(n); | |
| 443 } | |
| 444 | |
| 445 static IntegerLiteral integerLiteral(int i) { | |
| 446 StringToken token = new StringToken(TokenType.INT, '$i', 0); | |
| 447 return new IntegerLiteral(token, i); | |
| 448 } | |
| 449 | |
| 450 static SimpleStringLiteral simpleStringLiteral(String s) { | |
| 451 StringToken token = new StringToken(TokenType.STRING, "\"" + s + "\"", 0); | |
| 452 return new SimpleStringLiteral(token, s); | |
| 453 } | |
| 454 | |
| 455 static SimpleStringLiteral tripleQuotedStringLiteral(String s) { | |
| 456 StringToken token = new StringToken(TokenType.STRING, '"""' + s + '"""', 0); | |
| 457 return new SimpleStringLiteral(token, s); | |
| 458 } | |
| 459 | |
| 460 static AsExpression asExpression(Expression exp, TypeName type) { | |
| 461 Token token = new KeywordToken(Keyword.AS, 0); | |
| 462 return new AsExpression(exp, token, type); | |
| 463 } | |
| 464 | |
| 465 static IsExpression isExpression(Expression exp, TypeName type) { | |
| 466 Token token = new KeywordToken(Keyword.IS, 0); | |
| 467 return new IsExpression(exp, token, null, type); | |
| 468 } | |
| 469 | |
| 470 static ParenthesizedExpression parenthesizedExpression(Expression exp) { | |
| 471 Token lp = new BeginToken(TokenType.OPEN_PAREN, exp.offset); | |
| 472 Token rp = new Token(TokenType.CLOSE_PAREN, exp.end); | |
| 473 return new ParenthesizedExpression(lp, exp, rp); | |
| 474 } | |
| 475 | |
| 476 static BinaryExpression binaryExpression( | |
| 477 Expression l, Token op, Expression r) { | |
| 478 return new BinaryExpression(l, op, r); | |
| 479 } | |
| 480 | |
| 481 static ConditionalExpression conditionalExpression( | |
| 482 Expression cond, Expression tExp, Expression fExp) { | |
| 483 var q = new Token(TokenType.QUESTION, 0); | |
| 484 var c = new Token(TokenType.COLON, 0); | |
| 485 return new ConditionalExpression(cond, q, tExp, c, fExp); | |
| 486 } | |
| 487 | |
| 488 static Expression functionExpressionInvocation( | |
| 489 Expression function, ArgumentList es) { | |
| 490 return new FunctionExpressionInvocation(function, null, es); | |
| 491 } | |
| 492 | |
| 493 static FormalParameterList formalParameterList(List<FormalParameter> params) { | |
| 494 Token lp = new BeginToken(TokenType.OPEN_PAREN, 0); | |
| 495 Token rp = new Token(TokenType.CLOSE_PAREN, 0); | |
| 496 bool hasOptional = params.any((p) => p.kind == ParameterKind.POSITIONAL); | |
| 497 bool hasNamed = params.any((p) => p.kind == ParameterKind.NAMED); | |
| 498 assert(!(hasOptional && hasNamed)); | |
| 499 Token ld = null; | |
| 500 Token rd = null; | |
| 501 if (hasOptional) { | |
| 502 ld = new BeginToken(TokenType.OPEN_SQUARE_BRACKET, 0); | |
| 503 rd = new Token(TokenType.CLOSE_SQUARE_BRACKET, 0); | |
| 504 } | |
| 505 if (hasNamed) { | |
| 506 ld = new BeginToken(TokenType.OPEN_CURLY_BRACKET, 0); | |
| 507 rd = new Token(TokenType.CLOSE_CURLY_BRACKET, 0); | |
| 508 } | |
| 509 return new FormalParameterList(lp, params, ld, rd, rp); | |
| 510 } | |
| 511 | |
| 512 static Block block(List<Statement> statements) { | |
| 513 Token ld = new BeginToken(TokenType.OPEN_CURLY_BRACKET, 0); | |
| 514 Token rd = new Token(TokenType.CLOSE_CURLY_BRACKET, 0); | |
| 515 return new Block(ld, statements, rd); | |
| 516 } | |
| 517 | |
| 518 static BlockFunctionBody blockFunctionBody(Block b) { | |
| 519 return new BlockFunctionBody(null, null, b); | |
| 520 } | |
| 521 | |
| 522 static ExpressionFunctionBody expressionFunctionBody(Expression body, | |
| 523 [bool decl = false]) { | |
| 524 Token semi = (decl) ? new Token(TokenType.SEMICOLON, 0) : null; | |
| 525 return new ExpressionFunctionBody(null, null, body, semi); | |
| 526 } | |
| 527 | |
| 528 static ExpressionStatement expressionStatement(Expression expression) { | |
| 529 Token semi = new Token(TokenType.SEMICOLON, 0); | |
| 530 return new ExpressionStatement(expression, semi); | |
| 531 } | |
| 532 | |
| 533 static FunctionDeclaration functionDeclaration( | |
| 534 TypeName rt, SimpleIdentifier f, FunctionExpression fexp) { | |
| 535 return new FunctionDeclaration(null, null, null, rt, null, f, fexp); | |
| 536 } | |
| 537 | |
| 538 static MethodDeclaration methodDeclaration(TypeName rt, SimpleIdentifier m, | |
| 539 FormalParameterList fl, FunctionBody body, | |
| 540 {bool isStatic: false}) { | |
| 541 Token st = isStatic ? new KeywordToken(Keyword.STATIC, 0) : null; | |
| 542 return new MethodDeclaration( | |
| 543 null, null, null, st, rt, null, null, m, null, fl, body); | |
| 544 } | |
| 545 | |
| 546 static FunctionExpression functionExpression( | |
| 547 FormalParameterList fl, FunctionBody body) { | |
| 548 return new FunctionExpression(null, fl, body); | |
| 549 } | |
| 550 | |
| 551 static FunctionDeclarationStatement functionDeclarationStatement( | |
| 552 FunctionDeclaration fd) { | |
| 553 return new FunctionDeclarationStatement(fd); | |
| 554 } | |
| 555 | |
| 556 static Statement returnExpression([Expression e]) { | |
| 557 Token ret = new KeywordToken(Keyword.RETURN, 0); | |
| 558 Token semi = new Token(TokenType.SEMICOLON, 0); | |
| 559 return new ReturnStatement(ret, e, semi); | |
| 560 } | |
| 561 | |
| 562 static SimpleFormalParameter simpleFormalParameter( | |
| 563 SimpleIdentifier v, TypeName t) { | |
| 564 return new SimpleFormalParameter(null, <Annotation>[], null, t, v); | |
| 565 } | |
| 566 | |
| 567 static FunctionTypedFormalParameter functionTypedFormalParameter( | |
| 568 TypeName ret, SimpleIdentifier v, FormalParameterList ps) { | |
| 569 return new FunctionTypedFormalParameter( | |
| 570 null, <Annotation>[], ret, v, null, ps); | |
| 571 } | |
| 572 | |
| 573 static FormalParameter requiredFormalParameter(NormalFormalParameter fp) { | |
| 574 return fp; | |
| 575 } | |
| 576 | |
| 577 static FormalParameter optionalFormalParameter(NormalFormalParameter fp) { | |
| 578 return new DefaultFormalParameter(fp, ParameterKind.POSITIONAL, null, null); | |
| 579 } | |
| 580 | |
| 581 static FormalParameter namedFormalParameter(NormalFormalParameter fp) { | |
| 582 return new DefaultFormalParameter(fp, ParameterKind.NAMED, null, null); | |
| 583 } | |
| 584 | |
| 585 static NamedExpression namedParameter(SimpleIdentifier s, Expression e) { | |
| 586 return namedExpression(s, e); | |
| 587 } | |
| 588 | |
| 589 static NamedExpression namedExpression(SimpleIdentifier s, Expression e) { | |
| 590 Label l = new Label(s, new Token(TokenType.COLON, 0)); | |
| 591 return new NamedExpression(l, e); | |
| 592 } | |
| 593 | |
| 594 static VariableDeclarationStatement variableDeclarationStatement( | |
| 595 VariableDeclarationList varDecl) { | |
| 596 var semi = new Token(TokenType.SEMICOLON, 0); | |
| 597 return new VariableDeclarationStatement(varDecl, semi); | |
| 598 } | |
| 599 } | |
| OLD | NEW |