| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 import 'dart:collection' show IterableMixin; | 5 import 'dart:collection' show IterableMixin; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../tokens/precedence_constants.dart' as Precedence show FUNCTION_INFO; | 8 import '../tokens/precedence_constants.dart' as Precedence show FUNCTION_INFO; |
| 9 import '../tokens/token.dart' show BeginGroupToken, Token; | 9 import '../tokens/token.dart' show BeginGroupToken, Token; |
| 10 import '../tokens/token_constants.dart' as Tokens show IDENTIFIER_TOKEN, KEYWORD
_TOKEN, PLUS_TOKEN; | 10 import '../tokens/token_constants.dart' as Tokens |
| 11 show IDENTIFIER_TOKEN, KEYWORD_TOKEN, PLUS_TOKEN; |
| 11 import '../util/util.dart'; | 12 import '../util/util.dart'; |
| 12 import '../util/characters.dart'; | 13 import '../util/characters.dart'; |
| 13 import '../resolution/secret_tree_element.dart' show NullTreeElementMixin, Store
dTreeElementMixin; | 14 import '../resolution/secret_tree_element.dart' |
| 15 show NullTreeElementMixin, StoredTreeElementMixin; |
| 14 import '../elements/elements.dart' show MetadataAnnotation; | 16 import '../elements/elements.dart' show MetadataAnnotation; |
| 15 import 'dartstring.dart'; | 17 import 'dartstring.dart'; |
| 16 import 'prettyprint.dart'; | 18 import 'prettyprint.dart'; |
| 17 import 'unparser.dart'; | 19 import 'unparser.dart'; |
| 18 | 20 |
| 19 abstract class Visitor<R> { | 21 abstract class Visitor<R> { |
| 20 const Visitor(); | 22 const Visitor(); |
| 21 | 23 |
| 22 R visitNode(Node node); | 24 R visitNode(Node node); |
| 23 | 25 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 R visitStringJuxtaposition(StringJuxtaposition node) => visitStringNode(node); | 69 R visitStringJuxtaposition(StringJuxtaposition node) => visitStringNode(node); |
| 68 R visitSyncForIn(SyncForIn node) => visitLoop(node); | 70 R visitSyncForIn(SyncForIn node) => visitLoop(node); |
| 69 R visitLoop(Loop node) => visitStatement(node); | 71 R visitLoop(Loop node) => visitStatement(node); |
| 70 R visitMetadata(Metadata node) => visitNode(node); | 72 R visitMetadata(Metadata node) => visitNode(node); |
| 71 R visitMixinApplication(MixinApplication node) => visitNode(node); | 73 R visitMixinApplication(MixinApplication node) => visitNode(node); |
| 72 R visitModifiers(Modifiers node) => visitNode(node); | 74 R visitModifiers(Modifiers node) => visitNode(node); |
| 73 R visitNamedArgument(NamedArgument node) => visitExpression(node); | 75 R visitNamedArgument(NamedArgument node) => visitExpression(node); |
| 74 R visitNamedMixinApplication(NamedMixinApplication node) { | 76 R visitNamedMixinApplication(NamedMixinApplication node) { |
| 75 return visitMixinApplication(node); | 77 return visitMixinApplication(node); |
| 76 } | 78 } |
| 79 |
| 77 R visitNewExpression(NewExpression node) => visitExpression(node); | 80 R visitNewExpression(NewExpression node) => visitExpression(node); |
| 78 R visitNodeList(NodeList node) => visitNode(node); | 81 R visitNodeList(NodeList node) => visitNode(node); |
| 79 R visitOperator(Operator node) => visitIdentifier(node); | 82 R visitOperator(Operator node) => visitIdentifier(node); |
| 80 R visitParenthesizedExpression(ParenthesizedExpression node) { | 83 R visitParenthesizedExpression(ParenthesizedExpression node) { |
| 81 return visitExpression(node); | 84 return visitExpression(node); |
| 82 } | 85 } |
| 86 |
| 83 R visitPart(Part node) => visitLibraryTag(node); | 87 R visitPart(Part node) => visitLibraryTag(node); |
| 84 R visitPartOf(PartOf node) => visitNode(node); | 88 R visitPartOf(PartOf node) => visitNode(node); |
| 85 R visitPostfix(Postfix node) => visitNodeList(node); | 89 R visitPostfix(Postfix node) => visitNodeList(node); |
| 86 R visitPrefix(Prefix node) => visitNodeList(node); | 90 R visitPrefix(Prefix node) => visitNodeList(node); |
| 87 R visitRedirectingFactoryBody(RedirectingFactoryBody node) { | 91 R visitRedirectingFactoryBody(RedirectingFactoryBody node) { |
| 88 return visitStatement(node); | 92 return visitStatement(node); |
| 89 } | 93 } |
| 94 |
| 90 R visitRethrow(Rethrow node) => visitStatement(node); | 95 R visitRethrow(Rethrow node) => visitStatement(node); |
| 91 R visitReturn(Return node) => visitStatement(node); | 96 R visitReturn(Return node) => visitStatement(node); |
| 92 R visitSend(Send node) => visitExpression(node); | 97 R visitSend(Send node) => visitExpression(node); |
| 93 R visitSendSet(SendSet node) => visitSend(node); | 98 R visitSendSet(SendSet node) => visitSend(node); |
| 94 R visitStatement(Statement node) => visitNode(node); | 99 R visitStatement(Statement node) => visitNode(node); |
| 95 R visitStringNode(StringNode node) => visitExpression(node); | 100 R visitStringNode(StringNode node) => visitExpression(node); |
| 96 R visitStringInterpolation(StringInterpolation node) => visitStringNode(node); | 101 R visitStringInterpolation(StringInterpolation node) => visitStringNode(node); |
| 97 R visitStringInterpolationPart(StringInterpolationPart node) { | 102 R visitStringInterpolationPart(StringInterpolationPart node) { |
| 98 return visitNode(node); | 103 return visitNode(node); |
| 99 } | 104 } |
| 105 |
| 100 R visitSwitchCase(SwitchCase node) => visitNode(node); | 106 R visitSwitchCase(SwitchCase node) => visitNode(node); |
| 101 R visitSwitchStatement(SwitchStatement node) => visitStatement(node); | 107 R visitSwitchStatement(SwitchStatement node) => visitStatement(node); |
| 102 R visitLiteralSymbol(LiteralSymbol node) => visitExpression(node); | 108 R visitLiteralSymbol(LiteralSymbol node) => visitExpression(node); |
| 103 R visitThrow(Throw node) => visitExpression(node); | 109 R visitThrow(Throw node) => visitExpression(node); |
| 104 R visitTryStatement(TryStatement node) => visitStatement(node); | 110 R visitTryStatement(TryStatement node) => visitStatement(node); |
| 105 R visitTypeAnnotation(TypeAnnotation node) => visitNode(node); | 111 R visitTypeAnnotation(TypeAnnotation node) => visitNode(node); |
| 106 R visitTypedef(Typedef node) => visitNode(node); | 112 R visitTypedef(Typedef node) => visitNode(node); |
| 107 R visitTypeVariable(TypeVariable node) => visitNode(node); | 113 R visitTypeVariable(TypeVariable node) => visitNode(node); |
| 108 R visitVariableDefinitions(VariableDefinitions node) => visitStatement(node); | 114 R visitVariableDefinitions(VariableDefinitions node) => visitStatement(node); |
| 109 R visitWhile(While node) => visitLoop(node); | 115 R visitWhile(While node) => visitLoop(node); |
| 110 R visitYield(Yield node) => visitStatement(node); | 116 R visitYield(Yield node) => visitStatement(node); |
| 111 } | 117 } |
| 112 | 118 |
| 113 /// Visitor for [Node]s that take an additional argument of type [A] and returns | 119 /// Visitor for [Node]s that take an additional argument of type [A] and returns |
| 114 /// a value of type [R]. | 120 /// a value of type [R]. |
| 115 abstract class Visitor1<R, A> { | 121 abstract class Visitor1<R, A> { |
| 116 const Visitor1(); | 122 const Visitor1(); |
| 117 | 123 |
| 118 R visitNode(Node node, A arg); | 124 R visitNode(Node node, A arg); |
| 119 | 125 |
| 120 R visitAssert(Assert node, A arg) => visitStatement(node, arg); | 126 R visitAssert(Assert node, A arg) => visitStatement(node, arg); |
| 121 R visitAsyncForIn(AsyncForIn node, A arg) => visitLoop(node, arg); | 127 R visitAsyncForIn(AsyncForIn node, A arg) => visitLoop(node, arg); |
| 122 R visitAsyncModifier(AsyncModifier node, A arg) => visitNode(node, arg); | 128 R visitAsyncModifier(AsyncModifier node, A arg) => visitNode(node, arg); |
| 123 R visitAwait(Await node, A arg) => visitExpression(node, arg); | 129 R visitAwait(Await node, A arg) => visitExpression(node, arg); |
| 124 R visitBlock(Block node, A arg) => visitStatement(node, arg); | 130 R visitBlock(Block node, A arg) => visitStatement(node, arg); |
| 125 R visitBreakStatement(BreakStatement node, A arg) { | 131 R visitBreakStatement(BreakStatement node, A arg) { |
| 126 return visitGotoStatement(node, arg); | 132 return visitGotoStatement(node, arg); |
| 127 } | 133 } |
| 134 |
| 128 R visitCascade(Cascade node, A arg) => visitExpression(node, arg); | 135 R visitCascade(Cascade node, A arg) => visitExpression(node, arg); |
| 129 R visitCascadeReceiver(CascadeReceiver node, A arg) { | 136 R visitCascadeReceiver(CascadeReceiver node, A arg) { |
| 130 return visitExpression(node, arg); | 137 return visitExpression(node, arg); |
| 131 } | 138 } |
| 139 |
| 132 R visitCaseMatch(CaseMatch node, A arg) => visitNode(node, arg); | 140 R visitCaseMatch(CaseMatch node, A arg) => visitNode(node, arg); |
| 133 R visitCatchBlock(CatchBlock node, A arg) => visitNode(node, arg); | 141 R visitCatchBlock(CatchBlock node, A arg) => visitNode(node, arg); |
| 134 R visitClassNode(ClassNode node, A arg) => visitNode(node, arg); | 142 R visitClassNode(ClassNode node, A arg) => visitNode(node, arg); |
| 135 R visitCombinator(Combinator node, A arg) => visitNode(node, arg); | 143 R visitCombinator(Combinator node, A arg) => visitNode(node, arg); |
| 136 R visitConditional(Conditional node, A arg) => visitExpression(node, arg); | 144 R visitConditional(Conditional node, A arg) => visitExpression(node, arg); |
| 137 R visitConditionalUri(ConditionalUri node, A arg) { | 145 R visitConditionalUri(ConditionalUri node, A arg) { |
| 138 return visitNode(node, arg); | 146 return visitNode(node, arg); |
| 139 } | 147 } |
| 148 |
| 140 R visitContinueStatement(ContinueStatement node, A arg) { | 149 R visitContinueStatement(ContinueStatement node, A arg) { |
| 141 return visitGotoStatement(node, arg); | 150 return visitGotoStatement(node, arg); |
| 142 } | 151 } |
| 152 |
| 143 R visitDottedName(DottedName node, A arg) { | 153 R visitDottedName(DottedName node, A arg) { |
| 144 return visitExpression(node, arg); | 154 return visitExpression(node, arg); |
| 145 } | 155 } |
| 156 |
| 146 R visitDoWhile(DoWhile node, A arg) => visitLoop(node, arg); | 157 R visitDoWhile(DoWhile node, A arg) => visitLoop(node, arg); |
| 147 R visitEmptyStatement(EmptyStatement node, A arg) { | 158 R visitEmptyStatement(EmptyStatement node, A arg) { |
| 148 return visitStatement(node, arg); | 159 return visitStatement(node, arg); |
| 149 } | 160 } |
| 161 |
| 150 R visitEnum(Enum node, A arg) => visitNode(node, arg); | 162 R visitEnum(Enum node, A arg) => visitNode(node, arg); |
| 151 R visitExport(Export node, A arg) => visitLibraryDependency(node, arg); | 163 R visitExport(Export node, A arg) => visitLibraryDependency(node, arg); |
| 152 R visitExpression(Expression node, A arg) => visitNode(node, arg); | 164 R visitExpression(Expression node, A arg) => visitNode(node, arg); |
| 153 R visitExpressionStatement(ExpressionStatement node, A arg) { | 165 R visitExpressionStatement(ExpressionStatement node, A arg) { |
| 154 return visitStatement(node, arg); | 166 return visitStatement(node, arg); |
| 155 } | 167 } |
| 168 |
| 156 R visitFor(For node, A arg) => visitLoop(node, arg); | 169 R visitFor(For node, A arg) => visitLoop(node, arg); |
| 157 R visitFunctionDeclaration(FunctionDeclaration node, A arg) { | 170 R visitFunctionDeclaration(FunctionDeclaration node, A arg) { |
| 158 return visitStatement(node, arg); | 171 return visitStatement(node, arg); |
| 159 } | 172 } |
| 173 |
| 160 R visitFunctionExpression(FunctionExpression node, A arg) { | 174 R visitFunctionExpression(FunctionExpression node, A arg) { |
| 161 return visitExpression(node, arg); | 175 return visitExpression(node, arg); |
| 162 } | 176 } |
| 177 |
| 163 R visitGotoStatement(GotoStatement node, A arg) { | 178 R visitGotoStatement(GotoStatement node, A arg) { |
| 164 return visitStatement(node, arg); | 179 return visitStatement(node, arg); |
| 165 } | 180 } |
| 181 |
| 166 R visitIdentifier(Identifier node, A arg) { | 182 R visitIdentifier(Identifier node, A arg) { |
| 167 return visitExpression(node, arg); | 183 return visitExpression(node, arg); |
| 168 } | 184 } |
| 185 |
| 169 R visitImport(Import node, A arg) { | 186 R visitImport(Import node, A arg) { |
| 170 return visitLibraryDependency(node, arg); | 187 return visitLibraryDependency(node, arg); |
| 171 } | 188 } |
| 189 |
| 172 R visitIf(If node, A arg) => visitStatement(node, arg); | 190 R visitIf(If node, A arg) => visitStatement(node, arg); |
| 173 R visitLabel(Label node, A arg) => visitNode(node, arg); | 191 R visitLabel(Label node, A arg) => visitNode(node, arg); |
| 174 R visitLabeledStatement(LabeledStatement node, A arg) { | 192 R visitLabeledStatement(LabeledStatement node, A arg) { |
| 175 return visitStatement(node, arg); | 193 return visitStatement(node, arg); |
| 176 } | 194 } |
| 195 |
| 177 R visitLibraryDependency(LibraryDependency node, A arg) { | 196 R visitLibraryDependency(LibraryDependency node, A arg) { |
| 178 return visitLibraryTag(node, arg); | 197 return visitLibraryTag(node, arg); |
| 179 } | 198 } |
| 199 |
| 180 R visitLibraryName(LibraryName node, A arg) => visitLibraryTag(node, arg); | 200 R visitLibraryName(LibraryName node, A arg) => visitLibraryTag(node, arg); |
| 181 R visitLibraryTag(LibraryTag node, A arg) => visitNode(node, arg); | 201 R visitLibraryTag(LibraryTag node, A arg) => visitNode(node, arg); |
| 182 R visitLiteral(Literal node, A arg) => visitExpression(node, arg); | 202 R visitLiteral(Literal node, A arg) => visitExpression(node, arg); |
| 183 R visitLiteralBool(LiteralBool node, A arg) => visitLiteral(node, arg); | 203 R visitLiteralBool(LiteralBool node, A arg) => visitLiteral(node, arg); |
| 184 R visitLiteralDouble(LiteralDouble node, A arg) => visitLiteral(node, arg); | 204 R visitLiteralDouble(LiteralDouble node, A arg) => visitLiteral(node, arg); |
| 185 R visitLiteralInt(LiteralInt node, A arg) => visitLiteral(node, arg); | 205 R visitLiteralInt(LiteralInt node, A arg) => visitLiteral(node, arg); |
| 186 R visitLiteralList(LiteralList node, A arg) => visitExpression(node, arg); | 206 R visitLiteralList(LiteralList node, A arg) => visitExpression(node, arg); |
| 187 R visitLiteralMap(LiteralMap node, A arg) => visitExpression(node, arg); | 207 R visitLiteralMap(LiteralMap node, A arg) => visitExpression(node, arg); |
| 188 R visitLiteralMapEntry(LiteralMapEntry node, A arg) => visitNode(node, arg); | 208 R visitLiteralMapEntry(LiteralMapEntry node, A arg) => visitNode(node, arg); |
| 189 R visitLiteralNull(LiteralNull node, A arg) => visitLiteral(node, arg); | 209 R visitLiteralNull(LiteralNull node, A arg) => visitLiteral(node, arg); |
| 190 R visitLiteralString(LiteralString node, A arg) => visitStringNode(node, arg); | 210 R visitLiteralString(LiteralString node, A arg) => visitStringNode(node, arg); |
| 191 R visitStringJuxtaposition(StringJuxtaposition node, A arg) { | 211 R visitStringJuxtaposition(StringJuxtaposition node, A arg) { |
| 192 return visitStringNode(node, arg); | 212 return visitStringNode(node, arg); |
| 193 } | 213 } |
| 214 |
| 194 R visitSyncForIn(SyncForIn node, A arg) => visitLoop(node, arg); | 215 R visitSyncForIn(SyncForIn node, A arg) => visitLoop(node, arg); |
| 195 R visitLoop(Loop node, A arg) => visitStatement(node, arg); | 216 R visitLoop(Loop node, A arg) => visitStatement(node, arg); |
| 196 R visitMetadata(Metadata node, A arg) => visitNode(node, arg); | 217 R visitMetadata(Metadata node, A arg) => visitNode(node, arg); |
| 197 R visitMixinApplication(MixinApplication node, A arg) => visitNode(node, arg); | 218 R visitMixinApplication(MixinApplication node, A arg) => visitNode(node, arg); |
| 198 R visitModifiers(Modifiers node, A arg) => visitNode(node, arg); | 219 R visitModifiers(Modifiers node, A arg) => visitNode(node, arg); |
| 199 R visitNamedArgument(NamedArgument node, A arg) => visitExpression(node, arg); | 220 R visitNamedArgument(NamedArgument node, A arg) => visitExpression(node, arg); |
| 200 R visitNamedMixinApplication(NamedMixinApplication node, A arg) { | 221 R visitNamedMixinApplication(NamedMixinApplication node, A arg) { |
| 201 return visitMixinApplication(node, arg); | 222 return visitMixinApplication(node, arg); |
| 202 } | 223 } |
| 224 |
| 203 R visitNewExpression(NewExpression node, A arg) => visitExpression(node, arg); | 225 R visitNewExpression(NewExpression node, A arg) => visitExpression(node, arg); |
| 204 R visitNodeList(NodeList node, A arg) => visitNode(node, arg); | 226 R visitNodeList(NodeList node, A arg) => visitNode(node, arg); |
| 205 R visitOperator(Operator node, A arg) => visitIdentifier(node, arg); | 227 R visitOperator(Operator node, A arg) => visitIdentifier(node, arg); |
| 206 R visitParenthesizedExpression(ParenthesizedExpression node, A arg) { | 228 R visitParenthesizedExpression(ParenthesizedExpression node, A arg) { |
| 207 return visitExpression(node, arg); | 229 return visitExpression(node, arg); |
| 208 } | 230 } |
| 231 |
| 209 R visitPart(Part node, A arg) => visitLibraryTag(node, arg); | 232 R visitPart(Part node, A arg) => visitLibraryTag(node, arg); |
| 210 R visitPartOf(PartOf node, A arg) => visitNode(node, arg); | 233 R visitPartOf(PartOf node, A arg) => visitNode(node, arg); |
| 211 R visitPostfix(Postfix node, A arg) => visitNodeList(node, arg); | 234 R visitPostfix(Postfix node, A arg) => visitNodeList(node, arg); |
| 212 R visitPrefix(Prefix node, A arg) => visitNodeList(node, arg); | 235 R visitPrefix(Prefix node, A arg) => visitNodeList(node, arg); |
| 213 R visitRedirectingFactoryBody(RedirectingFactoryBody node, A arg) { | 236 R visitRedirectingFactoryBody(RedirectingFactoryBody node, A arg) { |
| 214 return visitStatement(node, arg); | 237 return visitStatement(node, arg); |
| 215 } | 238 } |
| 239 |
| 216 R visitRethrow(Rethrow node, A arg) => visitStatement(node, arg); | 240 R visitRethrow(Rethrow node, A arg) => visitStatement(node, arg); |
| 217 R visitReturn(Return node, A arg) => visitStatement(node, arg); | 241 R visitReturn(Return node, A arg) => visitStatement(node, arg); |
| 218 R visitSend(Send node, A arg) => visitExpression(node, arg); | 242 R visitSend(Send node, A arg) => visitExpression(node, arg); |
| 219 R visitSendSet(SendSet node, A arg) => visitSend(node, arg); | 243 R visitSendSet(SendSet node, A arg) => visitSend(node, arg); |
| 220 R visitStatement(Statement node, A arg) => visitNode(node, arg); | 244 R visitStatement(Statement node, A arg) => visitNode(node, arg); |
| 221 R visitStringNode(StringNode node, A arg) => visitExpression(node, arg); | 245 R visitStringNode(StringNode node, A arg) => visitExpression(node, arg); |
| 222 R visitStringInterpolation(StringInterpolation node, A arg) { | 246 R visitStringInterpolation(StringInterpolation node, A arg) { |
| 223 return visitStringNode(node, arg); | 247 return visitStringNode(node, arg); |
| 224 } | 248 } |
| 249 |
| 225 R visitStringInterpolationPart(StringInterpolationPart node, A arg) { | 250 R visitStringInterpolationPart(StringInterpolationPart node, A arg) { |
| 226 return visitNode(node, arg); | 251 return visitNode(node, arg); |
| 227 } | 252 } |
| 253 |
| 228 R visitSwitchCase(SwitchCase node, A arg) => visitNode(node, arg); | 254 R visitSwitchCase(SwitchCase node, A arg) => visitNode(node, arg); |
| 229 R visitSwitchStatement(SwitchStatement node, A arg) { | 255 R visitSwitchStatement(SwitchStatement node, A arg) { |
| 230 return visitStatement(node, arg); | 256 return visitStatement(node, arg); |
| 231 } | 257 } |
| 258 |
| 232 R visitLiteralSymbol(LiteralSymbol node, A arg) => visitExpression(node, arg); | 259 R visitLiteralSymbol(LiteralSymbol node, A arg) => visitExpression(node, arg); |
| 233 R visitThrow(Throw node, A arg) => visitExpression(node, arg); | 260 R visitThrow(Throw node, A arg) => visitExpression(node, arg); |
| 234 R visitTryStatement(TryStatement node, A arg) => visitStatement(node, arg); | 261 R visitTryStatement(TryStatement node, A arg) => visitStatement(node, arg); |
| 235 R visitTypeAnnotation(TypeAnnotation node, A arg) => visitNode(node, arg); | 262 R visitTypeAnnotation(TypeAnnotation node, A arg) => visitNode(node, arg); |
| 236 R visitTypedef(Typedef node, A arg) => visitNode(node, arg); | 263 R visitTypedef(Typedef node, A arg) => visitNode(node, arg); |
| 237 R visitTypeVariable(TypeVariable node, A arg) => visitNode(node, arg); | 264 R visitTypeVariable(TypeVariable node, A arg) => visitNode(node, arg); |
| 238 R visitVariableDefinitions(VariableDefinitions node, A arg) { | 265 R visitVariableDefinitions(VariableDefinitions node, A arg) { |
| 239 return visitStatement(node, arg); | 266 return visitStatement(node, arg); |
| 240 } | 267 } |
| 268 |
| 241 R visitWhile(While node, A arg) => visitLoop(node, arg); | 269 R visitWhile(While node, A arg) => visitLoop(node, arg); |
| 242 R visitYield(Yield node, A arg) => visitStatement(node, arg); | 270 R visitYield(Yield node, A arg) => visitStatement(node, arg); |
| 243 } | 271 } |
| 244 | 272 |
| 245 | |
| 246 Token firstBeginToken(Node first, Node second) { | 273 Token firstBeginToken(Node first, Node second) { |
| 247 Token token = null; | 274 Token token = null; |
| 248 if (first != null) { | 275 if (first != null) { |
| 249 token = first.getBeginToken(); | 276 token = first.getBeginToken(); |
| 250 } | 277 } |
| 251 if (token == null && second != null) { | 278 if (token == null && second != null) { |
| 252 // [token] might be null even when [first] is not, e.g. for empty Modifiers. | 279 // [token] might be null even when [first] is not, e.g. for empty Modifiers. |
| 253 token = second.getBeginToken(); | 280 token = second.getBeginToken(); |
| 254 } | 281 } |
| 255 return token; | 282 return token; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 final Identifier name; | 420 final Identifier name; |
| 394 final Node superclass; | 421 final Node superclass; |
| 395 final NodeList interfaces; | 422 final NodeList interfaces; |
| 396 final NodeList typeParameters; | 423 final NodeList typeParameters; |
| 397 final NodeList body; | 424 final NodeList body; |
| 398 | 425 |
| 399 final Token beginToken; | 426 final Token beginToken; |
| 400 final Token extendsKeyword; | 427 final Token extendsKeyword; |
| 401 final Token endToken; | 428 final Token endToken; |
| 402 | 429 |
| 403 ClassNode(this.modifiers, this.name, this.typeParameters, this.superclass, | 430 ClassNode( |
| 404 this.interfaces, this.beginToken, | 431 this.modifiers, |
| 405 this.extendsKeyword, this.body, this.endToken); | 432 this.name, |
| 433 this.typeParameters, |
| 434 this.superclass, |
| 435 this.interfaces, |
| 436 this.beginToken, |
| 437 this.extendsKeyword, |
| 438 this.body, |
| 439 this.endToken); |
| 406 | 440 |
| 407 ClassNode asClassNode() => this; | 441 ClassNode asClassNode() => this; |
| 408 | 442 |
| 409 accept(Visitor visitor) => visitor.visitClassNode(this); | 443 accept(Visitor visitor) => visitor.visitClassNode(this); |
| 410 | 444 |
| 411 accept1(Visitor1 visitor, arg) => visitor.visitClassNode(this, arg); | 445 accept1(Visitor1 visitor, arg) => visitor.visitClassNode(this, arg); |
| 412 | 446 |
| 413 visitChildren(Visitor visitor) { | 447 visitChildren(Visitor visitor) { |
| 414 if (name != null) name.accept(visitor); | 448 if (name != null) name.accept(visitor); |
| 415 if (typeParameters != null) typeParameters.accept(visitor); | 449 if (typeParameters != null) typeParameters.accept(visitor); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 final Identifier name; | 516 final Identifier name; |
| 483 final NodeList typeParameters; | 517 final NodeList typeParameters; |
| 484 | 518 |
| 485 final Modifiers modifiers; | 519 final Modifiers modifiers; |
| 486 final MixinApplication mixinApplication; | 520 final MixinApplication mixinApplication; |
| 487 final NodeList interfaces; | 521 final NodeList interfaces; |
| 488 | 522 |
| 489 final Token classKeyword; | 523 final Token classKeyword; |
| 490 final Token endToken; | 524 final Token endToken; |
| 491 | 525 |
| 492 NamedMixinApplication(this.name, this.typeParameters, | 526 NamedMixinApplication(this.name, this.typeParameters, this.modifiers, |
| 493 this.modifiers, this.mixinApplication, this.interfaces, | 527 this.mixinApplication, this.interfaces, this.classKeyword, this.endToken); |
| 494 this.classKeyword, this.endToken); | |
| 495 | 528 |
| 496 TypeAnnotation get superclass => mixinApplication.superclass; | 529 TypeAnnotation get superclass => mixinApplication.superclass; |
| 497 NodeList get mixins => mixinApplication.mixins; | 530 NodeList get mixins => mixinApplication.mixins; |
| 498 | 531 |
| 499 MixinApplication asMixinApplication() => this; | 532 MixinApplication asMixinApplication() => this; |
| 500 NamedMixinApplication asNamedMixinApplication() => this; | 533 NamedMixinApplication asNamedMixinApplication() => this; |
| 501 | 534 |
| 502 accept(Visitor visitor) => visitor.visitNamedMixinApplication(this); | 535 accept(Visitor visitor) => visitor.visitNamedMixinApplication(this); |
| 503 | 536 |
| 504 accept1(Visitor1 visitor, arg) { | 537 accept1(Visitor1 visitor, arg) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 534 abstract class Statement extends Node { | 567 abstract class Statement extends Node { |
| 535 Statement(); | 568 Statement(); |
| 536 | 569 |
| 537 Statement asStatement() => this; | 570 Statement asStatement() => this; |
| 538 | 571 |
| 539 bool isValidBreakTarget() => true; | 572 bool isValidBreakTarget() => true; |
| 540 } | 573 } |
| 541 | 574 |
| 542 /// Erroneous expression that behaves as a literal null. | 575 /// Erroneous expression that behaves as a literal null. |
| 543 class ErrorExpression extends LiteralNull { | 576 class ErrorExpression extends LiteralNull { |
| 544 ErrorExpression(token) | 577 ErrorExpression(token) : super(token); |
| 545 : super(token); | |
| 546 | 578 |
| 547 ErrorExpression asErrorExpression() => this; | 579 ErrorExpression asErrorExpression() => this; |
| 548 | 580 |
| 549 bool get isErroneous => true; | 581 bool get isErroneous => true; |
| 550 } | 582 } |
| 551 | 583 |
| 552 /** | 584 /** |
| 553 * A message send aka method invocation. In Dart, most operations can | 585 * A message send aka method invocation. In Dart, most operations can |
| 554 * (and should) be considered as message sends. Getters and setters | 586 * (and should) be considered as message sends. Getters and setters |
| 555 * are just methods with a special syntax. Consequently, we model | 587 * are just methods with a special syntax. Consequently, we model |
| 556 * property access, assignment, operators, and method calls with this | 588 * property access, assignment, operators, and method calls with this |
| 557 * one node. | 589 * one node. |
| 558 */ | 590 */ |
| 559 class Send extends Expression with StoredTreeElementMixin { | 591 class Send extends Expression with StoredTreeElementMixin { |
| 560 final Node receiver; | 592 final Node receiver; |
| 561 final Node selector; | 593 final Node selector; |
| 562 final NodeList argumentsNode; | 594 final NodeList argumentsNode; |
| 563 | 595 |
| 564 /// Whether this is a conditinal send of the form `a?.b`. | 596 /// Whether this is a conditinal send of the form `a?.b`. |
| 565 final bool isConditional; | 597 final bool isConditional; |
| 566 | 598 |
| 567 Link<Node> get arguments => argumentsNode.nodes; | 599 Link<Node> get arguments => argumentsNode.nodes; |
| 568 | 600 |
| 569 Send([this.receiver, this.selector, this.argumentsNode, | 601 Send( |
| 602 [this.receiver, |
| 603 this.selector, |
| 604 this.argumentsNode, |
| 570 this.isConditional = false]); | 605 this.isConditional = false]); |
| 571 Send.postfix(this.receiver, this.selector, | 606 Send.postfix(this.receiver, this.selector, |
| 572 [Node argument = null, this.isConditional = false]) | 607 [Node argument = null, this.isConditional = false]) |
| 573 : argumentsNode = (argument == null) | 608 : argumentsNode = (argument == null) |
| 574 ? new Postfix() | 609 ? new Postfix() |
| 575 : new Postfix.singleton(argument); | 610 : new Postfix.singleton(argument); |
| 576 Send.prefix(this.receiver, this.selector, | 611 Send.prefix(this.receiver, this.selector, |
| 577 [Node argument = null, this.isConditional = false]) | 612 [Node argument = null, this.isConditional = false]) |
| 578 : argumentsNode = (argument == null) | 613 : argumentsNode = |
| 579 ? new Prefix() | 614 (argument == null) ? new Prefix() : new Prefix.singleton(argument); |
| 580 : new Prefix.singleton(argument); | |
| 581 | 615 |
| 582 Send asSend() => this; | 616 Send asSend() => this; |
| 583 | 617 |
| 584 accept(Visitor visitor) => visitor.visitSend(this); | 618 accept(Visitor visitor) => visitor.visitSend(this); |
| 585 | 619 |
| 586 accept1(Visitor1 visitor, arg) => visitor.visitSend(this, arg); | 620 accept1(Visitor1 visitor, arg) => visitor.visitSend(this, arg); |
| 587 | 621 |
| 588 visitChildren(Visitor visitor) { | 622 visitChildren(Visitor visitor) { |
| 589 if (receiver != null) receiver.accept(visitor); | 623 if (receiver != null) receiver.accept(visitor); |
| 590 if (selector != null) selector.accept(visitor); | 624 if (selector != null) selector.accept(visitor); |
| 591 if (argumentsNode != null) argumentsNode.accept(visitor); | 625 if (argumentsNode != null) argumentsNode.accept(visitor); |
| 592 } | 626 } |
| 593 | 627 |
| 594 visitChildren1(Visitor1 visitor, arg) { | 628 visitChildren1(Visitor1 visitor, arg) { |
| 595 if (receiver != null) receiver.accept1(visitor, arg); | 629 if (receiver != null) receiver.accept1(visitor, arg); |
| 596 if (selector != null) selector.accept1(visitor, arg); | 630 if (selector != null) selector.accept1(visitor, arg); |
| 597 if (argumentsNode != null) argumentsNode.accept1(visitor, arg); | 631 if (argumentsNode != null) argumentsNode.accept1(visitor, arg); |
| 598 } | 632 } |
| 599 | 633 |
| 600 int argumentCount() { | 634 int argumentCount() { |
| 601 return (argumentsNode == null) ? -1 : argumentsNode.slowLength(); | 635 return (argumentsNode == null) ? -1 : argumentsNode.slowLength(); |
| 602 } | 636 } |
| 603 | 637 |
| 604 bool get isSuperCall { | 638 bool get isSuperCall { |
| 605 return receiver != null && receiver.isSuper(); | 639 return receiver != null && receiver.isSuper(); |
| 606 } | 640 } |
| 641 |
| 607 bool get isOperator => selector is Operator; | 642 bool get isOperator => selector is Operator; |
| 608 bool get isPropertyAccess => argumentsNode == null; | 643 bool get isPropertyAccess => argumentsNode == null; |
| 609 bool get isFunctionObjectInvocation => selector == null; | 644 bool get isFunctionObjectInvocation => selector == null; |
| 610 bool get isPrefix => argumentsNode is Prefix; | 645 bool get isPrefix => argumentsNode is Prefix; |
| 611 bool get isPostfix => argumentsNode is Postfix; | 646 bool get isPostfix => argumentsNode is Postfix; |
| 612 bool get isCall => !isOperator && !isPropertyAccess; | 647 bool get isCall => !isOperator && !isPropertyAccess; |
| 613 bool get isIndex => | 648 bool get isIndex => |
| 614 isOperator && identical(selector.asOperator().source, '[]'); | 649 isOperator && identical(selector.asOperator().source, '[]'); |
| 615 bool get isLogicalAnd => | 650 bool get isLogicalAnd => |
| 616 isOperator && identical(selector.asOperator().source, '&&'); | 651 isOperator && identical(selector.asOperator().source, '&&'); |
| 617 bool get isLogicalOr => | 652 bool get isLogicalOr => |
| 618 isOperator && identical(selector.asOperator().source, '||'); | 653 isOperator && identical(selector.asOperator().source, '||'); |
| 619 bool get isIfNull => | 654 bool get isIfNull => |
| 620 isOperator && identical(selector.asOperator().source, '??'); | 655 isOperator && identical(selector.asOperator().source, '??'); |
| 621 | 656 |
| 622 bool get isTypeCast { | 657 bool get isTypeCast { |
| 623 return isOperator | 658 return isOperator && identical(selector.asOperator().source, 'as'); |
| 624 && identical(selector.asOperator().source, 'as'); | |
| 625 } | 659 } |
| 626 | 660 |
| 627 bool get isTypeTest { | 661 bool get isTypeTest { |
| 628 return isOperator | 662 return isOperator && identical(selector.asOperator().source, 'is'); |
| 629 && identical(selector.asOperator().source, 'is'); | |
| 630 } | 663 } |
| 631 | 664 |
| 632 bool get isIsNotCheck { | 665 bool get isIsNotCheck { |
| 633 return isTypeTest && arguments.head.asSend() != null; | 666 return isTypeTest && arguments.head.asSend() != null; |
| 634 } | 667 } |
| 635 | 668 |
| 636 TypeAnnotation get typeAnnotationFromIsCheckOrCast { | 669 TypeAnnotation get typeAnnotationFromIsCheckOrCast { |
| 637 assert(isOperator); | 670 assert(isOperator); |
| 638 assert(identical(selector.asOperator().source, 'is') || | 671 assert(identical(selector.asOperator().source, 'is') || |
| 639 identical(selector.asOperator().source, 'as')); | 672 identical(selector.asOperator().source, 'as')); |
| 640 return isIsNotCheck | 673 return isIsNotCheck ? arguments.head.asSend().receiver : arguments.head; |
| 641 ? arguments.head.asSend().receiver | |
| 642 : arguments.head; | |
| 643 } | 674 } |
| 644 | 675 |
| 645 Token getBeginToken() { | 676 Token getBeginToken() { |
| 646 if (isPrefix && !isIndex) return selector.getBeginToken(); | 677 if (isPrefix && !isIndex) return selector.getBeginToken(); |
| 647 return firstBeginToken(receiver, selector); | 678 return firstBeginToken(receiver, selector); |
| 648 } | 679 } |
| 649 | 680 |
| 650 Token getEndToken() { | 681 Token getEndToken() { |
| 651 if (isPrefix) { | 682 if (isPrefix) { |
| 652 if (receiver != null) return receiver.getEndToken(); | 683 if (receiver != null) return receiver.getEndToken(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 674 | 705 |
| 675 class Prefix extends NodeList { | 706 class Prefix extends NodeList { |
| 676 Prefix() : super(null, const Link<Node>()); | 707 Prefix() : super(null, const Link<Node>()); |
| 677 Prefix.singleton(Node argument) : super.singleton(argument); | 708 Prefix.singleton(Node argument) : super.singleton(argument); |
| 678 } | 709 } |
| 679 | 710 |
| 680 class SendSet extends Send { | 711 class SendSet extends Send { |
| 681 final Operator assignmentOperator; | 712 final Operator assignmentOperator; |
| 682 SendSet(receiver, selector, this.assignmentOperator, argumentsNode, | 713 SendSet(receiver, selector, this.assignmentOperator, argumentsNode, |
| 683 [bool isConditional = false]) | 714 [bool isConditional = false]) |
| 684 : super(receiver, selector, argumentsNode, isConditional); | 715 : super(receiver, selector, argumentsNode, isConditional); |
| 685 SendSet.postfix(receiver, | 716 SendSet.postfix(receiver, selector, this.assignmentOperator, |
| 686 selector, | 717 [Node argument = null, bool isConditional = false]) |
| 687 this.assignmentOperator, | |
| 688 [Node argument = null, bool isConditional = false]) | |
| 689 : super.postfix(receiver, selector, argument, isConditional); | 718 : super.postfix(receiver, selector, argument, isConditional); |
| 690 SendSet.prefix(receiver, | 719 SendSet.prefix(receiver, selector, this.assignmentOperator, |
| 691 selector, | 720 [Node argument = null, bool isConditional = false]) |
| 692 this.assignmentOperator, | |
| 693 [Node argument = null, bool isConditional = false]) | |
| 694 : super.prefix(receiver, selector, argument, isConditional); | 721 : super.prefix(receiver, selector, argument, isConditional); |
| 695 | 722 |
| 696 SendSet asSendSet() => this; | 723 SendSet asSendSet() => this; |
| 697 | 724 |
| 698 accept(Visitor visitor) => visitor.visitSendSet(this); | 725 accept(Visitor visitor) => visitor.visitSendSet(this); |
| 699 | 726 |
| 700 accept1(Visitor1 visitor, arg) => visitor.visitSendSet(this, arg); | 727 accept1(Visitor1 visitor, arg) => visitor.visitSendSet(this, arg); |
| 701 | 728 |
| 702 visitChildren(Visitor visitor) { | 729 visitChildren(Visitor visitor) { |
| 703 super.visitChildren(visitor); | 730 super.visitChildren(visitor); |
| 704 if (assignmentOperator != null) assignmentOperator.accept(visitor); | 731 if (assignmentOperator != null) assignmentOperator.accept(visitor); |
| 705 } | 732 } |
| 706 | 733 |
| 707 visitChildren1(Visitor1 visitor, arg) { | 734 visitChildren1(Visitor1 visitor, arg) { |
| 708 super.visitChildren1(visitor, arg); | 735 super.visitChildren1(visitor, arg); |
| 709 if (assignmentOperator != null) assignmentOperator.accept1(visitor, arg); | 736 if (assignmentOperator != null) assignmentOperator.accept1(visitor, arg); |
| 710 } | 737 } |
| 711 | 738 |
| 712 /// `true` if this send is not a simple assignment. | 739 /// `true` if this send is not a simple assignment. |
| 713 bool get isComplex => !identical(assignmentOperator.source, '='); | 740 bool get isComplex => !identical(assignmentOperator.source, '='); |
| 714 | 741 |
| 715 /// Whether this is an if-null assignment of the form `a ??= b`. | 742 /// Whether this is an if-null assignment of the form `a ??= b`. |
| 716 bool get isIfNullAssignment => | 743 bool get isIfNullAssignment => identical(assignmentOperator.source, '??='); |
| 717 identical(assignmentOperator.source, '??='); | |
| 718 | 744 |
| 719 Send copyWithReceiver(Node newReceiver, bool isConditional) { | 745 Send copyWithReceiver(Node newReceiver, bool isConditional) { |
| 720 assert(receiver == null); | 746 assert(receiver == null); |
| 721 return new SendSet(newReceiver, selector, assignmentOperator, | 747 return new SendSet(newReceiver, selector, assignmentOperator, argumentsNode, |
| 722 argumentsNode, isConditional); | 748 isConditional); |
| 723 } | 749 } |
| 724 | 750 |
| 725 Token getBeginToken() { | 751 Token getBeginToken() { |
| 726 if (isPrefix) return assignmentOperator.getBeginToken(); | 752 if (isPrefix) return assignmentOperator.getBeginToken(); |
| 727 return super.getBeginToken(); | 753 return super.getBeginToken(); |
| 728 } | 754 } |
| 729 | 755 |
| 730 Token getEndToken() { | 756 Token getEndToken() { |
| 731 if (isPostfix) return assignmentOperator.getEndToken(); | 757 if (isPostfix) return assignmentOperator.getEndToken(); |
| 732 return super.getEndToken(); | 758 return super.getEndToken(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 | 835 |
| 810 visitChildren1(Visitor1 visitor, arg) { | 836 visitChildren1(Visitor1 visitor, arg) { |
| 811 if (nodes == null) return; | 837 if (nodes == null) return; |
| 812 for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) { | 838 for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) { |
| 813 if (link.head != null) link.head.accept1(visitor, arg); | 839 if (link.head != null) link.head.accept1(visitor, arg); |
| 814 } | 840 } |
| 815 } | 841 } |
| 816 | 842 |
| 817 Token getBeginToken() { | 843 Token getBeginToken() { |
| 818 if (beginToken != null) return beginToken; | 844 if (beginToken != null) return beginToken; |
| 819 if (nodes != null) { | 845 if (nodes != null) { |
| 820 for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) { | 846 for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) { |
| 821 if (link.head.getBeginToken() != null) { | 847 if (link.head.getBeginToken() != null) { |
| 822 return link.head.getBeginToken(); | 848 return link.head.getBeginToken(); |
| 823 } | 849 } |
| 824 if (link.head.getEndToken() != null) { | 850 if (link.head.getEndToken() != null) { |
| 825 return link.head.getEndToken(); | 851 return link.head.getEndToken(); |
| 826 } | 852 } |
| 827 } | 853 } |
| 828 } | 854 } |
| 829 return endToken; | 855 return endToken; |
| 830 } | 856 } |
| 831 | 857 |
| 832 Token getEndToken() { | 858 Token getEndToken() { |
| 833 if (endToken != null) return endToken; | 859 if (endToken != null) return endToken; |
| 834 if (nodes != null) { | 860 if (nodes != null) { |
| 835 Link<Node> link = nodes; | 861 Link<Node> link = nodes; |
| 836 if (link.isEmpty) return beginToken; | 862 if (link.isEmpty) return beginToken; |
| 837 while (!link.tail.isEmpty) link = link.tail; | 863 while (!link.tail.isEmpty) link = link.tail; |
| 838 Node lastNode = link.head; | 864 Node lastNode = link.head; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 } | 896 } |
| 871 | 897 |
| 872 class If extends Statement { | 898 class If extends Statement { |
| 873 final ParenthesizedExpression condition; | 899 final ParenthesizedExpression condition; |
| 874 final Statement thenPart; | 900 final Statement thenPart; |
| 875 final Statement elsePart; | 901 final Statement elsePart; |
| 876 | 902 |
| 877 final Token ifToken; | 903 final Token ifToken; |
| 878 final Token elseToken; | 904 final Token elseToken; |
| 879 | 905 |
| 880 If(this.condition, this.thenPart, this.elsePart, | 906 If(this.condition, this.thenPart, this.elsePart, this.ifToken, |
| 881 this.ifToken, this.elseToken); | 907 this.elseToken); |
| 882 | 908 |
| 883 If asIf() => this; | 909 If asIf() => this; |
| 884 | 910 |
| 885 bool get hasElsePart => elsePart != null; | 911 bool get hasElsePart => elsePart != null; |
| 886 | 912 |
| 887 accept(Visitor visitor) => visitor.visitIf(this); | 913 accept(Visitor visitor) => visitor.visitIf(this); |
| 888 | 914 |
| 889 accept1(Visitor1 visitor, arg) => visitor.visitIf(this, arg); | 915 accept1(Visitor1 visitor, arg) => visitor.visitIf(this, arg); |
| 890 | 916 |
| 891 visitChildren(Visitor visitor) { | 917 visitChildren(Visitor visitor) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 909 } | 935 } |
| 910 | 936 |
| 911 class Conditional extends Expression { | 937 class Conditional extends Expression { |
| 912 final Expression condition; | 938 final Expression condition; |
| 913 final Expression thenExpression; | 939 final Expression thenExpression; |
| 914 final Expression elseExpression; | 940 final Expression elseExpression; |
| 915 | 941 |
| 916 final Token questionToken; | 942 final Token questionToken; |
| 917 final Token colonToken; | 943 final Token colonToken; |
| 918 | 944 |
| 919 Conditional(this.condition, this.thenExpression, | 945 Conditional(this.condition, this.thenExpression, this.elseExpression, |
| 920 this.elseExpression, this.questionToken, this.colonToken); | 946 this.questionToken, this.colonToken); |
| 921 | 947 |
| 922 Conditional asConditional() => this; | 948 Conditional asConditional() => this; |
| 923 | 949 |
| 924 accept(Visitor visitor) => visitor.visitConditional(this); | 950 accept(Visitor visitor) => visitor.visitConditional(this); |
| 925 | 951 |
| 926 accept1(Visitor1 visitor, arg) => visitor.visitConditional(this, arg); | 952 accept1(Visitor1 visitor, arg) => visitor.visitConditional(this, arg); |
| 927 | 953 |
| 928 visitChildren(Visitor visitor) { | 954 visitChildren(Visitor visitor) { |
| 929 condition.accept(visitor); | 955 condition.accept(visitor); |
| 930 thenExpression.accept(visitor); | 956 thenExpression.accept(visitor); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 945 class For extends Loop { | 971 class For extends Loop { |
| 946 /** Either a variable declaration or an expression. */ | 972 /** Either a variable declaration or an expression. */ |
| 947 final Node initializer; | 973 final Node initializer; |
| 948 /** Either an expression statement or an empty statement. */ | 974 /** Either an expression statement or an empty statement. */ |
| 949 final Statement conditionStatement; | 975 final Statement conditionStatement; |
| 950 final NodeList update; | 976 final NodeList update; |
| 951 | 977 |
| 952 final Token forToken; | 978 final Token forToken; |
| 953 | 979 |
| 954 For(this.initializer, this.conditionStatement, this.update, body, | 980 For(this.initializer, this.conditionStatement, this.update, body, |
| 955 this.forToken) : super(body); | 981 this.forToken) |
| 982 : super(body); |
| 956 | 983 |
| 957 For asFor() => this; | 984 For asFor() => this; |
| 958 | 985 |
| 959 Expression get condition { | 986 Expression get condition { |
| 960 ExpressionStatement expressionStatement = | 987 ExpressionStatement expressionStatement = |
| 961 conditionStatement.asExpressionStatement(); | 988 conditionStatement.asExpressionStatement(); |
| 962 if (expressionStatement != null) { | 989 if (expressionStatement != null) { |
| 963 return expressionStatement.expression; | 990 return expressionStatement.expression; |
| 964 } else { | 991 } else { |
| 965 return null; | 992 return null; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 | 1085 |
| 1059 final Statement body; | 1086 final Statement body; |
| 1060 final TypeAnnotation returnType; | 1087 final TypeAnnotation returnType; |
| 1061 final Modifiers modifiers; | 1088 final Modifiers modifiers; |
| 1062 final NodeList initializers; | 1089 final NodeList initializers; |
| 1063 | 1090 |
| 1064 final Token getOrSet; | 1091 final Token getOrSet; |
| 1065 final AsyncModifier asyncModifier; | 1092 final AsyncModifier asyncModifier; |
| 1066 | 1093 |
| 1067 FunctionExpression(this.name, this.parameters, this.body, this.returnType, | 1094 FunctionExpression(this.name, this.parameters, this.body, this.returnType, |
| 1068 this.modifiers, this.initializers, this.getOrSet, | 1095 this.modifiers, this.initializers, this.getOrSet, this.asyncModifier) { |
| 1069 this.asyncModifier) { | |
| 1070 assert(modifiers != null); | 1096 assert(modifiers != null); |
| 1071 } | 1097 } |
| 1072 | 1098 |
| 1073 FunctionExpression asFunctionExpression() => this; | 1099 FunctionExpression asFunctionExpression() => this; |
| 1074 | 1100 |
| 1075 accept(Visitor visitor) => visitor.visitFunctionExpression(this); | 1101 accept(Visitor visitor) => visitor.visitFunctionExpression(this); |
| 1076 | 1102 |
| 1077 accept1(Visitor1 visitor, arg) => visitor.visitFunctionExpression(this, arg); | 1103 accept1(Visitor1 visitor, arg) => visitor.visitFunctionExpression(this, arg); |
| 1078 | 1104 |
| 1079 bool get isRedirectingFactory { | 1105 bool get isRedirectingFactory { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1163 } | 1189 } |
| 1164 } | 1190 } |
| 1165 | 1191 |
| 1166 accept(Visitor visitor) => visitor.visitLiteralInt(this); | 1192 accept(Visitor visitor) => visitor.visitLiteralInt(this); |
| 1167 | 1193 |
| 1168 accept1(Visitor1 visitor, arg) => visitor.visitLiteralInt(this, arg); | 1194 accept1(Visitor1 visitor, arg) => visitor.visitLiteralInt(this, arg); |
| 1169 } | 1195 } |
| 1170 | 1196 |
| 1171 class LiteralDouble extends Literal<double> { | 1197 class LiteralDouble extends Literal<double> { |
| 1172 LiteralDouble(Token token, DecodeErrorHandler handler) | 1198 LiteralDouble(Token token, DecodeErrorHandler handler) |
| 1173 : super(token, handler); | 1199 : super(token, handler); |
| 1174 | 1200 |
| 1175 LiteralDouble asLiteralDouble() => this; | 1201 LiteralDouble asLiteralDouble() => this; |
| 1176 | 1202 |
| 1177 double get value { | 1203 double get value { |
| 1178 try { | 1204 try { |
| 1179 Token valueToken = token; | 1205 Token valueToken = token; |
| 1180 if (identical(valueToken.kind, Tokens.PLUS_TOKEN)) { | 1206 if (identical(valueToken.kind, Tokens.PLUS_TOKEN)) { |
| 1181 valueToken = valueToken.next; | 1207 valueToken = valueToken.next; |
| 1182 } | 1208 } |
| 1183 return double.parse(valueToken.value); | 1209 return double.parse(valueToken.value); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1201 if (identical(token.stringValue, 'false')) return false; | 1227 if (identical(token.stringValue, 'false')) return false; |
| 1202 (this.handler)(token, "not a bool ${token.value}"); | 1228 (this.handler)(token, "not a bool ${token.value}"); |
| 1203 throw false; | 1229 throw false; |
| 1204 } | 1230 } |
| 1205 | 1231 |
| 1206 accept(Visitor visitor) => visitor.visitLiteralBool(this); | 1232 accept(Visitor visitor) => visitor.visitLiteralBool(this); |
| 1207 | 1233 |
| 1208 accept1(Visitor1 visitor, arg) => visitor.visitLiteralBool(this, arg); | 1234 accept1(Visitor1 visitor, arg) => visitor.visitLiteralBool(this, arg); |
| 1209 } | 1235 } |
| 1210 | 1236 |
| 1211 | |
| 1212 class StringQuoting { | 1237 class StringQuoting { |
| 1213 | |
| 1214 /// Cache of common quotings. | 1238 /// Cache of common quotings. |
| 1215 static const List<StringQuoting> _mapping = const <StringQuoting>[ | 1239 static const List<StringQuoting> _mapping = const <StringQuoting>[ |
| 1216 const StringQuoting($SQ, raw: false, leftQuoteLength: 1), | 1240 const StringQuoting($SQ, raw: false, leftQuoteLength: 1), |
| 1217 const StringQuoting($SQ, raw: true, leftQuoteLength: 1), | 1241 const StringQuoting($SQ, raw: true, leftQuoteLength: 1), |
| 1218 const StringQuoting($DQ, raw: false, leftQuoteLength: 1), | 1242 const StringQuoting($DQ, raw: false, leftQuoteLength: 1), |
| 1219 const StringQuoting($DQ, raw: true, leftQuoteLength: 1), | 1243 const StringQuoting($DQ, raw: true, leftQuoteLength: 1), |
| 1220 // No string quotes with 2 characters. | 1244 // No string quotes with 2 characters. |
| 1221 null, | 1245 null, |
| 1222 null, | 1246 null, |
| 1223 null, | 1247 null, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1239 const StringQuoting($DQ, raw: true, leftQuoteLength: 5), | 1263 const StringQuoting($DQ, raw: true, leftQuoteLength: 5), |
| 1240 const StringQuoting($SQ, raw: false, leftQuoteLength: 6), | 1264 const StringQuoting($SQ, raw: false, leftQuoteLength: 6), |
| 1241 const StringQuoting($SQ, raw: true, leftQuoteLength: 6), | 1265 const StringQuoting($SQ, raw: true, leftQuoteLength: 6), |
| 1242 const StringQuoting($DQ, raw: false, leftQuoteLength: 6), | 1266 const StringQuoting($DQ, raw: false, leftQuoteLength: 6), |
| 1243 const StringQuoting($DQ, raw: true, leftQuoteLength: 6) | 1267 const StringQuoting($DQ, raw: true, leftQuoteLength: 6) |
| 1244 ]; | 1268 ]; |
| 1245 | 1269 |
| 1246 final bool raw; | 1270 final bool raw; |
| 1247 final int leftQuoteCharCount; | 1271 final int leftQuoteCharCount; |
| 1248 final int quote; | 1272 final int quote; |
| 1249 const StringQuoting(this.quote, { this.raw, int leftQuoteLength }) | 1273 const StringQuoting(this.quote, {this.raw, int leftQuoteLength}) |
| 1250 : this.leftQuoteCharCount = leftQuoteLength; | 1274 : this.leftQuoteCharCount = leftQuoteLength; |
| 1251 String get quoteChar => identical(quote, $DQ) ? '"' : "'"; | 1275 String get quoteChar => identical(quote, $DQ) ? '"' : "'"; |
| 1252 | 1276 |
| 1253 int get leftQuoteLength => (raw ? 1 : 0) + leftQuoteCharCount; | 1277 int get leftQuoteLength => (raw ? 1 : 0) + leftQuoteCharCount; |
| 1254 int get rightQuoteLength => (leftQuoteCharCount > 2) ? 3 : 1; | 1278 int get rightQuoteLength => (leftQuoteCharCount > 2) ? 3 : 1; |
| 1255 static StringQuoting getQuoting(int quote, bool raw, int leftQuoteLength) { | 1279 static StringQuoting getQuoting(int quote, bool raw, int leftQuoteLength) { |
| 1256 int quoteKindOffset = (quote == $DQ) ? 2 : 0; | 1280 int quoteKindOffset = (quote == $DQ) ? 2 : 0; |
| 1257 int rawOffset = raw ? 1 : 0; | 1281 int rawOffset = raw ? 1 : 0; |
| 1258 int index = (leftQuoteLength - 1) * 4 + rawOffset + quoteKindOffset; | 1282 int index = (leftQuoteLength - 1) * 4 + rawOffset + quoteKindOffset; |
| 1259 if (index < _mapping.length) return _mapping[index]; | 1283 if (index < _mapping.length) return _mapping[index]; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1423 Token getEndToken() => identifiers.getEndToken(); | 1447 Token getEndToken() => identifiers.getEndToken(); |
| 1424 | 1448 |
| 1425 String get slowNameString { | 1449 String get slowNameString { |
| 1426 Unparser unparser = new Unparser(); | 1450 Unparser unparser = new Unparser(); |
| 1427 unparser.unparseNodeListOfIdentifiers(identifiers); | 1451 unparser.unparseNodeListOfIdentifiers(identifiers); |
| 1428 return unparser.result; | 1452 return unparser.result; |
| 1429 } | 1453 } |
| 1430 } | 1454 } |
| 1431 | 1455 |
| 1432 class Operator extends Identifier { | 1456 class Operator extends Identifier { |
| 1433 static const COMPLEX_OPERATORS = | 1457 static const COMPLEX_OPERATORS = const [ |
| 1434 const ["--", "++", '+=', "-=", "*=", "/=", "%=", "&=", "|=", "~/=", "^=", | 1458 "--", |
| 1435 ">>=", "<<=", "??="]; | 1459 "++", |
| 1460 '+=', |
| 1461 "-=", |
| 1462 "*=", |
| 1463 "/=", |
| 1464 "%=", |
| 1465 "&=", |
| 1466 "|=", |
| 1467 "~/=", |
| 1468 "^=", |
| 1469 ">>=", |
| 1470 "<<=", |
| 1471 "??=" |
| 1472 ]; |
| 1436 | 1473 |
| 1437 static const INCREMENT_OPERATORS = const <String>["++", "--"]; | 1474 static const INCREMENT_OPERATORS = const <String>["++", "--"]; |
| 1438 | 1475 |
| 1439 Operator(Token token) : super(token); | 1476 Operator(Token token) : super(token); |
| 1440 | 1477 |
| 1441 Operator asOperator() => this; | 1478 Operator asOperator() => this; |
| 1442 | 1479 |
| 1443 accept(Visitor visitor) => visitor.visitOperator(this); | 1480 accept(Visitor visitor) => visitor.visitOperator(this); |
| 1444 | 1481 |
| 1445 accept1(Visitor1 visitor, arg) => visitor.visitOperator(this, arg); | 1482 accept1(Visitor1 visitor, arg) => visitor.visitOperator(this, arg); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 Token getBeginToken() => yieldToken; | 1543 Token getBeginToken() => yieldToken; |
| 1507 | 1544 |
| 1508 Token getEndToken() => endToken; | 1545 Token getEndToken() => endToken; |
| 1509 } | 1546 } |
| 1510 | 1547 |
| 1511 class RedirectingFactoryBody extends Statement with StoredTreeElementMixin { | 1548 class RedirectingFactoryBody extends Statement with StoredTreeElementMixin { |
| 1512 final Node constructorReference; | 1549 final Node constructorReference; |
| 1513 final Token beginToken; | 1550 final Token beginToken; |
| 1514 final Token endToken; | 1551 final Token endToken; |
| 1515 | 1552 |
| 1516 RedirectingFactoryBody(this.beginToken, this.endToken, | 1553 RedirectingFactoryBody( |
| 1517 this.constructorReference); | 1554 this.beginToken, this.endToken, this.constructorReference); |
| 1518 | 1555 |
| 1519 RedirectingFactoryBody asRedirectingFactoryBody() => this; | 1556 RedirectingFactoryBody asRedirectingFactoryBody() => this; |
| 1520 | 1557 |
| 1521 accept(Visitor visitor) => visitor.visitRedirectingFactoryBody(this); | 1558 accept(Visitor visitor) => visitor.visitRedirectingFactoryBody(this); |
| 1522 | 1559 |
| 1523 accept1(Visitor1 visitor, arg) { | 1560 accept1(Visitor1 visitor, arg) { |
| 1524 return visitor.visitRedirectingFactoryBody(this, arg); | 1561 return visitor.visitRedirectingFactoryBody(this, arg); |
| 1525 } | 1562 } |
| 1526 | 1563 |
| 1527 visitChildren(Visitor visitor) { | 1564 visitChildren(Visitor visitor) { |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 final Token endToken; | 1688 final Token endToken; |
| 1652 | 1689 |
| 1653 Rethrow(this.throwToken, this.endToken); | 1690 Rethrow(this.throwToken, this.endToken); |
| 1654 | 1691 |
| 1655 Rethrow asRethrow() => this; | 1692 Rethrow asRethrow() => this; |
| 1656 | 1693 |
| 1657 accept(Visitor visitor) => visitor.visitRethrow(this); | 1694 accept(Visitor visitor) => visitor.visitRethrow(this); |
| 1658 | 1695 |
| 1659 accept1(Visitor1 visitor, arg) => visitor.visitRethrow(this, arg); | 1696 accept1(Visitor1 visitor, arg) => visitor.visitRethrow(this, arg); |
| 1660 | 1697 |
| 1661 visitChildren(Visitor visitor) { } | 1698 visitChildren(Visitor visitor) {} |
| 1662 | 1699 |
| 1663 visitChildren1(Visitor1 visitor, arg) { } | 1700 visitChildren1(Visitor1 visitor, arg) {} |
| 1664 | 1701 |
| 1665 Token getBeginToken() => throwToken; | 1702 Token getBeginToken() => throwToken; |
| 1666 Token getEndToken() => endToken; | 1703 Token getEndToken() => endToken; |
| 1667 } | 1704 } |
| 1668 | 1705 |
| 1669 class TypeAnnotation extends Node { | 1706 class TypeAnnotation extends Node { |
| 1670 final Expression typeName; | 1707 final Expression typeName; |
| 1671 final NodeList typeArguments; | 1708 final NodeList typeArguments; |
| 1672 | 1709 |
| 1673 TypeAnnotation(Expression this.typeName, NodeList this.typeArguments); | 1710 TypeAnnotation(Expression this.typeName, NodeList this.typeArguments); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1727 return (bound != null) ? bound.getEndToken() : name.getEndToken(); | 1764 return (bound != null) ? bound.getEndToken() : name.getEndToken(); |
| 1728 } | 1765 } |
| 1729 } | 1766 } |
| 1730 | 1767 |
| 1731 class VariableDefinitions extends Statement { | 1768 class VariableDefinitions extends Statement { |
| 1732 final NodeList metadata; | 1769 final NodeList metadata; |
| 1733 final TypeAnnotation type; | 1770 final TypeAnnotation type; |
| 1734 final Modifiers modifiers; | 1771 final Modifiers modifiers; |
| 1735 final NodeList definitions; | 1772 final NodeList definitions; |
| 1736 | 1773 |
| 1737 VariableDefinitions(this.type, | 1774 VariableDefinitions(this.type, this.modifiers, this.definitions) |
| 1738 this.modifiers, | |
| 1739 this.definitions) | |
| 1740 : this.metadata = null { | 1775 : this.metadata = null { |
| 1741 assert(modifiers != null); | 1776 assert(modifiers != null); |
| 1742 } | 1777 } |
| 1743 | 1778 |
| 1744 // TODO(johnniwinther): Make this its own node type. | 1779 // TODO(johnniwinther): Make this its own node type. |
| 1745 VariableDefinitions.forParameter(this.metadata, | 1780 VariableDefinitions.forParameter( |
| 1746 this.type, | 1781 this.metadata, this.type, this.modifiers, this.definitions) { |
| 1747 this.modifiers, | |
| 1748 this.definitions) { | |
| 1749 assert(modifiers != null); | 1782 assert(modifiers != null); |
| 1750 } | 1783 } |
| 1751 | 1784 |
| 1752 VariableDefinitions asVariableDefinitions() => this; | 1785 VariableDefinitions asVariableDefinitions() => this; |
| 1753 | 1786 |
| 1754 accept(Visitor visitor) => visitor.visitVariableDefinitions(this); | 1787 accept(Visitor visitor) => visitor.visitVariableDefinitions(this); |
| 1755 | 1788 |
| 1756 accept1(Visitor1 visitor, arg) => visitor.visitVariableDefinitions(this, arg); | 1789 accept1(Visitor1 visitor, arg) => visitor.visitVariableDefinitions(this, arg); |
| 1757 | 1790 |
| 1758 visitChildren(Visitor visitor) { | 1791 visitChildren(Visitor visitor) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1787 bool isValidContinueTarget() => true; | 1820 bool isValidContinueTarget() => true; |
| 1788 } | 1821 } |
| 1789 | 1822 |
| 1790 class DoWhile extends Loop { | 1823 class DoWhile extends Loop { |
| 1791 final Token doKeyword; | 1824 final Token doKeyword; |
| 1792 final Token whileKeyword; | 1825 final Token whileKeyword; |
| 1793 final Token endToken; | 1826 final Token endToken; |
| 1794 | 1827 |
| 1795 final Expression condition; | 1828 final Expression condition; |
| 1796 | 1829 |
| 1797 DoWhile(Statement body, Expression this.condition, | 1830 DoWhile(Statement body, Expression this.condition, Token this.doKeyword, |
| 1798 Token this.doKeyword, Token this.whileKeyword, Token this.endToken) | 1831 Token this.whileKeyword, Token this.endToken) |
| 1799 : super(body); | 1832 : super(body); |
| 1800 | 1833 |
| 1801 DoWhile asDoWhile() => this; | 1834 DoWhile asDoWhile() => this; |
| 1802 | 1835 |
| 1803 accept(Visitor visitor) => visitor.visitDoWhile(this); | 1836 accept(Visitor visitor) => visitor.visitDoWhile(this); |
| 1804 | 1837 |
| 1805 accept1(Visitor1 visitor, arg) => visitor.visitDoWhile(this, arg); | 1838 accept1(Visitor1 visitor, arg) => visitor.visitDoWhile(this, arg); |
| 1806 | 1839 |
| 1807 visitChildren(Visitor visitor) { | 1840 visitChildren(Visitor visitor) { |
| 1808 if (condition != null) condition.accept(visitor); | 1841 if (condition != null) condition.accept(visitor); |
| 1809 if (body != null) body.accept(visitor); | 1842 if (body != null) body.accept(visitor); |
| 1810 } | 1843 } |
| 1811 | 1844 |
| 1812 visitChildren1(Visitor1 visitor, arg) { | 1845 visitChildren1(Visitor1 visitor, arg) { |
| 1813 if (condition != null) condition.accept1(visitor, arg); | 1846 if (condition != null) condition.accept1(visitor, arg); |
| 1814 if (body != null) body.accept1(visitor, arg); | 1847 if (body != null) body.accept1(visitor, arg); |
| 1815 } | 1848 } |
| 1816 | 1849 |
| 1817 Token getBeginToken() => doKeyword; | 1850 Token getBeginToken() => doKeyword; |
| 1818 | 1851 |
| 1819 Token getEndToken() => endToken; | 1852 Token getEndToken() => endToken; |
| 1820 } | 1853 } |
| 1821 | 1854 |
| 1822 class While extends Loop { | 1855 class While extends Loop { |
| 1823 final Token whileKeyword; | 1856 final Token whileKeyword; |
| 1824 final Expression condition; | 1857 final Expression condition; |
| 1825 | 1858 |
| 1826 While(Expression this.condition, Statement body, | 1859 While(Expression this.condition, Statement body, Token this.whileKeyword) |
| 1827 Token this.whileKeyword) : super(body); | 1860 : super(body); |
| 1828 | 1861 |
| 1829 While asWhile() => this; | 1862 While asWhile() => this; |
| 1830 | 1863 |
| 1831 accept(Visitor visitor) => visitor.visitWhile(this); | 1864 accept(Visitor visitor) => visitor.visitWhile(this); |
| 1832 | 1865 |
| 1833 accept1(Visitor1 visitor, arg) => visitor.visitWhile(this, arg); | 1866 accept1(Visitor1 visitor, arg) => visitor.visitWhile(this, arg); |
| 1834 | 1867 |
| 1835 visitChildren(Visitor visitor) { | 1868 visitChildren(Visitor visitor) { |
| 1836 if (condition != null) condition.accept(visitor); | 1869 if (condition != null) condition.accept(visitor); |
| 1837 if (body != null) body.accept(visitor); | 1870 if (body != null) body.accept(visitor); |
| 1838 } | 1871 } |
| 1839 | 1872 |
| 1840 visitChildren1(Visitor1 visitor, arg) { | 1873 visitChildren1(Visitor1 visitor, arg) { |
| 1841 if (condition != null) condition.accept1(visitor, arg); | 1874 if (condition != null) condition.accept1(visitor, arg); |
| 1842 if (body != null) body.accept1(visitor, arg); | 1875 if (body != null) body.accept1(visitor, arg); |
| 1843 } | 1876 } |
| 1844 | 1877 |
| 1845 Token getBeginToken() => whileKeyword; | 1878 Token getBeginToken() => whileKeyword; |
| 1846 | 1879 |
| 1847 Token getEndToken() => body.getEndToken(); | 1880 Token getEndToken() => body.getEndToken(); |
| 1848 } | 1881 } |
| 1849 | 1882 |
| 1850 class ParenthesizedExpression extends Expression { | 1883 class ParenthesizedExpression extends Expression { |
| 1851 final Expression expression; | 1884 final Expression expression; |
| 1852 final BeginGroupToken beginToken; | 1885 final BeginGroupToken beginToken; |
| 1853 | 1886 |
| 1854 ParenthesizedExpression(Expression this.expression, | 1887 ParenthesizedExpression( |
| 1855 BeginGroupToken this.beginToken); | 1888 Expression this.expression, BeginGroupToken this.beginToken); |
| 1856 | 1889 |
| 1857 ParenthesizedExpression asParenthesizedExpression() => this; | 1890 ParenthesizedExpression asParenthesizedExpression() => this; |
| 1858 | 1891 |
| 1859 accept(Visitor visitor) => visitor.visitParenthesizedExpression(this); | 1892 accept(Visitor visitor) => visitor.visitParenthesizedExpression(this); |
| 1860 | 1893 |
| 1861 accept1(Visitor1 visitor, arg) { | 1894 accept1(Visitor1 visitor, arg) { |
| 1862 return visitor.visitParenthesizedExpression(this, arg); | 1895 return visitor.visitParenthesizedExpression(this, arg); |
| 1863 } | 1896 } |
| 1864 | 1897 |
| 1865 visitChildren(Visitor visitor) { | 1898 visitChildren(Visitor visitor) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1902 static const int FLAG_EXTERNAL = FLAG_FACTORY << 1; | 1935 static const int FLAG_EXTERNAL = FLAG_FACTORY << 1; |
| 1903 | 1936 |
| 1904 Modifiers(NodeList nodes) : this.withFlags(nodes, computeFlags(nodes.nodes)); | 1937 Modifiers(NodeList nodes) : this.withFlags(nodes, computeFlags(nodes.nodes)); |
| 1905 | 1938 |
| 1906 Modifiers.withFlags(this.nodes, this.flags); | 1939 Modifiers.withFlags(this.nodes, this.flags); |
| 1907 | 1940 |
| 1908 static int computeFlags(Link<Node> nodes) { | 1941 static int computeFlags(Link<Node> nodes) { |
| 1909 int flags = 0; | 1942 int flags = 0; |
| 1910 for (; !nodes.isEmpty; nodes = nodes.tail) { | 1943 for (; !nodes.isEmpty; nodes = nodes.tail) { |
| 1911 String value = nodes.head.asIdentifier().source; | 1944 String value = nodes.head.asIdentifier().source; |
| 1912 if (identical(value, 'static')) flags |= FLAG_STATIC; | 1945 if (identical(value, 'static')) |
| 1913 else if (identical(value, 'abstract')) flags |= FLAG_ABSTRACT; | 1946 flags |= FLAG_STATIC; |
| 1914 else if (identical(value, 'final')) flags |= FLAG_FINAL; | 1947 else if (identical(value, 'abstract')) |
| 1915 else if (identical(value, 'var')) flags |= FLAG_VAR; | 1948 flags |= FLAG_ABSTRACT; |
| 1916 else if (identical(value, 'const')) flags |= FLAG_CONST; | 1949 else if (identical(value, 'final')) |
| 1917 else if (identical(value, 'factory')) flags |= FLAG_FACTORY; | 1950 flags |= FLAG_FINAL; |
| 1918 else if (identical(value, 'external')) flags |= FLAG_EXTERNAL; | 1951 else if (identical(value, 'var')) |
| 1919 else throw 'internal error: ${nodes.head}'; | 1952 flags |= FLAG_VAR; |
| 1953 else if (identical(value, 'const')) |
| 1954 flags |= FLAG_CONST; |
| 1955 else if (identical(value, 'factory')) |
| 1956 flags |= FLAG_FACTORY; |
| 1957 else if (identical(value, 'external')) |
| 1958 flags |= FLAG_EXTERNAL; |
| 1959 else |
| 1960 throw 'internal error: ${nodes.head}'; |
| 1920 } | 1961 } |
| 1921 return flags; | 1962 return flags; |
| 1922 } | 1963 } |
| 1923 | 1964 |
| 1924 Node findModifier(String modifier) { | 1965 Node findModifier(String modifier) { |
| 1925 Link<Node> nodeList = nodes.nodes; | 1966 Link<Node> nodeList = nodes.nodes; |
| 1926 for (; !nodeList.isEmpty; nodeList = nodeList.tail) { | 1967 for (; !nodeList.isEmpty; nodeList = nodeList.tail) { |
| 1927 String value = nodeList.head.asIdentifier().source; | 1968 String value = nodeList.head.asIdentifier().source; |
| 1928 if(identical(value, modifier)) { | 1969 if (identical(value, modifier)) { |
| 1929 return nodeList.head; | 1970 return nodeList.head; |
| 1930 } | 1971 } |
| 1931 } | 1972 } |
| 1932 return null; | 1973 return null; |
| 1933 } | 1974 } |
| 1934 | 1975 |
| 1935 Modifiers asModifiers() => this; | 1976 Modifiers asModifiers() => this; |
| 1936 Token getBeginToken() => nodes.getBeginToken(); | 1977 Token getBeginToken() => nodes.getBeginToken(); |
| 1937 Token getEndToken() => nodes.getEndToken(); | 1978 Token getEndToken() => nodes.getEndToken(); |
| 1938 | 1979 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1954 | 1995 |
| 1955 Node getStatic() => findModifier('static'); | 1996 Node getStatic() => findModifier('static'); |
| 1956 | 1997 |
| 1957 /** | 1998 /** |
| 1958 * Use this to check if the declaration is either explicitly or implicitly | 1999 * Use this to check if the declaration is either explicitly or implicitly |
| 1959 * final. | 2000 * final. |
| 1960 */ | 2001 */ |
| 1961 bool get isFinalOrConst => isFinal || isConst; | 2002 bool get isFinalOrConst => isFinal || isConst; |
| 1962 | 2003 |
| 1963 String toString() { | 2004 String toString() { |
| 1964 return modifiersToString(isStatic: isStatic, | 2005 return modifiersToString( |
| 1965 isAbstract: isAbstract, | 2006 isStatic: isStatic, |
| 1966 isFinal: isFinal, | 2007 isAbstract: isAbstract, |
| 1967 isVar: isVar, | 2008 isFinal: isFinal, |
| 1968 isConst: isConst, | 2009 isVar: isVar, |
| 1969 isFactory: isFactory, | 2010 isConst: isConst, |
| 1970 isExternal: isExternal); | 2011 isFactory: isFactory, |
| 2012 isExternal: isExternal); |
| 1971 } | 2013 } |
| 1972 } | 2014 } |
| 1973 | 2015 |
| 1974 class StringInterpolation extends StringNode { | 2016 class StringInterpolation extends StringNode { |
| 1975 final LiteralString string; | 2017 final LiteralString string; |
| 1976 final NodeList parts; | 2018 final NodeList parts; |
| 1977 | 2019 |
| 1978 StringInterpolation(this.string, this.parts); | 2020 StringInterpolation(this.string, this.parts); |
| 1979 | 2021 |
| 1980 StringInterpolation asStringInterpolation() => this; | 2022 StringInterpolation asStringInterpolation() => this; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2050 */ | 2092 */ |
| 2051 DartString dartStringCache = null; | 2093 DartString dartStringCache = null; |
| 2052 | 2094 |
| 2053 StringJuxtaposition(this.first, this.second); | 2095 StringJuxtaposition(this.first, this.second); |
| 2054 | 2096 |
| 2055 StringJuxtaposition asStringJuxtaposition() => this; | 2097 StringJuxtaposition asStringJuxtaposition() => this; |
| 2056 | 2098 |
| 2057 bool get isInterpolation { | 2099 bool get isInterpolation { |
| 2058 if (isInterpolationCache == null) { | 2100 if (isInterpolationCache == null) { |
| 2059 isInterpolationCache = (first.accept(const IsInterpolationVisitor()) || | 2101 isInterpolationCache = (first.accept(const IsInterpolationVisitor()) || |
| 2060 second.accept(const IsInterpolationVisitor())); | 2102 second.accept(const IsInterpolationVisitor())); |
| 2061 } | 2103 } |
| 2062 return isInterpolationCache; | 2104 return isInterpolationCache; |
| 2063 } | 2105 } |
| 2064 | 2106 |
| 2065 /** | 2107 /** |
| 2066 * Retrieve a single DartString that represents this entire juxtaposition | 2108 * Retrieve a single DartString that represents this entire juxtaposition |
| 2067 * of string literals. | 2109 * of string literals. |
| 2068 * Should only be called if [isInterpolation] returns false. | 2110 * Should only be called if [isInterpolation] returns false. |
| 2069 */ | 2111 */ |
| 2070 DartString get dartString { | 2112 DartString get dartString { |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2213 | 2255 |
| 2214 Token getEndToken() => expression.getEndToken(); | 2256 Token getEndToken() => expression.getEndToken(); |
| 2215 } | 2257 } |
| 2216 | 2258 |
| 2217 class SwitchStatement extends Statement { | 2259 class SwitchStatement extends Statement { |
| 2218 final ParenthesizedExpression parenthesizedExpression; | 2260 final ParenthesizedExpression parenthesizedExpression; |
| 2219 final NodeList cases; | 2261 final NodeList cases; |
| 2220 | 2262 |
| 2221 final Token switchKeyword; | 2263 final Token switchKeyword; |
| 2222 | 2264 |
| 2223 SwitchStatement(this.parenthesizedExpression, this.cases, | 2265 SwitchStatement(this.parenthesizedExpression, this.cases, this.switchKeyword); |
| 2224 this.switchKeyword); | |
| 2225 | 2266 |
| 2226 SwitchStatement asSwitchStatement() => this; | 2267 SwitchStatement asSwitchStatement() => this; |
| 2227 | 2268 |
| 2228 Expression get expression => parenthesizedExpression.expression; | 2269 Expression get expression => parenthesizedExpression.expression; |
| 2229 | 2270 |
| 2230 accept(Visitor visitor) => visitor.visitSwitchStatement(this); | 2271 accept(Visitor visitor) => visitor.visitSwitchStatement(this); |
| 2231 | 2272 |
| 2232 accept1(Visitor1 visitor, arg) => visitor.visitSwitchStatement(this, arg); | 2273 accept1(Visitor1 visitor, arg) => visitor.visitSwitchStatement(this, arg); |
| 2233 | 2274 |
| 2234 visitChildren(Visitor visitor) { | 2275 visitChildren(Visitor visitor) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2276 | 2317 |
| 2277 /** List of [Label] and [CaseMatch] nodes. */ | 2318 /** List of [Label] and [CaseMatch] nodes. */ |
| 2278 final NodeList labelsAndCases; | 2319 final NodeList labelsAndCases; |
| 2279 /** A "default" keyword token, if applicable. */ | 2320 /** A "default" keyword token, if applicable. */ |
| 2280 final Token defaultKeyword; | 2321 final Token defaultKeyword; |
| 2281 /** List of statements, the body of the case. */ | 2322 /** List of statements, the body of the case. */ |
| 2282 final NodeList statements; | 2323 final NodeList statements; |
| 2283 | 2324 |
| 2284 final Token startToken; | 2325 final Token startToken; |
| 2285 | 2326 |
| 2286 SwitchCase(this.labelsAndCases, this.defaultKeyword, | 2327 SwitchCase(this.labelsAndCases, this.defaultKeyword, this.statements, |
| 2287 this.statements, this.startToken); | 2328 this.startToken); |
| 2288 | 2329 |
| 2289 SwitchCase asSwitchCase() => this; | 2330 SwitchCase asSwitchCase() => this; |
| 2290 | 2331 |
| 2291 bool get isDefaultCase => defaultKeyword != null; | 2332 bool get isDefaultCase => defaultKeyword != null; |
| 2292 | 2333 |
| 2293 bool isValidContinueTarget() => true; | 2334 bool isValidContinueTarget() => true; |
| 2294 | 2335 |
| 2295 accept(Visitor visitor) => visitor.visitSwitchCase(this); | 2336 accept(Visitor visitor) => visitor.visitSwitchCase(this); |
| 2296 | 2337 |
| 2297 accept1(Visitor1 visitor, arg) => visitor.visitSwitchCase(this, arg); | 2338 accept1(Visitor1 visitor, arg) => visitor.visitSwitchCase(this, arg); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2343 Token getBeginToken() => keywordToken; | 2384 Token getBeginToken() => keywordToken; |
| 2344 | 2385 |
| 2345 Token getEndToken() => semicolonToken; | 2386 Token getEndToken() => semicolonToken; |
| 2346 | 2387 |
| 2347 // TODO(ahe): make class abstract instead of adding an abstract method. | 2388 // TODO(ahe): make class abstract instead of adding an abstract method. |
| 2348 accept(Visitor visitor); | 2389 accept(Visitor visitor); |
| 2349 } | 2390 } |
| 2350 | 2391 |
| 2351 class BreakStatement extends GotoStatement { | 2392 class BreakStatement extends GotoStatement { |
| 2352 BreakStatement(Identifier target, Token keywordToken, Token semicolonToken) | 2393 BreakStatement(Identifier target, Token keywordToken, Token semicolonToken) |
| 2353 : super(target, keywordToken, semicolonToken); | 2394 : super(target, keywordToken, semicolonToken); |
| 2354 | 2395 |
| 2355 BreakStatement asBreakStatement() => this; | 2396 BreakStatement asBreakStatement() => this; |
| 2356 | 2397 |
| 2357 accept(Visitor visitor) => visitor.visitBreakStatement(this); | 2398 accept(Visitor visitor) => visitor.visitBreakStatement(this); |
| 2358 | 2399 |
| 2359 accept1(Visitor1 visitor, arg) => visitor.visitBreakStatement(this, arg); | 2400 accept1(Visitor1 visitor, arg) => visitor.visitBreakStatement(this, arg); |
| 2360 } | 2401 } |
| 2361 | 2402 |
| 2362 class ContinueStatement extends GotoStatement { | 2403 class ContinueStatement extends GotoStatement { |
| 2363 ContinueStatement(Identifier target, Token keywordToken, Token semicolonToken) | 2404 ContinueStatement(Identifier target, Token keywordToken, Token semicolonToken) |
| 2364 : super(target, keywordToken, semicolonToken); | 2405 : super(target, keywordToken, semicolonToken); |
| 2365 | 2406 |
| 2366 ContinueStatement asContinueStatement() => this; | 2407 ContinueStatement asContinueStatement() => this; |
| 2367 | 2408 |
| 2368 accept(Visitor visitor) => visitor.visitContinueStatement(this); | 2409 accept(Visitor visitor) => visitor.visitContinueStatement(this); |
| 2369 | 2410 |
| 2370 accept1(Visitor1 visitor, arg) => visitor.visitContinueStatement(this, arg); | 2411 accept1(Visitor1 visitor, arg) => visitor.visitContinueStatement(this, arg); |
| 2371 } | 2412 } |
| 2372 | 2413 |
| 2373 abstract class ForIn extends Loop { | 2414 abstract class ForIn extends Loop { |
| 2374 final Node declaredIdentifier; | 2415 final Node declaredIdentifier; |
| 2375 final Expression expression; | 2416 final Expression expression; |
| 2376 | 2417 |
| 2377 final Token forToken; | 2418 final Token forToken; |
| 2378 final Token inToken; | 2419 final Token inToken; |
| 2379 | 2420 |
| 2380 ForIn(this.declaredIdentifier, this.expression, | 2421 ForIn(this.declaredIdentifier, this.expression, Statement body, this.forToken, |
| 2381 Statement body, this.forToken, this.inToken) | 2422 this.inToken) |
| 2382 : super(body); | 2423 : super(body); |
| 2383 | 2424 |
| 2384 Expression get condition => null; | 2425 Expression get condition => null; |
| 2385 | 2426 |
| 2386 ForIn asForIn() => this; | 2427 ForIn asForIn() => this; |
| 2387 | 2428 |
| 2388 Token getEndToken() => body.getEndToken(); | 2429 Token getEndToken() => body.getEndToken(); |
| 2389 } | 2430 } |
| 2390 | 2431 |
| 2391 class SyncForIn extends ForIn with StoredTreeElementMixin { | 2432 class SyncForIn extends ForIn with StoredTreeElementMixin { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2409 expression.accept1(visitor, arg); | 2450 expression.accept1(visitor, arg); |
| 2410 body.accept1(visitor, arg); | 2451 body.accept1(visitor, arg); |
| 2411 } | 2452 } |
| 2412 | 2453 |
| 2413 Token getBeginToken() => forToken; | 2454 Token getBeginToken() => forToken; |
| 2414 } | 2455 } |
| 2415 | 2456 |
| 2416 class AsyncForIn extends ForIn with StoredTreeElementMixin { | 2457 class AsyncForIn extends ForIn with StoredTreeElementMixin { |
| 2417 final Token awaitToken; | 2458 final Token awaitToken; |
| 2418 | 2459 |
| 2419 AsyncForIn(declaredIdentifier, expression, | 2460 AsyncForIn(declaredIdentifier, expression, Statement body, this.awaitToken, |
| 2420 Statement body, this.awaitToken, forToken, inToken) | 2461 forToken, inToken) |
| 2421 : super(declaredIdentifier, expression, body, forToken, inToken); | 2462 : super(declaredIdentifier, expression, body, forToken, inToken); |
| 2422 | 2463 |
| 2423 AsyncForIn asAsyncForIn() => this; | 2464 AsyncForIn asAsyncForIn() => this; |
| 2424 | 2465 |
| 2425 accept(Visitor visitor) => visitor.visitAsyncForIn(this); | 2466 accept(Visitor visitor) => visitor.visitAsyncForIn(this); |
| 2426 | 2467 |
| 2427 accept1(Visitor1 visitor, arg) => visitor.visitAsyncForIn(this, arg); | 2468 accept1(Visitor1 visitor, arg) => visitor.visitAsyncForIn(this, arg); |
| 2428 | 2469 |
| 2429 visitChildren(Visitor visitor) { | 2470 visitChildren(Visitor visitor) { |
| 2430 declaredIdentifier.accept(visitor); | 2471 declaredIdentifier.accept(visitor); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2506 bool get isExport => false; | 2547 bool get isExport => false; |
| 2507 bool get isPart => false; | 2548 bool get isPart => false; |
| 2508 bool get isPartOf => false; | 2549 bool get isPartOf => false; |
| 2509 } | 2550 } |
| 2510 | 2551 |
| 2511 class LibraryName extends LibraryTag { | 2552 class LibraryName extends LibraryTag { |
| 2512 final Expression name; | 2553 final Expression name; |
| 2513 | 2554 |
| 2514 final Token libraryKeyword; | 2555 final Token libraryKeyword; |
| 2515 | 2556 |
| 2516 LibraryName(this.libraryKeyword, | 2557 LibraryName(this.libraryKeyword, this.name, List<MetadataAnnotation> metadata) |
| 2517 this.name, | 2558 : super(metadata); |
| 2518 List<MetadataAnnotation> metadata) | |
| 2519 : super(metadata); | |
| 2520 | 2559 |
| 2521 bool get isLibraryName => true; | 2560 bool get isLibraryName => true; |
| 2522 | 2561 |
| 2523 LibraryName asLibraryName() => this; | 2562 LibraryName asLibraryName() => this; |
| 2524 | 2563 |
| 2525 accept(Visitor visitor) => visitor.visitLibraryName(this); | 2564 accept(Visitor visitor) => visitor.visitLibraryName(this); |
| 2526 | 2565 |
| 2527 accept1(Visitor1 visitor, arg) => visitor.visitLibraryName(this, arg); | 2566 accept1(Visitor1 visitor, arg) => visitor.visitLibraryName(this, arg); |
| 2528 | 2567 |
| 2529 visitChildren(Visitor visitor) => name.accept(visitor); | 2568 visitChildren(Visitor visitor) => name.accept(visitor); |
| 2530 | 2569 |
| 2531 visitChildren1(Visitor1 visitor, arg) => name.accept1(visitor, arg); | 2570 visitChildren1(Visitor1 visitor, arg) => name.accept1(visitor, arg); |
| 2532 | 2571 |
| 2533 Token getBeginToken() => libraryKeyword; | 2572 Token getBeginToken() => libraryKeyword; |
| 2534 | 2573 |
| 2535 Token getEndToken() => name.getEndToken().next; | 2574 Token getEndToken() => name.getEndToken().next; |
| 2536 } | 2575 } |
| 2537 | 2576 |
| 2538 /** | 2577 /** |
| 2539 * This tag describes a dependency between one library and the exported | 2578 * This tag describes a dependency between one library and the exported |
| 2540 * identifiers of another library. The other library is specified by the [uri]. | 2579 * identifiers of another library. The other library is specified by the [uri]. |
| 2541 * Combinators filter away some identifiers from the other library. | 2580 * Combinators filter away some identifiers from the other library. |
| 2542 */ | 2581 */ |
| 2543 abstract class LibraryDependency extends LibraryTag { | 2582 abstract class LibraryDependency extends LibraryTag { |
| 2544 final StringNode uri; | 2583 final StringNode uri; |
| 2545 final NodeList conditionalUris; | 2584 final NodeList conditionalUris; |
| 2546 final NodeList combinators; | 2585 final NodeList combinators; |
| 2547 | 2586 |
| 2548 LibraryDependency(this.uri, | 2587 LibraryDependency(this.uri, this.conditionalUris, this.combinators, |
| 2549 this.conditionalUris, | 2588 List<MetadataAnnotation> metadata) |
| 2550 this.combinators, | 2589 : super(metadata); |
| 2551 List<MetadataAnnotation> metadata) | |
| 2552 : super(metadata); | |
| 2553 | 2590 |
| 2554 LibraryDependency asLibraryDependency() => this; | 2591 LibraryDependency asLibraryDependency() => this; |
| 2555 | 2592 |
| 2556 bool get hasConditionalUris => conditionalUris != null; | 2593 bool get hasConditionalUris => conditionalUris != null; |
| 2557 } | 2594 } |
| 2558 | 2595 |
| 2559 /** | 2596 /** |
| 2560 * An [:import:] library tag. | 2597 * An [:import:] library tag. |
| 2561 * | 2598 * |
| 2562 * An import tag is dependency on another library where the exported identifiers | 2599 * An import tag is dependency on another library where the exported identifiers |
| 2563 * are put into the import scope of the importing library. The import scope is | 2600 * are put into the import scope of the importing library. The import scope is |
| 2564 * only visible inside the library. | 2601 * only visible inside the library. |
| 2565 */ | 2602 */ |
| 2566 class Import extends LibraryDependency { | 2603 class Import extends LibraryDependency { |
| 2567 final Identifier prefix; | 2604 final Identifier prefix; |
| 2568 final Token importKeyword; | 2605 final Token importKeyword; |
| 2569 final bool isDeferred; | 2606 final bool isDeferred; |
| 2570 | 2607 |
| 2571 Import(this.importKeyword, StringNode uri, NodeList conditionalUris, | 2608 Import(this.importKeyword, StringNode uri, NodeList conditionalUris, |
| 2572 this.prefix, NodeList combinators, | 2609 this.prefix, NodeList combinators, List<MetadataAnnotation> metadata, |
| 2573 List<MetadataAnnotation> metadata, | 2610 {this.isDeferred}) |
| 2574 {this.isDeferred}) | |
| 2575 : super(uri, conditionalUris, combinators, metadata); | 2611 : super(uri, conditionalUris, combinators, metadata); |
| 2576 | 2612 |
| 2577 bool get isImport => true; | 2613 bool get isImport => true; |
| 2578 | 2614 |
| 2579 Import asImport() => this; | 2615 Import asImport() => this; |
| 2580 | 2616 |
| 2581 accept(Visitor visitor) => visitor.visitImport(this); | 2617 accept(Visitor visitor) => visitor.visitImport(this); |
| 2582 | 2618 |
| 2583 accept1(Visitor1 visitor, arg) => visitor.visitImport(this, arg); | 2619 accept1(Visitor1 visitor, arg) => visitor.visitImport(this, arg); |
| 2584 | 2620 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2682 /** | 2718 /** |
| 2683 * An [:export:] library tag. | 2719 * An [:export:] library tag. |
| 2684 * | 2720 * |
| 2685 * An export tag is dependency on another library where the exported identifiers | 2721 * An export tag is dependency on another library where the exported identifiers |
| 2686 * are put into the export scope of the exporting library. The export scope is | 2722 * are put into the export scope of the exporting library. The export scope is |
| 2687 * not visible inside the library. | 2723 * not visible inside the library. |
| 2688 */ | 2724 */ |
| 2689 class Export extends LibraryDependency { | 2725 class Export extends LibraryDependency { |
| 2690 final Token exportKeyword; | 2726 final Token exportKeyword; |
| 2691 | 2727 |
| 2692 Export(this.exportKeyword, | 2728 Export(this.exportKeyword, StringNode uri, NodeList conditionalUris, |
| 2693 StringNode uri, | 2729 NodeList combinators, List<MetadataAnnotation> metadata) |
| 2694 NodeList conditionalUris, | |
| 2695 NodeList combinators, | |
| 2696 List<MetadataAnnotation> metadata) | |
| 2697 : super(uri, conditionalUris, combinators, metadata); | 2730 : super(uri, conditionalUris, combinators, metadata); |
| 2698 | 2731 |
| 2699 bool get isExport => true; | 2732 bool get isExport => true; |
| 2700 | 2733 |
| 2701 Export asExport() => this; | 2734 Export asExport() => this; |
| 2702 | 2735 |
| 2703 accept(Visitor visitor) => visitor.visitExport(this); | 2736 accept(Visitor visitor) => visitor.visitExport(this); |
| 2704 | 2737 |
| 2705 accept1(Visitor1 visitor, arg) => visitor.visitExport(this, arg); | 2738 accept1(Visitor1 visitor, arg) => visitor.visitExport(this, arg); |
| 2706 | 2739 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2722 return uri.getEndToken().next; | 2755 return uri.getEndToken().next; |
| 2723 } | 2756 } |
| 2724 } | 2757 } |
| 2725 | 2758 |
| 2726 class Part extends LibraryTag { | 2759 class Part extends LibraryTag { |
| 2727 final StringNode uri; | 2760 final StringNode uri; |
| 2728 | 2761 |
| 2729 final Token partKeyword; | 2762 final Token partKeyword; |
| 2730 | 2763 |
| 2731 Part(this.partKeyword, this.uri, List<MetadataAnnotation> metadata) | 2764 Part(this.partKeyword, this.uri, List<MetadataAnnotation> metadata) |
| 2732 : super(metadata); | 2765 : super(metadata); |
| 2733 | 2766 |
| 2734 bool get isPart => true; | 2767 bool get isPart => true; |
| 2735 | 2768 |
| 2736 Part asPart() => this; | 2769 Part asPart() => this; |
| 2737 | 2770 |
| 2738 accept(Visitor visitor) => visitor.visitPart(this); | 2771 accept(Visitor visitor) => visitor.visitPart(this); |
| 2739 | 2772 |
| 2740 accept1(Visitor1 visitor, arg) => visitor.visitPart(this, arg); | 2773 accept1(Visitor1 visitor, arg) => visitor.visitPart(this, arg); |
| 2741 | 2774 |
| 2742 visitChildren(Visitor visitor) => uri.accept(visitor); | 2775 visitChildren(Visitor visitor) => uri.accept(visitor); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2805 class Typedef extends Node { | 2838 class Typedef extends Node { |
| 2806 final TypeAnnotation returnType; | 2839 final TypeAnnotation returnType; |
| 2807 final Identifier name; | 2840 final Identifier name; |
| 2808 final NodeList typeParameters; | 2841 final NodeList typeParameters; |
| 2809 final NodeList formals; | 2842 final NodeList formals; |
| 2810 | 2843 |
| 2811 final Token typedefKeyword; | 2844 final Token typedefKeyword; |
| 2812 final Token endToken; | 2845 final Token endToken; |
| 2813 | 2846 |
| 2814 Typedef(this.returnType, this.name, this.typeParameters, this.formals, | 2847 Typedef(this.returnType, this.name, this.typeParameters, this.formals, |
| 2815 this.typedefKeyword, this.endToken); | 2848 this.typedefKeyword, this.endToken); |
| 2816 | 2849 |
| 2817 Typedef asTypedef() => this; | 2850 Typedef asTypedef() => this; |
| 2818 | 2851 |
| 2819 accept(Visitor visitor) => visitor.visitTypedef(this); | 2852 accept(Visitor visitor) => visitor.visitTypedef(this); |
| 2820 | 2853 |
| 2821 accept1(Visitor1 visitor, arg) => visitor.visitTypedef(this, arg); | 2854 accept1(Visitor1 visitor, arg) => visitor.visitTypedef(this, arg); |
| 2822 | 2855 |
| 2823 visitChildren(Visitor visitor) { | 2856 visitChildren(Visitor visitor) { |
| 2824 if (returnType != null) returnType.accept(visitor); | 2857 if (returnType != null) returnType.accept(visitor); |
| 2825 name.accept(visitor); | 2858 name.accept(visitor); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2841 | 2874 |
| 2842 class TryStatement extends Statement { | 2875 class TryStatement extends Statement { |
| 2843 final Block tryBlock; | 2876 final Block tryBlock; |
| 2844 final NodeList catchBlocks; | 2877 final NodeList catchBlocks; |
| 2845 final Block finallyBlock; | 2878 final Block finallyBlock; |
| 2846 | 2879 |
| 2847 final Token tryKeyword; | 2880 final Token tryKeyword; |
| 2848 final Token finallyKeyword; | 2881 final Token finallyKeyword; |
| 2849 | 2882 |
| 2850 TryStatement(this.tryBlock, this.catchBlocks, this.finallyBlock, | 2883 TryStatement(this.tryBlock, this.catchBlocks, this.finallyBlock, |
| 2851 this.tryKeyword, this.finallyKeyword); | 2884 this.tryKeyword, this.finallyKeyword); |
| 2852 | 2885 |
| 2853 TryStatement asTryStatement() => this; | 2886 TryStatement asTryStatement() => this; |
| 2854 | 2887 |
| 2855 accept(Visitor visitor) => visitor.visitTryStatement(this); | 2888 accept(Visitor visitor) => visitor.visitTryStatement(this); |
| 2856 | 2889 |
| 2857 accept1(Visitor1 visitor, arg) => visitor.visitTryStatement(this, arg); | 2890 accept1(Visitor1 visitor, arg) => visitor.visitTryStatement(this, arg); |
| 2858 | 2891 |
| 2859 visitChildren(Visitor visitor) { | 2892 visitChildren(Visitor visitor) { |
| 2860 tryBlock.accept(visitor); | 2893 tryBlock.accept(visitor); |
| 2861 catchBlocks.accept(visitor); | 2894 catchBlocks.accept(visitor); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2923 } | 2956 } |
| 2924 | 2957 |
| 2925 class CatchBlock extends Node { | 2958 class CatchBlock extends Node { |
| 2926 final TypeAnnotation type; | 2959 final TypeAnnotation type; |
| 2927 final NodeList formals; | 2960 final NodeList formals; |
| 2928 final Block block; | 2961 final Block block; |
| 2929 | 2962 |
| 2930 final Token onKeyword; | 2963 final Token onKeyword; |
| 2931 final Token catchKeyword; | 2964 final Token catchKeyword; |
| 2932 | 2965 |
| 2933 CatchBlock(this.type, this.formals, this.block, | 2966 CatchBlock( |
| 2934 this.onKeyword, this.catchKeyword); | 2967 this.type, this.formals, this.block, this.onKeyword, this.catchKeyword); |
| 2935 | 2968 |
| 2936 CatchBlock asCatchBlock() => this; | 2969 CatchBlock asCatchBlock() => this; |
| 2937 | 2970 |
| 2938 accept(Visitor visitor) => visitor.visitCatchBlock(this); | 2971 accept(Visitor visitor) => visitor.visitCatchBlock(this); |
| 2939 | 2972 |
| 2940 accept1(Visitor1 visitor, arg) => visitor.visitCatchBlock(this, arg); | 2973 accept1(Visitor1 visitor, arg) => visitor.visitCatchBlock(this, arg); |
| 2941 | 2974 |
| 2942 Node get exception { | 2975 Node get exception { |
| 2943 if (formals == null || formals.nodes.isEmpty) return null; | 2976 if (formals == null || formals.nodes.isEmpty) return null; |
| 2944 VariableDefinitions declarations = formals.nodes.head; | 2977 VariableDefinitions declarations = formals.nodes.head; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2991 } | 3024 } |
| 2992 | 3025 |
| 2993 Token getBeginToken() => token; | 3026 Token getBeginToken() => token; |
| 2994 | 3027 |
| 2995 Token getEndToken() => expression.getEndToken(); | 3028 Token getEndToken() => expression.getEndToken(); |
| 2996 } | 3029 } |
| 2997 | 3030 |
| 2998 class Initializers { | 3031 class Initializers { |
| 2999 static bool isSuperConstructorCall(Send node) { | 3032 static bool isSuperConstructorCall(Send node) { |
| 3000 return (node.receiver == null && node.selector.isSuper()) || | 3033 return (node.receiver == null && node.selector.isSuper()) || |
| 3001 (node.receiver != null && | 3034 (node.receiver != null && |
| 3002 node.receiver.isSuper() && | 3035 node.receiver.isSuper() && |
| 3003 !node.isConditional && | 3036 !node.isConditional && |
| 3004 node.selector.asIdentifier() != null); | 3037 node.selector.asIdentifier() != null); |
| 3005 } | 3038 } |
| 3006 | 3039 |
| 3007 static bool isConstructorRedirect(Send node) { | 3040 static bool isConstructorRedirect(Send node) { |
| 3008 return (node.receiver == null && node.selector.isThis()) || | 3041 return (node.receiver == null && node.selector.isThis()) || |
| 3009 (node.receiver != null && | 3042 (node.receiver != null && |
| 3010 node.receiver.isThis() && | 3043 node.receiver.isThis() && |
| 3011 !node.isConditional && | 3044 !node.isConditional && |
| 3012 node.selector.asIdentifier() != null); | 3045 node.selector.asIdentifier() != null); |
| 3013 } | 3046 } |
| 3014 } | 3047 } |
| 3015 | 3048 |
| 3016 class GetDartStringVisitor extends Visitor<DartString> { | 3049 class GetDartStringVisitor extends Visitor<DartString> { |
| 3017 const GetDartStringVisitor(); | 3050 const GetDartStringVisitor(); |
| 3018 DartString visitNode(Node node) => null; | 3051 DartString visitNode(Node node) => null; |
| 3019 DartString visitStringJuxtaposition(StringJuxtaposition node) | 3052 DartString visitStringJuxtaposition(StringJuxtaposition node) => |
| 3020 => node.dartString; | 3053 node.dartString; |
| 3021 DartString visitLiteralString(LiteralString node) => node.dartString; | 3054 DartString visitLiteralString(LiteralString node) => node.dartString; |
| 3022 } | 3055 } |
| 3023 | 3056 |
| 3024 class IsInterpolationVisitor extends Visitor<bool> { | 3057 class IsInterpolationVisitor extends Visitor<bool> { |
| 3025 const IsInterpolationVisitor(); | 3058 const IsInterpolationVisitor(); |
| 3026 bool visitNode(Node node) => false; | 3059 bool visitNode(Node node) => false; |
| 3027 bool visitStringInterpolation(StringInterpolation node) => true; | 3060 bool visitStringInterpolation(StringInterpolation node) => true; |
| 3028 bool visitStringJuxtaposition(StringJuxtaposition node) | 3061 bool visitStringJuxtaposition(StringJuxtaposition node) => |
| 3029 => node.isInterpolation; | 3062 node.isInterpolation; |
| 3030 } | 3063 } |
| 3031 | 3064 |
| 3032 /// Erroneous node used to recover from parser errors. Implements various | 3065 /// Erroneous node used to recover from parser errors. Implements various |
| 3033 /// interfaces and provides bare minimum of implementation to avoid unnecessary | 3066 /// interfaces and provides bare minimum of implementation to avoid unnecessary |
| 3034 /// messages. | 3067 /// messages. |
| 3035 class ErrorNode | 3068 class ErrorNode extends Node |
| 3036 extends Node | |
| 3037 implements FunctionExpression, VariableDefinitions, Typedef { | 3069 implements FunctionExpression, VariableDefinitions, Typedef { |
| 3038 final Token token; | 3070 final Token token; |
| 3039 final String reason; | 3071 final String reason; |
| 3040 final Identifier name; | 3072 final Identifier name; |
| 3041 final NodeList definitions; | 3073 final NodeList definitions; |
| 3042 | 3074 |
| 3043 ErrorNode.internal(this.token, this.reason, this.name, this.definitions); | 3075 ErrorNode.internal(this.token, this.reason, this.name, this.definitions); |
| 3044 | 3076 |
| 3045 factory ErrorNode(Token token, String reason) { | 3077 factory ErrorNode(Token token, String reason) { |
| 3046 Identifier name = new Identifier(token); | 3078 Identifier name = new Identifier(token); |
| 3047 NodeList definitions = new NodeList( | 3079 NodeList definitions = |
| 3048 null, const Link<Node>().prepend(name), null, null); | 3080 new NodeList(null, const Link<Node>().prepend(name), null, null); |
| 3049 return new ErrorNode.internal(token, reason, name, definitions); | 3081 return new ErrorNode.internal(token, reason, name, definitions); |
| 3050 } | 3082 } |
| 3051 | 3083 |
| 3052 Token get beginToken => token; | 3084 Token get beginToken => token; |
| 3053 Token get endToken => token; | 3085 Token get endToken => token; |
| 3054 | 3086 |
| 3055 Token getBeginToken() => token; | 3087 Token getBeginToken() => token; |
| 3056 | 3088 |
| 3057 Token getEndToken() => token; | 3089 Token getEndToken() => token; |
| 3058 | 3090 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3080 | 3112 |
| 3081 // VariableDefinitions. | 3113 // VariableDefinitions. |
| 3082 get metadata => null; | 3114 get metadata => null; |
| 3083 get type => null; | 3115 get type => null; |
| 3084 | 3116 |
| 3085 // Typedef. | 3117 // Typedef. |
| 3086 get typeParameters => null; | 3118 get typeParameters => null; |
| 3087 get formals => null; | 3119 get formals => null; |
| 3088 get typedefKeyword => null; | 3120 get typedefKeyword => null; |
| 3089 } | 3121 } |
| OLD | NEW |