| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library fasta.outline_builder; | 5 library fasta.outline_builder; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' show AsyncMarker, ProcedureKind; | 7 import 'package:kernel/ast.dart' show AsyncMarker, ProcedureKind; |
| 8 | 8 |
| 9 import '../parser/parser.dart' show FormalParameterType, optional; | 9 import '../parser/parser.dart' show FormalParameterType, optional; |
| 10 | 10 |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 TypeBuilder supertype = pop(); | 215 TypeBuilder supertype = pop(); |
| 216 List<TypeVariableBuilder> typeVariables = pop(); | 216 List<TypeVariableBuilder> typeVariables = pop(); |
| 217 String name = pop(); | 217 String name = pop(); |
| 218 if (typeVariables != null && supertype is MixinApplicationBuilder) { | 218 if (typeVariables != null && supertype is MixinApplicationBuilder) { |
| 219 supertype.typeVariables = typeVariables; | 219 supertype.typeVariables = typeVariables; |
| 220 supertype.subclassName = name; | 220 supertype.subclassName = name; |
| 221 } | 221 } |
| 222 int modifiers = Modifier.validate(pop()); | 222 int modifiers = Modifier.validate(pop()); |
| 223 List<MetadataBuilder> metadata = pop(); | 223 List<MetadataBuilder> metadata = pop(); |
| 224 library.addClass(metadata, modifiers, name, typeVariables, supertype, | 224 library.addClass(metadata, modifiers, name, typeVariables, supertype, |
| 225 interfaces, beginToken.charOffset); | 225 interfaces, classKeyword.next?.charOffset ?? beginToken.charOffset); |
| 226 checkEmpty(beginToken.charOffset); | 226 checkEmpty(beginToken.charOffset); |
| 227 } | 227 } |
| 228 | 228 |
| 229 ProcedureKind computeProcedureKind(Token token) { | 229 ProcedureKind computeProcedureKind(Token token) { |
| 230 if (token == null) return ProcedureKind.Method; | 230 if (token == null) return ProcedureKind.Method; |
| 231 if (optional("get", token)) return ProcedureKind.Getter; | 231 if (optional("get", token)) return ProcedureKind.Getter; |
| 232 if (optional("set", token)) return ProcedureKind.Setter; | 232 if (optional("set", token)) return ProcedureKind.Setter; |
| 233 return internalError("Unhandled: ${token.lexeme}"); | 233 return internalError("Unhandled: ${token.lexeme}"); |
| 234 } | 234 } |
| 235 | 235 |
| 236 @override | 236 @override |
| 237 void beginTopLevelMethod(Token token, Token name) { | 237 void beginTopLevelMethod(Token token, Token name) { |
| 238 library.beginNestedDeclaration(name.lexeme, hasMembers: false); | 238 library.beginNestedDeclaration(name.lexeme, hasMembers: false); |
| 239 } | 239 } |
| 240 | 240 |
| 241 @override | 241 @override |
| 242 void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) { | 242 void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) { |
| 243 debugEvent("endTopLevelMethod"); | 243 debugEvent("endTopLevelMethod"); |
| 244 MethodBody kind = pop(); | 244 MethodBody kind = pop(); |
| 245 AsyncMarker asyncModifier = pop(); | 245 AsyncMarker asyncModifier = pop(); |
| 246 List<FormalParameterBuilder> formals = pop(); | 246 List<FormalParameterBuilder> formals = pop(); |
| 247 int formalsOffset = pop(); |
| 247 List<TypeVariableBuilder> typeVariables = pop(); | 248 List<TypeVariableBuilder> typeVariables = pop(); |
| 248 String name = pop(); | 249 String name = pop(); |
| 249 TypeBuilder returnType = pop(); | 250 TypeBuilder returnType = pop(); |
| 250 int modifiers = | 251 int modifiers = |
| 251 Modifier.validate(pop(), isAbstract: kind == MethodBody.Abstract); | 252 Modifier.validate(pop(), isAbstract: kind == MethodBody.Abstract); |
| 252 List<MetadataBuilder> metadata = pop(); | 253 List<MetadataBuilder> metadata = pop(); |
| 253 checkEmpty(beginToken.charOffset); | 254 checkEmpty(beginToken.charOffset); |
| 254 library.addProcedure( | 255 library.addProcedure( |
| 255 metadata, | 256 metadata, |
| 256 modifiers, | 257 modifiers, |
| 257 returnType, | 258 returnType, |
| 258 name, | 259 name, |
| 259 typeVariables, | 260 typeVariables, |
| 260 formals, | 261 formals, |
| 261 asyncModifier, | 262 asyncModifier, |
| 262 computeProcedureKind(getOrSet), | 263 computeProcedureKind(getOrSet), |
| 263 beginToken.charOffset, | 264 beginToken.charOffset, |
| 265 formalsOffset, |
| 264 endToken.charOffset, | 266 endToken.charOffset, |
| 265 nativeMethodName, | 267 nativeMethodName, |
| 266 isTopLevel: true); | 268 isTopLevel: true); |
| 267 nativeMethodName = null; | 269 nativeMethodName = null; |
| 268 } | 270 } |
| 269 | 271 |
| 270 @override | 272 @override |
| 271 void handleNoFunctionBody(Token token) { | 273 void handleNoFunctionBody(Token token) { |
| 272 debugEvent("NoFunctionBody"); | 274 debugEvent("NoFunctionBody"); |
| 273 push(MethodBody.Abstract); | 275 push(MethodBody.Abstract); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 287 @override | 289 @override |
| 288 void endMethod(Token getOrSet, Token beginToken, Token endToken) { | 290 void endMethod(Token getOrSet, Token beginToken, Token endToken) { |
| 289 debugEvent("Method"); | 291 debugEvent("Method"); |
| 290 MethodBody bodyKind = pop(); | 292 MethodBody bodyKind = pop(); |
| 291 if (bodyKind == MethodBody.RedirectingFactoryBody) { | 293 if (bodyKind == MethodBody.RedirectingFactoryBody) { |
| 292 // This will cause an error later. | 294 // This will cause an error later. |
| 293 pop(); | 295 pop(); |
| 294 } | 296 } |
| 295 AsyncMarker asyncModifier = pop(); | 297 AsyncMarker asyncModifier = pop(); |
| 296 List<FormalParameterBuilder> formals = pop(); | 298 List<FormalParameterBuilder> formals = pop(); |
| 299 int formalsOffset = pop(); |
| 297 List<TypeVariableBuilder> typeVariables = pop(); | 300 List<TypeVariableBuilder> typeVariables = pop(); |
| 298 dynamic nameOrOperator = pop(); | 301 dynamic nameOrOperator = pop(); |
| 299 if (Operator.subtract == nameOrOperator && formals == null) { | 302 if (Operator.subtract == nameOrOperator && formals == null) { |
| 300 nameOrOperator = Operator.unaryMinus; | 303 nameOrOperator = Operator.unaryMinus; |
| 301 } | 304 } |
| 302 String name; | 305 String name; |
| 303 ProcedureKind kind; | 306 ProcedureKind kind; |
| 304 if (nameOrOperator is Operator) { | 307 if (nameOrOperator is Operator) { |
| 305 name = operatorToString(nameOrOperator); | 308 name = operatorToString(nameOrOperator); |
| 306 kind = ProcedureKind.Operator; | 309 kind = ProcedureKind.Operator; |
| 307 } else { | 310 } else { |
| 308 name = nameOrOperator; | 311 name = nameOrOperator; |
| 309 kind = computeProcedureKind(getOrSet); | 312 kind = computeProcedureKind(getOrSet); |
| 310 } | 313 } |
| 311 TypeBuilder returnType = pop(); | 314 TypeBuilder returnType = pop(); |
| 312 int modifiers = | 315 int modifiers = |
| 313 Modifier.validate(pop(), isAbstract: bodyKind == MethodBody.Abstract); | 316 Modifier.validate(pop(), isAbstract: bodyKind == MethodBody.Abstract); |
| 314 List<MetadataBuilder> metadata = pop(); | 317 List<MetadataBuilder> metadata = pop(); |
| 315 library.addProcedure( | 318 library.addProcedure( |
| 316 metadata, | 319 metadata, |
| 317 modifiers, | 320 modifiers, |
| 318 returnType, | 321 returnType, |
| 319 name, | 322 name, |
| 320 typeVariables, | 323 typeVariables, |
| 321 formals, | 324 formals, |
| 322 asyncModifier, | 325 asyncModifier, |
| 323 kind, | 326 kind, |
| 324 beginToken.charOffset, | 327 beginToken.charOffset, |
| 328 formalsOffset, |
| 325 endToken.charOffset, | 329 endToken.charOffset, |
| 326 nativeMethodName, | 330 nativeMethodName, |
| 327 isTopLevel: false); | 331 isTopLevel: false); |
| 328 nativeMethodName = null; | 332 nativeMethodName = null; |
| 329 } | 333 } |
| 330 | 334 |
| 331 @override | 335 @override |
| 332 void endMixinApplication(Token withKeyword) { | 336 void endMixinApplication(Token withKeyword) { |
| 333 debugEvent("MixinApplication"); | 337 debugEvent("MixinApplication"); |
| 334 List<TypeBuilder> mixins = pop(); | 338 List<TypeBuilder> mixins = pop(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 push(popList(count) ?? NullValue.TypeVariables); | 395 push(popList(count) ?? NullValue.TypeVariables); |
| 392 } | 396 } |
| 393 | 397 |
| 394 @override | 398 @override |
| 395 void handleVoidKeyword(Token token) { | 399 void handleVoidKeyword(Token token) { |
| 396 debugEvent("VoidKeyword"); | 400 debugEvent("VoidKeyword"); |
| 397 push(library.addVoidType(token.charOffset)); | 401 push(library.addVoidType(token.charOffset)); |
| 398 } | 402 } |
| 399 | 403 |
| 400 @override | 404 @override |
| 401 void endFormalParameter( | 405 void endFormalParameter(Token covariantKeyword, Token thisKeyword, |
| 402 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) { | 406 Token nameToken, FormalParameterType kind) { |
| 403 debugEvent("FormalParameter"); | 407 debugEvent("FormalParameter"); |
| 404 String name = pop(); | 408 String name = pop(); |
| 405 TypeBuilder type = pop(); | 409 TypeBuilder type = pop(); |
| 406 int modifiers = Modifier.validate(pop()); | 410 int modifiers = Modifier.validate(pop()); |
| 407 List<MetadataBuilder> metadata = pop(); | 411 List<MetadataBuilder> metadata = pop(); |
| 408 // TODO(ahe): Needs begin token. | 412 // TODO(ahe): Needs begin token. |
| 409 push(library.addFormalParameter(metadata, modifiers, type, name, | 413 push(library.addFormalParameter( |
| 410 thisKeyword != null, thisKeyword?.charOffset ?? -1)); | 414 metadata, |
| 415 modifiers, |
| 416 type, |
| 417 name, |
| 418 thisKeyword != null, |
| 419 thisKeyword?.charOffset ?? nameToken?.charOffset ?? -1)); |
| 411 } | 420 } |
| 412 | 421 |
| 413 @override | 422 @override |
| 414 void handleValuedFormalParameter(Token equals, Token token) { | 423 void handleValuedFormalParameter(Token equals, Token token) { |
| 415 debugEvent("ValuedFormalParameter"); | 424 debugEvent("ValuedFormalParameter"); |
| 416 // Ignored for now. | 425 // Ignored for now. |
| 417 } | 426 } |
| 418 | 427 |
| 419 @override | 428 @override |
| 420 void handleFormalParameterWithoutValue(Token token) { | 429 void handleFormalParameterWithoutValue(Token token) { |
| 421 debugEvent("FormalParameterWithoutValue"); | 430 debugEvent("FormalParameterWithoutValue"); |
| 422 // Ignored for now. | 431 // Ignored for now. |
| 423 } | 432 } |
| 424 | 433 |
| 425 @override | 434 @override |
| 426 void endFunctionTypedFormalParameter( | 435 void endFunctionTypedFormalParameter( |
| 427 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) { | 436 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) { |
| 428 debugEvent("FunctionTypedFormalParameter"); | 437 debugEvent("FunctionTypedFormalParameter"); |
| 429 pop(); // Function type parameters. | 438 pop(); // Function type parameters. |
| 439 pop(); // Formals offset |
| 430 pop(); // Type variables. | 440 pop(); // Type variables. |
| 431 String name = pop(); | 441 String name = pop(); |
| 432 pop(); // Return type. | 442 pop(); // Return type. |
| 433 push(NullValue.Type); | 443 push(NullValue.Type); |
| 434 push(name); | 444 push(name); |
| 435 } | 445 } |
| 436 | 446 |
| 437 @override | 447 @override |
| 438 void endOptionalFormalParameters( | 448 void endOptionalFormalParameters( |
| 439 int count, Token beginToken, Token endToken) { | 449 int count, Token beginToken, Token endToken) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 } | 483 } |
| 474 } | 484 } |
| 475 if (formals != null) { | 485 if (formals != null) { |
| 476 for (var formal in formals) { | 486 for (var formal in formals) { |
| 477 if (formal is! FormalParameterBuilder) { | 487 if (formal is! FormalParameterBuilder) { |
| 478 internalError(formals); | 488 internalError(formals); |
| 479 } | 489 } |
| 480 } | 490 } |
| 481 formals = new List<FormalParameterBuilder>.from(formals); | 491 formals = new List<FormalParameterBuilder>.from(formals); |
| 482 } | 492 } |
| 493 push(beginToken.charOffset); |
| 483 push(formals ?? NullValue.FormalParameters); | 494 push(formals ?? NullValue.FormalParameters); |
| 484 } | 495 } |
| 485 | 496 |
| 486 @override | 497 @override |
| 498 void handleNoFormalParameters(Token token) { |
| 499 push(token.charOffset); |
| 500 super.handleNoFormalParameters(token); |
| 501 } |
| 502 |
| 503 @override |
| 487 void endEnum(Token enumKeyword, Token endBrace, int count) { | 504 void endEnum(Token enumKeyword, Token endBrace, int count) { |
| 488 List<String> constants = popList(count); | 505 List<String> constants = popList(count); |
| 489 String name = pop(); | 506 String name = pop(); |
| 490 List<MetadataBuilder> metadata = pop(); | 507 List<MetadataBuilder> metadata = pop(); |
| 491 library.addEnum( | 508 library.addEnum( |
| 492 metadata, name, constants, enumKeyword.charOffset, endBrace.charOffset); | 509 metadata, name, constants, enumKeyword.charOffset, endBrace.charOffset); |
| 493 checkEmpty(enumKeyword.charOffset); | 510 checkEmpty(enumKeyword.charOffset); |
| 494 } | 511 } |
| 495 | 512 |
| 496 @override | 513 @override |
| 497 void beginFunctionTypeAlias(Token token) { | 514 void beginFunctionTypeAlias(Token token) { |
| 498 library.beginNestedDeclaration(null, hasMembers: false); | 515 library.beginNestedDeclaration(null, hasMembers: false); |
| 499 } | 516 } |
| 500 | 517 |
| 501 @override | 518 @override |
| 502 void handleFunctionType(Token functionToken, Token endToken) { | 519 void handleFunctionType(Token functionToken, Token endToken) { |
| 503 debugEvent("FunctionType"); | 520 debugEvent("FunctionType"); |
| 504 List<FormalParameterBuilder> formals = pop(); | 521 List<FormalParameterBuilder> formals = pop(); |
| 522 pop(); // formals offset |
| 505 List<TypeVariableBuilder> typeVariables = pop(); | 523 List<TypeVariableBuilder> typeVariables = pop(); |
| 506 TypeBuilder returnType = pop(); | 524 TypeBuilder returnType = pop(); |
| 507 push(library.addFunctionType( | 525 push(library.addFunctionType( |
| 508 returnType, typeVariables, formals, functionToken.charOffset)); | 526 returnType, typeVariables, formals, functionToken.charOffset)); |
| 509 } | 527 } |
| 510 | 528 |
| 511 @override | 529 @override |
| 512 void endFunctionTypeAlias( | 530 void endFunctionTypeAlias( |
| 513 Token typedefKeyword, Token equals, Token endToken) { | 531 Token typedefKeyword, Token equals, Token endToken) { |
| 514 debugEvent("endFunctionTypeAlias"); | 532 debugEvent("endFunctionTypeAlias"); |
| 515 List<FormalParameterBuilder> formals; | 533 List<FormalParameterBuilder> formals; |
| 516 List<TypeVariableBuilder> typeVariables; | 534 List<TypeVariableBuilder> typeVariables; |
| 517 String name; | 535 String name; |
| 518 TypeBuilder returnType; | 536 TypeBuilder returnType; |
| 519 if (equals == null) { | 537 if (equals == null) { |
| 520 formals = pop(); | 538 formals = pop(); |
| 539 pop(); // formals offset |
| 521 typeVariables = pop(); | 540 typeVariables = pop(); |
| 522 name = pop(); | 541 name = pop(); |
| 523 returnType = pop(); | 542 returnType = pop(); |
| 524 } else { | 543 } else { |
| 525 var type = pop(); | 544 var type = pop(); |
| 526 typeVariables = pop(); | 545 typeVariables = pop(); |
| 527 name = pop(); | 546 name = pop(); |
| 528 if (type is FunctionTypeBuilder) { | 547 if (type is FunctionTypeBuilder) { |
| 529 // TODO(ahe): We need to start a nested declaration when parsing the | 548 // TODO(ahe): We need to start a nested declaration when parsing the |
| 530 // formals and return type so we can correctly bind | 549 // formals and return type so we can correctly bind |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 void endFactoryMethod( | 629 void endFactoryMethod( |
| 611 Token beginToken, Token factoryKeyword, Token endToken) { | 630 Token beginToken, Token factoryKeyword, Token endToken) { |
| 612 debugEvent("FactoryMethod"); | 631 debugEvent("FactoryMethod"); |
| 613 MethodBody kind = pop(); | 632 MethodBody kind = pop(); |
| 614 ConstructorReferenceBuilder redirectionTarget; | 633 ConstructorReferenceBuilder redirectionTarget; |
| 615 if (kind == MethodBody.RedirectingFactoryBody) { | 634 if (kind == MethodBody.RedirectingFactoryBody) { |
| 616 redirectionTarget = pop(); | 635 redirectionTarget = pop(); |
| 617 } | 636 } |
| 618 AsyncMarker asyncModifier = pop(); | 637 AsyncMarker asyncModifier = pop(); |
| 619 List<FormalParameterBuilder> formals = pop(); | 638 List<FormalParameterBuilder> formals = pop(); |
| 639 int formalsOffset = pop(); |
| 620 var name = pop(); | 640 var name = pop(); |
| 621 int modifiers = Modifier.validate(pop()); | 641 int modifiers = Modifier.validate(pop()); |
| 622 List<MetadataBuilder> metadata = pop(); | 642 List<MetadataBuilder> metadata = pop(); |
| 623 library.addFactoryMethod( | 643 library.addFactoryMethod( |
| 624 metadata, | 644 metadata, |
| 625 modifiers, | 645 modifiers, |
| 626 name, | 646 name, |
| 627 formals, | 647 formals, |
| 628 asyncModifier, | 648 asyncModifier, |
| 629 redirectionTarget, | 649 redirectionTarget, |
| 630 beginToken.charOffset, | 650 beginToken.charOffset, |
| 651 formalsOffset, |
| 631 endToken.charOffset, | 652 endToken.charOffset, |
| 632 nativeMethodName); | 653 nativeMethodName); |
| 633 nativeMethodName = null; | 654 nativeMethodName = null; |
| 634 } | 655 } |
| 635 | 656 |
| 636 @override | 657 @override |
| 637 void endRedirectingFactoryBody(Token beginToken, Token endToken) { | 658 void endRedirectingFactoryBody(Token beginToken, Token endToken) { |
| 638 debugEvent("RedirectingFactoryBody"); | 659 debugEvent("RedirectingFactoryBody"); |
| 639 push(MethodBody.RedirectingFactoryBody); | 660 push(MethodBody.RedirectingFactoryBody); |
| 640 } | 661 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 Link<Token> handleMemberName(Link<Token> identifiers) { | 728 Link<Token> handleMemberName(Link<Token> identifiers) { |
| 708 if (!isDartLibrary || identifiers.isEmpty) return identifiers; | 729 if (!isDartLibrary || identifiers.isEmpty) return identifiers; |
| 709 return removeNativeClause(identifiers); | 730 return removeNativeClause(identifiers); |
| 710 } | 731 } |
| 711 | 732 |
| 712 @override | 733 @override |
| 713 void debugEvent(String name) { | 734 void debugEvent(String name) { |
| 714 // printEvent(name); | 735 // printEvent(name); |
| 715 } | 736 } |
| 716 } | 737 } |
| OLD | NEW |