| 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 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 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 Abstract, | 43 Abstract, |
| 44 Regular, | 44 Regular, |
| 45 RedirectingFactoryBody, | 45 RedirectingFactoryBody, |
| 46 } | 46 } |
| 47 | 47 |
| 48 class OutlineBuilder extends UnhandledListener { | 48 class OutlineBuilder extends UnhandledListener { |
| 49 final SourceLibraryBuilder library; | 49 final SourceLibraryBuilder library; |
| 50 | 50 |
| 51 final bool enableNative; | 51 final bool enableNative; |
| 52 | 52 |
| 53 /// When true, recoverable parser errors are silently ignored. This is |
| 54 /// because they will be reported by the BodyBuilder later. However, typedefs |
| 55 /// are fully compiled by the outline builder, so parser errors are turned on |
| 56 /// when parsing typedefs. |
| 57 bool silenceParserErrors = true; |
| 58 |
| 53 String nativeMethodName; | 59 String nativeMethodName; |
| 54 | 60 |
| 55 OutlineBuilder(SourceLibraryBuilder library) | 61 OutlineBuilder(SourceLibraryBuilder library) |
| 56 : library = library, | 62 : library = library, |
| 57 enableNative = library.loader.target.enableNative(library); | 63 enableNative = library.loader.target.enableNative(library); |
| 58 | 64 |
| 59 @override | 65 @override |
| 60 Uri get uri => library.fileUri; | 66 Uri get uri => library.fileUri; |
| 61 | 67 |
| 62 @override | 68 @override |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 String name = pop(); | 596 String name = pop(); |
| 591 List<MetadataBuilder> metadata = pop(); | 597 List<MetadataBuilder> metadata = pop(); |
| 592 library.addEnum(metadata, name, constantNamesAndOffsets, charOffset, | 598 library.addEnum(metadata, name, constantNamesAndOffsets, charOffset, |
| 593 endBrace.charOffset); | 599 endBrace.charOffset); |
| 594 checkEmpty(enumKeyword.charOffset); | 600 checkEmpty(enumKeyword.charOffset); |
| 595 } | 601 } |
| 596 | 602 |
| 597 @override | 603 @override |
| 598 void beginFunctionTypeAlias(Token token) { | 604 void beginFunctionTypeAlias(Token token) { |
| 599 library.beginNestedDeclaration(null, hasMembers: false); | 605 library.beginNestedDeclaration(null, hasMembers: false); |
| 606 silenceParserErrors = false; |
| 600 } | 607 } |
| 601 | 608 |
| 602 @override | 609 @override |
| 603 void handleFunctionType(Token functionToken, Token endToken) { | 610 void handleFunctionType(Token functionToken, Token endToken) { |
| 604 debugEvent("FunctionType"); | 611 debugEvent("FunctionType"); |
| 605 List<FormalParameterBuilder> formals = pop(); | 612 List<FormalParameterBuilder> formals = pop(); |
| 606 pop(); // formals offset | 613 pop(); // formals offset |
| 607 List<TypeVariableBuilder> typeVariables = pop(); | 614 List<TypeVariableBuilder> typeVariables = pop(); |
| 608 TypeBuilder returnType = pop(); | 615 TypeBuilder returnType = pop(); |
| 609 push(library.addFunctionType( | 616 push(library.addFunctionType( |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 } else { | 649 } else { |
| 643 // TODO(ahe): Improve this error message. | 650 // TODO(ahe): Improve this error message. |
| 644 library.addCompileTimeError( | 651 library.addCompileTimeError( |
| 645 equals.charOffset, "Can't create typedef from non-function type."); | 652 equals.charOffset, "Can't create typedef from non-function type."); |
| 646 } | 653 } |
| 647 } | 654 } |
| 648 List<MetadataBuilder> metadata = pop(); | 655 List<MetadataBuilder> metadata = pop(); |
| 649 library.addFunctionTypeAlias( | 656 library.addFunctionTypeAlias( |
| 650 metadata, returnType, name, typeVariables, formals, charOffset); | 657 metadata, returnType, name, typeVariables, formals, charOffset); |
| 651 checkEmpty(typedefKeyword.charOffset); | 658 checkEmpty(typedefKeyword.charOffset); |
| 659 silenceParserErrors = true; |
| 652 } | 660 } |
| 653 | 661 |
| 654 @override | 662 @override |
| 655 void endTopLevelFields(int count, Token beginToken, Token endToken) { | 663 void endTopLevelFields(int count, Token beginToken, Token endToken) { |
| 656 debugEvent("endTopLevelFields"); | 664 debugEvent("endTopLevelFields"); |
| 657 List fieldsInfo = popList(count * 4); | 665 List fieldsInfo = popList(count * 4); |
| 658 TypeBuilder type = pop(); | 666 TypeBuilder type = pop(); |
| 659 int modifiers = Modifier.validate(pop()); | 667 int modifiers = Modifier.validate(pop()); |
| 660 List<MetadataBuilder> metadata = pop(); | 668 List<MetadataBuilder> metadata = pop(); |
| 661 library.addFields(metadata, modifiers, type, fieldsInfo); | 669 library.addFields(metadata, modifiers, type, fieldsInfo); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 push(new Modifier.fromString(token.stringValue)); | 816 push(new Modifier.fromString(token.stringValue)); |
| 809 } | 817 } |
| 810 | 818 |
| 811 @override | 819 @override |
| 812 void handleModifiers(int count) { | 820 void handleModifiers(int count) { |
| 813 debugEvent("Modifiers"); | 821 debugEvent("Modifiers"); |
| 814 push(popList(count) ?? NullValue.Modifiers); | 822 push(popList(count) ?? NullValue.Modifiers); |
| 815 } | 823 } |
| 816 | 824 |
| 817 @override | 825 @override |
| 826 void handleRecoverableError(Token token, FastaMessage message) { |
| 827 if (silenceParserErrors) { |
| 828 debugEvent("RecoverableError"); |
| 829 } else { |
| 830 super.handleRecoverableError(token, message); |
| 831 } |
| 832 } |
| 833 |
| 834 @override |
| 818 Token handleUnrecoverableError(Token token, FastaMessage message) { | 835 Token handleUnrecoverableError(Token token, FastaMessage message) { |
| 819 if (enableNative && message.code == codeExpectedBlockToSkip) { | 836 if (enableNative && message.code == codeExpectedBlockToSkip) { |
| 820 var target = library.loader.target; | 837 var target = library.loader.target; |
| 821 Token recover = target.skipNativeClause(token); | 838 Token recover = target.skipNativeClause(token); |
| 822 if (recover != null) { | 839 if (recover != null) { |
| 823 nativeMethodName = target.extractNativeMethodName(token); | 840 nativeMethodName = target.extractNativeMethodName(token); |
| 824 return recover; | 841 return recover; |
| 825 } | 842 } |
| 826 } | 843 } |
| 827 return super.handleUnrecoverableError(token, message); | 844 return super.handleUnrecoverableError(token, message); |
| 828 } | 845 } |
| 829 | 846 |
| 830 @override | 847 @override |
| 831 void addCompileTimeErrorFromMessage(FastaMessage message) { | 848 void addCompileTimeErrorFromMessage(FastaMessage message) { |
| 832 library.addCompileTimeError(message.charOffset, message.message, | 849 library.addCompileTimeError(message.charOffset, message.message, |
| 833 fileUri: message.uri); | 850 fileUri: message.uri); |
| 834 } | 851 } |
| 835 | 852 |
| 836 @override | 853 @override |
| 837 Link<Token> handleMemberName(Link<Token> identifiers) { | 854 Link<Token> handleMemberName(Link<Token> identifiers) { |
| 838 if (!enableNative || identifiers.isEmpty) return identifiers; | 855 if (!enableNative || identifiers.isEmpty) return identifiers; |
| 839 return removeNativeClause(identifiers); | 856 return removeNativeClause(identifiers); |
| 840 } | 857 } |
| 841 | 858 |
| 842 @override | 859 @override |
| 843 void debugEvent(String name) { | 860 void debugEvent(String name) { |
| 844 // printEvent(name); | 861 // printEvent(name); |
| 845 } | 862 } |
| 846 } | 863 } |
| OLD | NEW |