OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.parser.partial_elements; | 5 library dart2js.parser.partial_elements; |
6 | 6 |
7 import '../common/resolution.dart' show | 7 import '../common/resolution.dart' show |
8 Parsing, | 8 Parsing, |
9 Resolution; | 9 Resolution; |
10 import '../compiler.dart' show | |
11 Compiler; | |
12 import '../dart_types.dart' show DynamicType; | 10 import '../dart_types.dart' show DynamicType; |
13 import '../diagnostics/diagnostic_listener.dart'; | 11 import '../diagnostics/diagnostic_listener.dart' show |
| 12 DiagnosticReporter; |
14 import '../diagnostics/invariant.dart' show | 13 import '../diagnostics/invariant.dart' show |
15 invariant; | 14 invariant; |
16 import '../diagnostics/messages.dart'; | 15 import '../diagnostics/messages.dart'; |
17 import '../elements/elements.dart' show | 16 import '../elements/elements.dart' show |
18 CompilationUnitElement, | 17 CompilationUnitElement, |
19 ConstructorElement, | 18 ConstructorElement, |
20 Element, | 19 Element, |
21 ElementKind, | 20 ElementKind, |
22 GetterElement, | 21 GetterElement, |
23 LibraryElement, | 22 LibraryElement, |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 Modifiers modifiers, | 265 Modifiers modifiers, |
267 bool hasParseError) | 266 bool hasParseError) |
268 : super(modifiers) { | 267 : super(modifiers) { |
269 super.beginToken = beginToken; | 268 super.beginToken = beginToken; |
270 super.endToken = endToken; | 269 super.endToken = endToken; |
271 super.hasParseError = hasParseError; | 270 super.hasParseError = hasParseError; |
272 } | 271 } |
273 | 272 |
274 VariableDefinitions parseNode(Element element, Parsing parsing) { | 273 VariableDefinitions parseNode(Element element, Parsing parsing) { |
275 if (definitions != null) return definitions; | 274 if (definitions != null) return definitions; |
276 DiagnosticListener listener = parsing.listener; | 275 DiagnosticReporter reporter = parsing.reporter; |
277 listener.withCurrentElement(element, () { | 276 reporter.withCurrentElement(element, () { |
278 definitions = parse( | 277 definitions = parse( |
279 parsing, element, declarationSite, | 278 parsing, element, declarationSite, |
280 (Parser parser) => parser.parseMember(beginToken)); | 279 (Parser parser) => parser.parseMember(beginToken)); |
281 | 280 |
282 if (!hasParseError && | 281 if (!hasParseError && |
283 !definitions.modifiers.isVar && | 282 !definitions.modifiers.isVar && |
284 !definitions.modifiers.isFinal && | 283 !definitions.modifiers.isFinal && |
285 !definitions.modifiers.isConst && | 284 !definitions.modifiers.isConst && |
286 definitions.type == null && | 285 definitions.type == null && |
287 !definitions.isErroneous) { | 286 !definitions.isErroneous) { |
288 listener.reportErrorMessage( | 287 reporter.reportErrorMessage( |
289 definitions, | 288 definitions, |
290 MessageKind.GENERIC, | 289 MessageKind.GENERIC, |
291 { 'text': 'A field declaration must start with var, final, ' | 290 { 'text': 'A field declaration must start with var, final, ' |
292 'const, or a type annotation.' }); | 291 'const, or a type annotation.' }); |
293 } | 292 } |
294 }); | 293 }); |
295 return definitions; | 294 return definitions; |
296 } | 295 } |
297 | 296 |
298 computeType(Element element, Resolution resolution) { | 297 computeType(Element element, Resolution resolution) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 bool get hasNode => cachedNode != null; | 415 bool get hasNode => cachedNode != null; |
417 | 416 |
418 ClassNode get node { | 417 ClassNode get node { |
419 assert(invariant(this, cachedNode != null, | 418 assert(invariant(this, cachedNode != null, |
420 message: "Node has not been computed for $this.")); | 419 message: "Node has not been computed for $this.")); |
421 return cachedNode; | 420 return cachedNode; |
422 } | 421 } |
423 | 422 |
424 ClassNode parseNode(Parsing parsing) { | 423 ClassNode parseNode(Parsing parsing) { |
425 if (cachedNode != null) return cachedNode; | 424 if (cachedNode != null) return cachedNode; |
426 DiagnosticListener diagnosticListener = parsing.listener; | 425 DiagnosticReporter reporter = parsing.reporter; |
427 diagnosticListener.withCurrentElement(this, () { | 426 reporter.withCurrentElement(this, () { |
428 parsing.measure(() { | 427 parsing.measure(() { |
429 MemberListener listener = new MemberListener(diagnosticListener, this); | 428 MemberListener listener = new MemberListener(reporter, this); |
430 Parser parser = new ClassElementParser(listener); | 429 Parser parser = new ClassElementParser(listener); |
431 try { | 430 try { |
432 Token token = parser.parseTopLevelDeclaration(beginToken); | 431 Token token = parser.parseTopLevelDeclaration(beginToken); |
433 assert(identical(token, endToken.next)); | 432 assert(identical(token, endToken.next)); |
434 cachedNode = listener.popNode(); | 433 cachedNode = listener.popNode(); |
435 assert( | 434 assert( |
436 invariant( | 435 invariant( |
437 beginToken, listener.nodes.isEmpty, | 436 beginToken, listener.nodes.isEmpty, |
438 message: "Non-empty listener stack: ${listener.nodes}")); | 437 message: "Non-empty listener stack: ${listener.nodes}")); |
439 } on ParserError { | 438 } on ParserError { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 PartialClassElement copyWithEnclosing(CompilationUnitElement enclosing) { | 472 PartialClassElement copyWithEnclosing(CompilationUnitElement enclosing) { |
474 return new PartialClassElement(name, beginToken, endToken, enclosing, id); | 473 return new PartialClassElement(name, beginToken, endToken, enclosing, id); |
475 } | 474 } |
476 } | 475 } |
477 | 476 |
478 Node parse( | 477 Node parse( |
479 Parsing parsing, | 478 Parsing parsing, |
480 ElementX element, | 479 ElementX element, |
481 PartialElement partial, | 480 PartialElement partial, |
482 doParse(Parser parser)) { | 481 doParse(Parser parser)) { |
483 DiagnosticListener diagnosticListener = parsing.listener; | 482 DiagnosticReporter reporter = parsing.reporter; |
484 return parsing.measure(() { | 483 return parsing.measure(() { |
485 return diagnosticListener.withCurrentElement(element, () { | 484 return reporter.withCurrentElement(element, () { |
486 CompilationUnitElement unit = element.compilationUnit; | 485 CompilationUnitElement unit = element.compilationUnit; |
487 NodeListener listener = new NodeListener(diagnosticListener, unit); | 486 NodeListener listener = new NodeListener(reporter, unit); |
488 listener.memberErrors = listener.memberErrors.prepend(false); | 487 listener.memberErrors = listener.memberErrors.prepend(false); |
489 try { | 488 try { |
490 if (partial.hasParseError) { | 489 if (partial.hasParseError) { |
491 listener.suppressParseErrors = true; | 490 listener.suppressParseErrors = true; |
492 } | 491 } |
493 doParse(new Parser(listener)); | 492 doParse(new Parser(listener)); |
494 } on ParserError catch (e) { | 493 } on ParserError catch (e) { |
495 partial.hasParseError = true; | 494 partial.hasParseError = true; |
496 return new ErrorNode(element.position, e.reason); | 495 return new ErrorNode(element.position, e.reason); |
497 } | 496 } |
498 Node node = listener.popNode(); | 497 Node node = listener.popNode(); |
499 assert(listener.nodes.isEmpty); | 498 assert(listener.nodes.isEmpty); |
500 return node; | 499 return node; |
501 }); | 500 }); |
502 }); | 501 }); |
503 } | 502 } |
OLD | NEW |