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.analyzer.ast_builder; | 5 library fasta.analyzer.ast_builder; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; | 8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; |
9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; | 9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; |
10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; | 10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; |
11 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; | 11 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; |
12 import 'package:analyzer/dart/element/element.dart' show Element; | 12 import 'package:analyzer/dart/element/element.dart' show Element; |
13 import 'package:front_end/src/fasta/parser/parser.dart' | 13 import 'package:front_end/src/fasta/parser/parser.dart' |
14 show FormalParameterType, Parser; | 14 show FormalParameterType, MemberKind, Parser; |
15 import 'package:front_end/src/fasta/scanner/string_scanner.dart'; | 15 import 'package:front_end/src/fasta/scanner/string_scanner.dart'; |
16 import 'package:front_end/src/fasta/scanner/token.dart' | 16 import 'package:front_end/src/fasta/scanner/token.dart' |
17 show BeginGroupToken, CommentToken; | 17 show BeginGroupToken, CommentToken; |
18 import 'package:front_end/src/scanner/token.dart' as analyzer; | 18 import 'package:front_end/src/scanner/token.dart' as analyzer; |
19 | 19 |
20 import 'package:front_end/src/fasta/errors.dart' show internalError; | 20 import 'package:front_end/src/fasta/errors.dart' show internalError; |
21 import 'package:front_end/src/fasta/fasta_codes.dart' | 21 import 'package:front_end/src/fasta/fasta_codes.dart' |
22 show FastaMessage, codeExpectedExpression, codeExpectedFunctionBody; | 22 show FastaMessage, codeExpectedExpression, codeExpectedFunctionBody; |
23 import 'package:front_end/src/fasta/kernel/kernel_builder.dart' | 23 import 'package:front_end/src/fasta/kernel/kernel_builder.dart' |
24 show Builder, KernelLibraryBuilder, ProcedureBuilder, Scope; | 24 show Builder, KernelLibraryBuilder, ProcedureBuilder, Scope; |
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 variableList.keyword, | 844 variableList.keyword, |
845 variableList.type, | 845 variableList.type, |
846 variableList.variables.single.name), | 846 variableList.variables.single.name), |
847 toAnalyzerToken(inKeyword), | 847 toAnalyzerToken(inKeyword), |
848 iterator, | 848 iterator, |
849 toAnalyzerToken(rightParenthesis), | 849 toAnalyzerToken(rightParenthesis), |
850 body)); | 850 body)); |
851 } | 851 } |
852 } | 852 } |
853 | 853 |
854 void endFormalParameter(Token covariantKeyword, Token thisKeyword, | 854 void endFormalParameter(Token thisKeyword, Token nameToken, |
855 Token nameToken, FormalParameterType kind) { | 855 FormalParameterType kind, MemberKind memberKind) { |
856 debugEvent("FormalParameter"); | 856 debugEvent("FormalParameter"); |
857 _ParameterDefaultValue defaultValue = pop(); | 857 _ParameterDefaultValue defaultValue = pop(); |
858 | 858 |
859 AstNode nameOrFunctionTypedParameter = pop(); | 859 AstNode nameOrFunctionTypedParameter = pop(); |
860 | 860 |
861 FormalParameter node; | 861 FormalParameter node; |
862 SimpleIdentifier name; | 862 SimpleIdentifier name; |
863 if (nameOrFunctionTypedParameter is FormalParameter) { | 863 if (nameOrFunctionTypedParameter is FormalParameter) { |
864 node = nameOrFunctionTypedParameter; | 864 node = nameOrFunctionTypedParameter; |
865 name = nameOrFunctionTypedParameter.identifier; | 865 name = nameOrFunctionTypedParameter.identifier; |
866 } else { | 866 } else { |
867 name = nameOrFunctionTypedParameter; | 867 name = nameOrFunctionTypedParameter; |
868 TypeAnnotation type = pop(); | 868 TypeAnnotation type = pop(); |
869 _Modifiers modifiers = pop(); | 869 _Modifiers modifiers = pop(); |
870 Token keyword = modifiers?.finalConstOrVarKeyword; | 870 Token keyword = modifiers?.finalConstOrVarKeyword; |
| 871 Token covariantKeyword = modifiers?.covariantKeyword; |
871 pop(); // TODO(paulberry): Metadata. | 872 pop(); // TODO(paulberry): Metadata. |
872 Comment comment = pop(); | 873 Comment comment = pop(); |
873 if (thisKeyword == null) { | 874 if (thisKeyword == null) { |
874 node = ast.simpleFormalParameter2( | 875 node = ast.simpleFormalParameter2( |
875 comment: comment, | 876 comment: comment, |
876 covariantKeyword: toAnalyzerToken(covariantKeyword), | 877 covariantKeyword: toAnalyzerToken(covariantKeyword), |
877 keyword: toAnalyzerToken(keyword), | 878 keyword: toAnalyzerToken(keyword), |
878 type: type, | 879 type: type, |
879 identifier: name); | 880 identifier: name); |
880 } else { | 881 } else { |
(...skipping 20 matching lines...) Expand all Loading... |
901 | 902 |
902 if (name != null) { | 903 if (name != null) { |
903 scope[name.name] = | 904 scope[name.name] = |
904 name.staticElement = new AnalyzerParameterElement(node); | 905 name.staticElement = new AnalyzerParameterElement(node); |
905 } | 906 } |
906 push(node); | 907 push(node); |
907 } | 908 } |
908 | 909 |
909 @override | 910 @override |
910 void endFunctionTypedFormalParameter( | 911 void endFunctionTypedFormalParameter( |
911 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) { | 912 Token thisKeyword, FormalParameterType kind) { |
912 debugEvent("FunctionTypedFormalParameter"); | 913 debugEvent("FunctionTypedFormalParameter"); |
913 | 914 |
914 FormalParameterList formalParameters = pop(); | 915 FormalParameterList formalParameters = pop(); |
915 TypeParameterList typeParameters = pop(); | 916 TypeParameterList typeParameters = pop(); |
916 SimpleIdentifier name = pop(); | 917 SimpleIdentifier name = pop(); |
917 TypeAnnotation returnType = pop(); | 918 TypeAnnotation returnType = pop(); |
918 | 919 |
919 { | 920 _Modifiers modifiers = pop(); |
920 _Modifiers modifiers = pop(); | 921 Token covariantKeyword = modifiers?.covariantKeyword; |
921 if (modifiers != null) { | |
922 // TODO(scheglov): Report error. | |
923 internalError('Unexpected modifier. Report an error.'); | |
924 } | |
925 } | |
926 | 922 |
927 pop(); // TODO(paulberry): Metadata. | 923 pop(); // TODO(paulberry): Metadata. |
928 Comment comment = pop(); | 924 Comment comment = pop(); |
929 | 925 |
930 FormalParameter node; | 926 FormalParameter node; |
931 if (thisKeyword == null) { | 927 if (thisKeyword == null) { |
932 node = ast.functionTypedFormalParameter2( | 928 node = ast.functionTypedFormalParameter2( |
933 comment: comment, | 929 comment: comment, |
934 covariantKeyword: toAnalyzerToken(covariantKeyword), | 930 covariantKeyword: toAnalyzerToken(covariantKeyword), |
935 returnType: returnType, | 931 returnType: returnType, |
(...skipping 13 matching lines...) Expand all Loading... |
949 period: toAnalyzerToken(period), | 945 period: toAnalyzerToken(period), |
950 identifier: name, | 946 identifier: name, |
951 typeParameters: typeParameters, | 947 typeParameters: typeParameters, |
952 parameters: formalParameters); | 948 parameters: formalParameters); |
953 } | 949 } |
954 | 950 |
955 scope[name.name] = name.staticElement = new AnalyzerParameterElement(node); | 951 scope[name.name] = name.staticElement = new AnalyzerParameterElement(node); |
956 push(node); | 952 push(node); |
957 } | 953 } |
958 | 954 |
959 void endFormalParameters(int count, Token beginToken, Token endToken) { | 955 void endFormalParameters( |
| 956 int count, Token beginToken, Token endToken, MemberKind kind) { |
960 debugEvent("FormalParameters"); | 957 debugEvent("FormalParameters"); |
961 List rawParameters = popList(count) ?? const <Object>[]; | 958 List rawParameters = popList(count) ?? const <Object>[]; |
962 List<FormalParameter> parameters = <FormalParameter>[]; | 959 List<FormalParameter> parameters = <FormalParameter>[]; |
963 Token leftDelimiter; | 960 Token leftDelimiter; |
964 Token rightDelimiter; | 961 Token rightDelimiter; |
965 for (Object raw in rawParameters) { | 962 for (Object raw in rawParameters) { |
966 if (raw is _OptionalFormalParameters) { | 963 if (raw is _OptionalFormalParameters) { |
967 parameters.addAll(raw.parameters); | 964 parameters.addAll(raw.parameters); |
968 leftDelimiter = raw.leftDelimiter; | 965 leftDelimiter = raw.leftDelimiter; |
969 rightDelimiter = raw.rightDelimiter; | 966 rightDelimiter = raw.rightDelimiter; |
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1827 | 1824 |
1828 @override | 1825 @override |
1829 void endTypeArguments(int count, Token beginToken, Token endToken) { | 1826 void endTypeArguments(int count, Token beginToken, Token endToken) { |
1830 debugEvent("TypeArguments"); | 1827 debugEvent("TypeArguments"); |
1831 List<TypeAnnotation> arguments = popList(count); | 1828 List<TypeAnnotation> arguments = popList(count); |
1832 push(ast.typeArgumentList( | 1829 push(ast.typeArgumentList( |
1833 toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken))); | 1830 toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken))); |
1834 } | 1831 } |
1835 | 1832 |
1836 @override | 1833 @override |
1837 void endFields( | 1834 void endFields(int count, Token beginToken, Token endToken) { |
1838 int count, Token covariantKeyword, Token beginToken, Token endToken) { | |
1839 debugEvent("Fields"); | 1835 debugEvent("Fields"); |
1840 List<VariableDeclaration> variables = popList(count); | 1836 List<VariableDeclaration> variables = popList(count); |
1841 TypeAnnotation type = pop(); | 1837 TypeAnnotation type = pop(); |
1842 _Modifiers modifiers = pop(); | 1838 _Modifiers modifiers = pop(); |
1843 var variableList = ast.variableDeclarationList(null, null, | 1839 var variableList = ast.variableDeclarationList(null, null, |
1844 toAnalyzerToken(modifiers?.finalConstOrVarKeyword), type, variables); | 1840 toAnalyzerToken(modifiers?.finalConstOrVarKeyword), type, variables); |
| 1841 Token covariantKeyword = modifiers?.covariantKeyword; |
1845 List<Annotation> metadata = pop(); | 1842 List<Annotation> metadata = pop(); |
1846 Comment comment = pop(); | 1843 Comment comment = pop(); |
1847 push(ast.fieldDeclaration2( | 1844 push(ast.fieldDeclaration2( |
1848 comment: comment, | 1845 comment: comment, |
1849 metadata: metadata, | 1846 metadata: metadata, |
1850 covariantKeyword: toAnalyzerToken(covariantKeyword), | 1847 covariantKeyword: toAnalyzerToken(covariantKeyword), |
1851 staticKeyword: toAnalyzerToken(modifiers?.staticKeyword), | 1848 staticKeyword: toAnalyzerToken(modifiers?.staticKeyword), |
1852 fieldList: variableList, | 1849 fieldList: variableList, |
1853 semicolon: toAnalyzerToken(endToken))); | 1850 semicolon: toAnalyzerToken(endToken))); |
1854 } | 1851 } |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2062 _OperatorName(this.operatorKeyword, this.name); | 2059 _OperatorName(this.operatorKeyword, this.name); |
2063 } | 2060 } |
2064 | 2061 |
2065 /// Data structure placed on the stack to represent a non-empty sequence | 2062 /// Data structure placed on the stack to represent a non-empty sequence |
2066 /// of modifiers. | 2063 /// of modifiers. |
2067 class _Modifiers { | 2064 class _Modifiers { |
2068 Token abstractKeyword; | 2065 Token abstractKeyword; |
2069 Token externalKeyword; | 2066 Token externalKeyword; |
2070 Token finalConstOrVarKeyword; | 2067 Token finalConstOrVarKeyword; |
2071 Token staticKeyword; | 2068 Token staticKeyword; |
| 2069 Token covariantKeyword; |
2072 | 2070 |
2073 _Modifiers(List<Token> modifierTokens) { | 2071 _Modifiers(List<Token> modifierTokens) { |
2074 // No need to check the order and uniqueness of the modifiers, or that | 2072 // No need to check the order and uniqueness of the modifiers, or that |
2075 // disallowed modifiers are not used; the parser should do that. | 2073 // disallowed modifiers are not used; the parser should do that. |
2076 // TODO(paulberry,ahe): implement the necessary logic in the parser. | 2074 // TODO(paulberry,ahe): implement the necessary logic in the parser. |
2077 for (var token in modifierTokens) { | 2075 for (var token in modifierTokens) { |
2078 var s = token.lexeme; | 2076 var s = token.lexeme; |
2079 if (identical('abstract', s)) { | 2077 if (identical('abstract', s)) { |
2080 abstractKeyword = token; | 2078 abstractKeyword = token; |
2081 } else if (identical('const', s)) { | 2079 } else if (identical('const', s)) { |
2082 finalConstOrVarKeyword = token; | 2080 finalConstOrVarKeyword = token; |
2083 } else if (identical('external', s)) { | 2081 } else if (identical('external', s)) { |
2084 externalKeyword = token; | 2082 externalKeyword = token; |
2085 } else if (identical('final', s)) { | 2083 } else if (identical('final', s)) { |
2086 finalConstOrVarKeyword = token; | 2084 finalConstOrVarKeyword = token; |
2087 } else if (identical('static', s)) { | 2085 } else if (identical('static', s)) { |
2088 staticKeyword = token; | 2086 staticKeyword = token; |
2089 } else if (identical('var', s)) { | 2087 } else if (identical('var', s)) { |
2090 finalConstOrVarKeyword = token; | 2088 finalConstOrVarKeyword = token; |
| 2089 } else if (identical('covariant', s)) { |
| 2090 covariantKeyword = token; |
2091 } else { | 2091 } else { |
2092 internalError('Unhandled modifier: $s'); | 2092 internalError('Unhandled modifier: $s'); |
2093 } | 2093 } |
2094 } | 2094 } |
2095 } | 2095 } |
2096 } | 2096 } |
OLD | NEW |