Chromium Code Reviews| 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 ProcedureKind; |
| 8 | 8 |
| 9 import '../fasta_codes.dart' show FastaMessage, codeExpectedBlockToSkip; | 9 import '../fasta_codes.dart' show FastaMessage, codeExpectedBlockToSkip; |
| 10 | 10 |
| 11 import '../parser/parser.dart' show FormalParameterType, optional; | 11 import '../parser/parser.dart' show FormalParameterType, optional; |
| 12 | 12 |
| 13 import '../parser/identifier_context.dart' show IdentifierContext; | 13 import '../parser/identifier_context.dart' show IdentifierContext; |
| 14 | 14 |
| 15 import '../../scanner/token.dart' show Token; | 15 import '../../scanner/token.dart' show Token; |
| 16 | 16 |
| 17 import '../util/link.dart' show Link; | 17 import '../util/link.dart' show Link; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 38 operatorRequiredArgumentCount; | 38 operatorRequiredArgumentCount; |
| 39 | 39 |
| 40 import '../quote.dart' show unescapeString; | 40 import '../quote.dart' show unescapeString; |
| 41 | 41 |
| 42 enum MethodBody { | 42 enum MethodBody { |
| 43 Abstract, | 43 Abstract, |
| 44 Regular, | 44 Regular, |
| 45 RedirectingFactoryBody, | 45 RedirectingFactoryBody, |
| 46 } | 46 } |
| 47 | 47 |
| 48 AsyncMarker asyncMarkerFromTokens(Token asyncToken, Token starToken) { | |
|
Siggi Cherem (dart-lang)
2017/05/18 19:44:03
this now only used by body_builder, so I moved it
| |
| 49 if (asyncToken == null || identical(asyncToken.stringValue, "sync")) { | |
| 50 if (starToken == null) { | |
| 51 return AsyncMarker.Sync; | |
| 52 } else { | |
| 53 assert(identical(starToken.stringValue, "*")); | |
| 54 return AsyncMarker.SyncStar; | |
| 55 } | |
| 56 } else if (identical(asyncToken.stringValue, "async")) { | |
| 57 if (starToken == null) { | |
| 58 return AsyncMarker.Async; | |
| 59 } else { | |
| 60 assert(identical(starToken.stringValue, "*")); | |
| 61 return AsyncMarker.AsyncStar; | |
| 62 } | |
| 63 } else { | |
| 64 return internalError("Unknown async modifier: $asyncToken"); | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 class OutlineBuilder extends UnhandledListener { | 48 class OutlineBuilder extends UnhandledListener { |
| 69 final SourceLibraryBuilder library; | 49 final SourceLibraryBuilder library; |
| 70 | 50 |
| 71 final bool isDartLibrary; | 51 final bool isDartLibrary; |
| 72 | 52 |
| 73 String nativeMethodName; | 53 String nativeMethodName; |
| 74 | 54 |
| 75 OutlineBuilder(SourceLibraryBuilder library) | 55 OutlineBuilder(SourceLibraryBuilder library) |
| 76 : library = library, | 56 : library = library, |
| 77 isDartLibrary = library.uri.scheme == "dart"; | 57 isDartLibrary = library.uri.scheme == "dart"; |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 | 279 |
| 300 @override | 280 @override |
| 301 void beginTopLevelMethod(Token token, Token name) { | 281 void beginTopLevelMethod(Token token, Token name) { |
| 302 library.beginNestedDeclaration(name.lexeme, hasMembers: false); | 282 library.beginNestedDeclaration(name.lexeme, hasMembers: false); |
| 303 } | 283 } |
| 304 | 284 |
| 305 @override | 285 @override |
| 306 void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) { | 286 void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) { |
| 307 debugEvent("endTopLevelMethod"); | 287 debugEvent("endTopLevelMethod"); |
| 308 MethodBody kind = pop(); | 288 MethodBody kind = pop(); |
| 309 AsyncMarker asyncModifier = pop(); | |
| 310 List<FormalParameterBuilder> formals = pop(); | 289 List<FormalParameterBuilder> formals = pop(); |
| 311 int formalsOffset = pop(); | 290 int formalsOffset = pop(); |
| 312 List<TypeVariableBuilder> typeVariables = pop(); | 291 List<TypeVariableBuilder> typeVariables = pop(); |
| 313 int charOffset = pop(); | 292 int charOffset = pop(); |
| 314 String name = pop(); | 293 String name = pop(); |
| 315 TypeBuilder returnType = pop(); | 294 TypeBuilder returnType = pop(); |
| 316 int modifiers = | 295 int modifiers = |
| 317 Modifier.validate(pop(), isAbstract: kind == MethodBody.Abstract); | 296 Modifier.validate(pop(), isAbstract: kind == MethodBody.Abstract); |
| 318 List<MetadataBuilder> metadata = pop(); | 297 List<MetadataBuilder> metadata = pop(); |
| 319 checkEmpty(beginToken.charOffset); | 298 checkEmpty(beginToken.charOffset); |
| 320 library.addProcedure( | 299 library.addProcedure( |
| 321 metadata, | 300 metadata, |
| 322 modifiers, | 301 modifiers, |
| 323 returnType, | 302 returnType, |
| 324 name, | 303 name, |
| 325 typeVariables, | 304 typeVariables, |
| 326 formals, | 305 formals, |
| 327 asyncModifier, | |
| 328 computeProcedureKind(getOrSet), | 306 computeProcedureKind(getOrSet), |
| 329 charOffset, | 307 charOffset, |
| 330 formalsOffset, | 308 formalsOffset, |
| 331 endToken.charOffset, | 309 endToken.charOffset, |
| 332 nativeMethodName, | 310 nativeMethodName, |
| 333 isTopLevel: true); | 311 isTopLevel: true); |
| 334 nativeMethodName = null; | 312 nativeMethodName = null; |
| 335 } | 313 } |
| 336 | 314 |
| 337 @override | 315 @override |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 352 } | 330 } |
| 353 | 331 |
| 354 @override | 332 @override |
| 355 void endMethod(Token getOrSet, Token beginToken, Token endToken) { | 333 void endMethod(Token getOrSet, Token beginToken, Token endToken) { |
| 356 debugEvent("Method"); | 334 debugEvent("Method"); |
| 357 MethodBody bodyKind = pop(); | 335 MethodBody bodyKind = pop(); |
| 358 if (bodyKind == MethodBody.RedirectingFactoryBody) { | 336 if (bodyKind == MethodBody.RedirectingFactoryBody) { |
| 359 // This will cause an error later. | 337 // This will cause an error later. |
| 360 pop(); | 338 pop(); |
| 361 } | 339 } |
| 362 AsyncMarker asyncModifier = pop(); | |
| 363 List<FormalParameterBuilder> formals = pop(); | 340 List<FormalParameterBuilder> formals = pop(); |
| 364 int formalsOffset = pop(); | 341 int formalsOffset = pop(); |
| 365 List<TypeVariableBuilder> typeVariables = pop(); | 342 List<TypeVariableBuilder> typeVariables = pop(); |
| 366 int charOffset = pop(); | 343 int charOffset = pop(); |
| 367 dynamic nameOrOperator = pop(); | 344 dynamic nameOrOperator = pop(); |
| 368 if (Operator.subtract == nameOrOperator && formals == null) { | 345 if (Operator.subtract == nameOrOperator && formals == null) { |
| 369 nameOrOperator = Operator.unaryMinus; | 346 nameOrOperator = Operator.unaryMinus; |
| 370 } | 347 } |
| 371 String name; | 348 String name; |
| 372 ProcedureKind kind; | 349 ProcedureKind kind; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 397 int modifiers = | 374 int modifiers = |
| 398 Modifier.validate(pop(), isAbstract: bodyKind == MethodBody.Abstract); | 375 Modifier.validate(pop(), isAbstract: bodyKind == MethodBody.Abstract); |
| 399 List<MetadataBuilder> metadata = pop(); | 376 List<MetadataBuilder> metadata = pop(); |
| 400 library.addProcedure( | 377 library.addProcedure( |
| 401 metadata, | 378 metadata, |
| 402 modifiers, | 379 modifiers, |
| 403 returnType, | 380 returnType, |
| 404 name, | 381 name, |
| 405 typeVariables, | 382 typeVariables, |
| 406 formals, | 383 formals, |
| 407 asyncModifier, | |
| 408 kind, | 384 kind, |
| 409 charOffset, | 385 charOffset, |
| 410 formalsOffset, | 386 formalsOffset, |
| 411 endToken.charOffset, | 387 endToken.charOffset, |
| 412 nativeMethodName, | 388 nativeMethodName, |
| 413 isTopLevel: false); | 389 isTopLevel: false); |
| 414 nativeMethodName = null; | 390 nativeMethodName = null; |
| 415 } | 391 } |
| 416 | 392 |
| 417 @override | 393 @override |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 713 | 689 |
| 714 @override | 690 @override |
| 715 void endFactoryMethod( | 691 void endFactoryMethod( |
| 716 Token beginToken, Token factoryKeyword, Token endToken) { | 692 Token beginToken, Token factoryKeyword, Token endToken) { |
| 717 debugEvent("FactoryMethod"); | 693 debugEvent("FactoryMethod"); |
| 718 MethodBody kind = pop(); | 694 MethodBody kind = pop(); |
| 719 ConstructorReferenceBuilder redirectionTarget; | 695 ConstructorReferenceBuilder redirectionTarget; |
| 720 if (kind == MethodBody.RedirectingFactoryBody) { | 696 if (kind == MethodBody.RedirectingFactoryBody) { |
| 721 redirectionTarget = pop(); | 697 redirectionTarget = pop(); |
| 722 } | 698 } |
| 723 AsyncMarker asyncModifier = pop(); | |
| 724 List<FormalParameterBuilder> formals = pop(); | 699 List<FormalParameterBuilder> formals = pop(); |
| 725 int formalsOffset = pop(); | 700 int formalsOffset = pop(); |
| 726 var name = pop(); | 701 var name = pop(); |
| 727 int modifiers = Modifier.validate(pop()); | 702 int modifiers = Modifier.validate(pop()); |
| 728 List<MetadataBuilder> metadata = pop(); | 703 List<MetadataBuilder> metadata = pop(); |
| 729 library.addFactoryMethod( | 704 library.addFactoryMethod( |
| 730 metadata, | 705 metadata, |
| 731 modifiers, | 706 modifiers, |
| 732 name, | 707 name, |
| 733 formals, | 708 formals, |
| 734 asyncModifier, | |
| 735 redirectionTarget, | 709 redirectionTarget, |
| 736 factoryKeyword.next.charOffset, | 710 factoryKeyword.next.charOffset, |
| 737 formalsOffset, | 711 formalsOffset, |
| 738 endToken.charOffset, | 712 endToken.charOffset, |
| 739 nativeMethodName); | 713 nativeMethodName); |
| 740 nativeMethodName = null; | 714 nativeMethodName = null; |
| 741 } | 715 } |
| 742 | 716 |
| 743 @override | 717 @override |
| 744 void endRedirectingFactoryBody(Token beginToken, Token endToken) { | 718 void endRedirectingFactoryBody(Token beginToken, Token endToken) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 779 } | 753 } |
| 780 | 754 |
| 781 @override | 755 @override |
| 782 void endClassBody(int memberCount, Token beginToken, Token endToken) { | 756 void endClassBody(int memberCount, Token beginToken, Token endToken) { |
| 783 debugEvent("ClassBody"); | 757 debugEvent("ClassBody"); |
| 784 } | 758 } |
| 785 | 759 |
| 786 @override | 760 @override |
| 787 void handleAsyncModifier(Token asyncToken, Token starToken) { | 761 void handleAsyncModifier(Token asyncToken, Token starToken) { |
| 788 debugEvent("AsyncModifier"); | 762 debugEvent("AsyncModifier"); |
| 789 push(asyncMarkerFromTokens(asyncToken, starToken)); | |
| 790 } | 763 } |
| 791 | 764 |
| 792 @override | 765 @override |
| 793 void handleModifier(Token token) { | 766 void handleModifier(Token token) { |
| 794 debugEvent("Modifier"); | 767 debugEvent("Modifier"); |
| 795 push(new Modifier.fromString(token.stringValue)); | 768 push(new Modifier.fromString(token.stringValue)); |
| 796 } | 769 } |
| 797 | 770 |
| 798 @override | 771 @override |
| 799 void handleModifiers(int count) { | 772 void handleModifiers(int count) { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 818 Link<Token> handleMemberName(Link<Token> identifiers) { | 791 Link<Token> handleMemberName(Link<Token> identifiers) { |
| 819 if (!isDartLibrary || identifiers.isEmpty) return identifiers; | 792 if (!isDartLibrary || identifiers.isEmpty) return identifiers; |
| 820 return removeNativeClause(identifiers); | 793 return removeNativeClause(identifiers); |
| 821 } | 794 } |
| 822 | 795 |
| 823 @override | 796 @override |
| 824 void debugEvent(String name) { | 797 void debugEvent(String name) { |
| 825 // printEvent(name); | 798 // printEvent(name); |
| 826 } | 799 } |
| 827 } | 800 } |
| OLD | NEW |