| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:convert'; | 6 import 'dart:convert'; |
| 7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 import 'package:front_end/src/incremental/byte_store.dart'; | 38 import 'package:front_end/src/incremental/byte_store.dart'; |
| 39 import 'package:meta/meta.dart'; | 39 import 'package:meta/meta.dart'; |
| 40 | 40 |
| 41 /** | 41 /** |
| 42 * [FileContentOverlay] is used to temporary override content of files. | 42 * [FileContentOverlay] is used to temporary override content of files. |
| 43 */ | 43 */ |
| 44 class FileContentOverlay { | 44 class FileContentOverlay { |
| 45 final _map = <String, String>{}; | 45 final _map = <String, String>{}; |
| 46 | 46 |
| 47 /** | 47 /** |
| 48 * Return the paths currently being overridden. |
| 49 */ |
| 50 Iterable<String> get paths => _map.keys; |
| 51 |
| 52 /** |
| 48 * Return the content of the file with the given [path], or `null` the | 53 * Return the content of the file with the given [path], or `null` the |
| 49 * overlay does not override the content of the file. | 54 * overlay does not override the content of the file. |
| 50 * | 55 * |
| 51 * The [path] must be absolute and normalized. | 56 * The [path] must be absolute and normalized. |
| 52 */ | 57 */ |
| 53 String operator [](String path) => _map[path]; | 58 String operator [](String path) => _map[path]; |
| 54 | 59 |
| 55 /** | 60 /** |
| 56 * Return the new [content] of the file with the given [path]. | 61 * Return the new [content] of the file with the given [path]. |
| 57 * | 62 * |
| 58 * The [path] must be absolute and normalized. | 63 * The [path] must be absolute and normalized. |
| 59 */ | 64 */ |
| 60 void operator []=(String path, String content) { | 65 void operator []=(String path, String content) { |
| 61 if (content == null) { | 66 if (content == null) { |
| 62 _map.remove(path); | 67 _map.remove(path); |
| 63 } else { | 68 } else { |
| 64 _map[path] = content; | 69 _map[path] = content; |
| 65 } | 70 } |
| 66 } | 71 } |
| 67 | |
| 68 /** | |
| 69 * Return the paths currently being overridden. | |
| 70 */ | |
| 71 Iterable<String> get paths => _map.keys; | |
| 72 } | 72 } |
| 73 | 73 |
| 74 /** | 74 /** |
| 75 * Information about a file being analyzed, explicitly or implicitly. | 75 * Information about a file being analyzed, explicitly or implicitly. |
| 76 * | 76 * |
| 77 * It provides a consistent view on its properties. | 77 * It provides a consistent view on its properties. |
| 78 * | 78 * |
| 79 * The properties are not guaranteed to represent the most recent state | 79 * The properties are not guaranteed to represent the most recent state |
| 80 * of the file system. To update the file to the most recent state, [refresh] | 80 * of the file system. To update the file to the most recent state, [refresh] |
| 81 * should be called. | 81 * should be called. |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 | 379 |
| 380 /** | 380 /** |
| 381 * Return a new parsed unresolved [CompilationUnit]. | 381 * Return a new parsed unresolved [CompilationUnit]. |
| 382 */ | 382 */ |
| 383 CompilationUnit parse(AnalysisErrorListener errorListener) { | 383 CompilationUnit parse(AnalysisErrorListener errorListener) { |
| 384 return PerformanceStatistics.parse.makeCurrentWhile(() { | 384 return PerformanceStatistics.parse.makeCurrentWhile(() { |
| 385 return _parse(errorListener); | 385 return _parse(errorListener); |
| 386 }); | 386 }); |
| 387 } | 387 } |
| 388 | 388 |
| 389 CompilationUnit _parse(AnalysisErrorListener errorListener) { | |
| 390 AnalysisOptions analysisOptions = _fsState._analysisOptions; | |
| 391 | |
| 392 if (USE_FASTA_PARSER) { | |
| 393 try { | |
| 394 fasta.ScannerResult scanResult = | |
| 395 PerformanceStatistics.scan.makeCurrentWhile(() { | |
| 396 return fasta.scan( | |
| 397 _contentBytes, | |
| 398 includeComments: true, | |
| 399 scanGenericMethodComments: analysisOptions.strongMode, | |
| 400 ); | |
| 401 }); | |
| 402 | |
| 403 var astBuilder = new fasta.AstBuilder( | |
| 404 new ErrorReporter(errorListener, source), | |
| 405 null, | |
| 406 null, | |
| 407 new _FastaElementStoreProxy(), | |
| 408 new fasta.Scope.top(isModifiable: true), | |
| 409 true, | |
| 410 uri); | |
| 411 astBuilder.parseGenericMethodComments = analysisOptions.strongMode; | |
| 412 | |
| 413 var parser = new fasta.Parser(astBuilder); | |
| 414 astBuilder.parser = parser; | |
| 415 parser.parseUnit(scanResult.tokens); | |
| 416 var unit = astBuilder.pop() as CompilationUnit; | |
| 417 | |
| 418 LineInfo lineInfo = new LineInfo(scanResult.lineStarts); | |
| 419 unit.lineInfo = lineInfo; | |
| 420 return unit; | |
| 421 } catch (e, st) { | |
| 422 print(e); | |
| 423 print(st); | |
| 424 rethrow; | |
| 425 } | |
| 426 } else { | |
| 427 CharSequenceReader reader = new CharSequenceReader(content); | |
| 428 Scanner scanner = new Scanner(source, reader, errorListener); | |
| 429 scanner.scanGenericMethodComments = analysisOptions.strongMode; | |
| 430 Token token = PerformanceStatistics.scan.makeCurrentWhile(() { | |
| 431 return scanner.tokenize(); | |
| 432 }); | |
| 433 LineInfo lineInfo = new LineInfo(scanner.lineStarts); | |
| 434 | |
| 435 Parser parser = new Parser(source, errorListener); | |
| 436 parser.enableAssertInitializer = analysisOptions.enableAssertInitializer; | |
| 437 parser.parseGenericMethodComments = analysisOptions.strongMode; | |
| 438 CompilationUnit unit = parser.parseCompilationUnit(token); | |
| 439 unit.lineInfo = lineInfo; | |
| 440 return unit; | |
| 441 } | |
| 442 } | |
| 443 | |
| 444 /** | 389 /** |
| 445 * Read the file content and ensure that all of the file properties are | 390 * Read the file content and ensure that all of the file properties are |
| 446 * consistent with the read content, including API signature. | 391 * consistent with the read content, including API signature. |
| 447 * | 392 * |
| 448 * Return `true` if the API signature changed since the last refresh. | 393 * Return `true` if the API signature changed since the last refresh. |
| 449 */ | 394 */ |
| 450 bool refresh() { | 395 bool refresh() { |
| 451 // Read the content. | 396 // Read the content. |
| 452 try { | 397 try { |
| 453 _content = _fsState._contentOverlay[path]; | 398 _content = _fsState._contentOverlay[path]; |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 Uri absoluteUri; | 550 Uri absoluteUri; |
| 606 try { | 551 try { |
| 607 absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri)); | 552 absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri)); |
| 608 } on FormatException { | 553 } on FormatException { |
| 609 return _fsState.unresolvedFile; | 554 return _fsState.unresolvedFile; |
| 610 } | 555 } |
| 611 | 556 |
| 612 return _fsState.getFileForUri(absoluteUri); | 557 return _fsState.getFileForUri(absoluteUri); |
| 613 } | 558 } |
| 614 | 559 |
| 560 CompilationUnit _parse(AnalysisErrorListener errorListener) { |
| 561 AnalysisOptions analysisOptions = _fsState._analysisOptions; |
| 562 |
| 563 if (USE_FASTA_PARSER) { |
| 564 try { |
| 565 fasta.ScannerResult scanResult = |
| 566 PerformanceStatistics.scan.makeCurrentWhile(() { |
| 567 return fasta.scan( |
| 568 _contentBytes, |
| 569 includeComments: true, |
| 570 scanGenericMethodComments: analysisOptions.strongMode, |
| 571 ); |
| 572 }); |
| 573 |
| 574 var astBuilder = new fasta.AstBuilder( |
| 575 new ErrorReporter(errorListener, source), |
| 576 null, |
| 577 null, |
| 578 new _FastaElementStoreProxy(), |
| 579 new fasta.Scope.top(isModifiable: true), |
| 580 true, |
| 581 uri); |
| 582 astBuilder.parseGenericMethodComments = analysisOptions.strongMode; |
| 583 |
| 584 var parser = new fasta.Parser(astBuilder); |
| 585 astBuilder.parser = parser; |
| 586 parser.parseUnit(scanResult.tokens); |
| 587 var unit = astBuilder.pop() as CompilationUnit; |
| 588 |
| 589 LineInfo lineInfo = new LineInfo(scanResult.lineStarts); |
| 590 unit.lineInfo = lineInfo; |
| 591 return unit; |
| 592 } catch (e, st) { |
| 593 print(e); |
| 594 print(st); |
| 595 rethrow; |
| 596 } |
| 597 } else { |
| 598 CharSequenceReader reader = new CharSequenceReader(content); |
| 599 Scanner scanner = new Scanner(source, reader, errorListener); |
| 600 scanner.scanGenericMethodComments = analysisOptions.strongMode; |
| 601 Token token = PerformanceStatistics.scan.makeCurrentWhile(() { |
| 602 return scanner.tokenize(); |
| 603 }); |
| 604 LineInfo lineInfo = new LineInfo(scanner.lineStarts); |
| 605 |
| 606 Parser parser = new Parser(source, errorListener); |
| 607 parser.enableAssertInitializer = analysisOptions.enableAssertInitializer; |
| 608 parser.parseGenericMethodComments = analysisOptions.strongMode; |
| 609 CompilationUnit unit = parser.parseCompilationUnit(token); |
| 610 unit.lineInfo = lineInfo; |
| 611 return unit; |
| 612 } |
| 613 } |
| 614 |
| 615 /** | 615 /** |
| 616 * Return `true` if the given byte lists are equal. | 616 * Return `true` if the given byte lists are equal. |
| 617 */ | 617 */ |
| 618 static bool _equalByteLists(List<int> a, List<int> b) { | 618 static bool _equalByteLists(List<int> a, List<int> b) { |
| 619 if (a == null) { | 619 if (a == null) { |
| 620 return b == null; | 620 return b == null; |
| 621 } else if (b == null) { | 621 } else if (b == null) { |
| 622 return false; | 622 return false; |
| 623 } | 623 } |
| 624 if (a.length != b.length) { | 624 if (a.length != b.length) { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 _FastaElementProxy operator [](fasta.Builder builder) => | 945 _FastaElementProxy operator [](fasta.Builder builder) => |
| 946 _elements.putIfAbsent(builder, () => new _FastaElementProxy()); | 946 _elements.putIfAbsent(builder, () => new _FastaElementProxy()); |
| 947 | 947 |
| 948 @override | 948 @override |
| 949 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 949 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 950 } | 950 } |
| 951 | 951 |
| 952 class _FastaInterfaceTypeProxy implements fasta.KernelInterfaceType { | 952 class _FastaInterfaceTypeProxy implements fasta.KernelInterfaceType { |
| 953 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 953 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 954 } | 954 } |
| OLD | NEW |