| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 | 6 |
| 7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; | 8 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; |
| 9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/element/element.dart'; |
| 10 import 'package:analyzer/file_system/physical_file_system.dart'; | 10 import 'package:analyzer/file_system/physical_file_system.dart'; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 @reflectiveTest | 37 @reflectiveTest |
| 38 class IncrementalResolvedAstGeneratorTest { | 38 class IncrementalResolvedAstGeneratorTest { |
| 39 static final sdkSummaryUri = Uri.parse('special:sdk_summary'); | 39 static final sdkSummaryUri = Uri.parse('special:sdk_summary'); |
| 40 | 40 |
| 41 /// Virtual filesystem for testing. | 41 /// Virtual filesystem for testing. |
| 42 final fileSystem = new MemoryFileSystem(pathos.posix, Uri.parse('file:///')); | 42 final fileSystem = new MemoryFileSystem(pathos.posix, Uri.parse('file:///')); |
| 43 | 43 |
| 44 /// The object under test. | 44 /// The object under test. |
| 45 IncrementalResolvedAstGenerator incrementalResolvedAstGenerator; | 45 IncrementalResolvedAstGenerator incrementalResolvedAstGenerator; |
| 46 | 46 |
| 47 Future<Map<Uri, ResolvedLibrary>> getInitialProgram(Uri startingUri) async { | 47 Future<Map<Uri, Map<Uri, CompilationUnit>>> getInitialProgram( |
| 48 Uri startingUri) async { |
| 48 fileSystem.entityForUri(sdkSummaryUri).writeAsBytesSync(_sdkSummary); | 49 fileSystem.entityForUri(sdkSummaryUri).writeAsBytesSync(_sdkSummary); |
| 49 incrementalResolvedAstGenerator = new IncrementalResolvedAstGenerator( | 50 incrementalResolvedAstGenerator = new IncrementalResolvedAstGenerator( |
| 50 startingUri, | 51 startingUri, |
| 51 new CompilerOptions() | 52 new CompilerOptions() |
| 52 ..fileSystem = fileSystem | 53 ..fileSystem = fileSystem |
| 53 ..chaseDependencies = true | 54 ..chaseDependencies = true |
| 54 ..sdkSummary = sdkSummaryUri | 55 ..sdkSummary = sdkSummaryUri |
| 55 ..packagesFileUri = new Uri()); | 56 ..packagesFileUri = new Uri()); |
| 56 return (await incrementalResolvedAstGenerator.computeDelta()).newState; | 57 return (await incrementalResolvedAstGenerator.computeDelta()).newState; |
| 57 } | 58 } |
| 58 | 59 |
| 59 test_incrementalUpdate_referenceToCore() async { | 60 test_incrementalUpdate_referenceToCore() async { |
| 60 writeFiles({'/foo.dart': 'main() { print(1); }'}); | 61 writeFiles({'/foo.dart': 'main() { print(1); }'}); |
| 61 var fooUri = Uri.parse('file:///foo.dart'); | 62 var fooUri = Uri.parse('file:///foo.dart'); |
| 62 var initialProgram = await getInitialProgram(fooUri); | 63 var initialProgram = await getInitialProgram(fooUri); |
| 63 expect(initialProgram.keys, unorderedEquals([fooUri])); | 64 expect(initialProgram.keys, unorderedEquals([fooUri])); |
| 64 | 65 |
| 65 void _checkMain(CompilationUnit unit, int expectedArgument) { | 66 void _checkMain(CompilationUnit unit, int expectedArgument) { |
| 66 var mainStatements = _getFunctionStatements(_getFunction(unit, 'main')); | 67 var mainStatements = _getFunctionStatements(_getFunction(unit, 'main')); |
| 67 expect(mainStatements, hasLength(1)); | 68 expect(mainStatements, hasLength(1)); |
| 68 _checkPrintLiteralInt(mainStatements[0], expectedArgument); | 69 _checkPrintLiteralInt(mainStatements[0], expectedArgument); |
| 69 } | 70 } |
| 70 | 71 |
| 71 _checkMain(initialProgram[fooUri].definingCompilationUnit, 1); | 72 _checkMain(initialProgram[fooUri][fooUri], 1); |
| 72 writeFiles({'/foo.dart': 'main() { print(2); }'}); | 73 writeFiles({'/foo.dart': 'main() { print(2); }'}); |
| 73 // Verify that the file isn't actually reread until invalidate is called. | 74 // Verify that the file isn't actually reread until invalidate is called. |
| 74 var deltaProgram1 = await incrementalResolvedAstGenerator.computeDelta(); | 75 var deltaProgram1 = await incrementalResolvedAstGenerator.computeDelta(); |
| 75 // TODO(paulberry): since there is no delta, computeDelta should return an | 76 // TODO(paulberry): since there is no delta, computeDelta should return an |
| 76 // empty map. | 77 // empty map. |
| 77 // expect(deltaProgram1.newState, isEmpty); | 78 // expect(deltaProgram1.newState, isEmpty); |
| 78 expect(deltaProgram1.newState.keys, unorderedEquals([fooUri])); | 79 expect(deltaProgram1.newState.keys, unorderedEquals([fooUri])); |
| 79 _checkMain(deltaProgram1.newState[fooUri].definingCompilationUnit, 1); | 80 _checkMain(deltaProgram1.newState[fooUri][fooUri], 1); |
| 80 incrementalResolvedAstGenerator.invalidateAll(); | 81 incrementalResolvedAstGenerator.invalidateAll(); |
| 81 var deltaProgram2 = await incrementalResolvedAstGenerator.computeDelta(); | 82 var deltaProgram2 = await incrementalResolvedAstGenerator.computeDelta(); |
| 82 expect(deltaProgram2.newState.keys, unorderedEquals([fooUri])); | 83 expect(deltaProgram2.newState.keys, unorderedEquals([fooUri])); |
| 83 _checkMain(deltaProgram2.newState[fooUri].definingCompilationUnit, 2); | 84 _checkMain(deltaProgram2.newState[fooUri][fooUri], 2); |
| 84 } | 85 } |
| 85 | 86 |
| 86 test_invalidateAllBeforeInitialProgram() async { | 87 test_invalidateAllBeforeInitialProgram() async { |
| 87 incrementalResolvedAstGenerator = new IncrementalResolvedAstGenerator( | 88 incrementalResolvedAstGenerator = new IncrementalResolvedAstGenerator( |
| 88 Uri.parse('file:///foo.dart'), | 89 Uri.parse('file:///foo.dart'), |
| 89 new CompilerOptions() | 90 new CompilerOptions() |
| 90 ..fileSystem = fileSystem | 91 ..fileSystem = fileSystem |
| 91 ..chaseDependencies = true | 92 ..chaseDependencies = true |
| 92 ..packagesFileUri = new Uri()); | 93 ..packagesFileUri = new Uri()); |
| 93 incrementalResolvedAstGenerator.invalidateAll(); | 94 incrementalResolvedAstGenerator.invalidateAll(); |
| 94 } | 95 } |
| 95 | 96 |
| 96 test_part() async { | 97 test_part() async { |
| 97 writeFiles({ | 98 writeFiles({ |
| 98 '/foo.dart': 'library foo; part "bar.dart"; main() { print(1); f(); }', | 99 '/foo.dart': 'library foo; part "bar.dart"; main() { print(1); f(); }', |
| 99 '/bar.dart': 'part of foo; f() { print(2); }' | 100 '/bar.dart': 'part of foo; f() { print(2); }' |
| 100 }); | 101 }); |
| 101 var fooUri = Uri.parse('file:///foo.dart'); | 102 var fooUri = Uri.parse('file:///foo.dart'); |
| 102 var barUri = Uri.parse('file:///bar.dart'); | 103 var barUri = Uri.parse('file:///bar.dart'); |
| 103 var initialProgram = await getInitialProgram(fooUri); | 104 var initialProgram = await getInitialProgram(fooUri); |
| 104 expect(initialProgram.keys, unorderedEquals([fooUri])); | 105 expect(initialProgram.keys, unorderedEquals([fooUri])); |
| 105 expect(initialProgram[fooUri].partUnits.keys, unorderedEquals([barUri])); | 106 expect(initialProgram[fooUri].keys, unorderedEquals([fooUri, barUri])); |
| 106 var mainStatements = _getFunctionStatements( | 107 var mainStatements = _getFunctionStatements( |
| 107 _getFunction(initialProgram[fooUri].definingCompilationUnit, 'main')); | 108 _getFunction(initialProgram[fooUri][fooUri], 'main')); |
| 108 var fDeclaration = | 109 var fDeclaration = _getFunction(initialProgram[fooUri][barUri], 'f'); |
| 109 _getFunction(initialProgram[fooUri].partUnits[barUri], 'f'); | |
| 110 var fStatements = _getFunctionStatements(fDeclaration); | 110 var fStatements = _getFunctionStatements(fDeclaration); |
| 111 expect(mainStatements, hasLength(2)); | 111 expect(mainStatements, hasLength(2)); |
| 112 _checkPrintLiteralInt(mainStatements[0], 1); | 112 _checkPrintLiteralInt(mainStatements[0], 1); |
| 113 _checkFunctionCall(mainStatements[1], | 113 _checkFunctionCall(mainStatements[1], |
| 114 resolutionMap.elementDeclaredByFunctionDeclaration(fDeclaration)); | 114 resolutionMap.elementDeclaredByFunctionDeclaration(fDeclaration)); |
| 115 expect(fStatements, hasLength(1)); | 115 expect(fStatements, hasLength(1)); |
| 116 _checkPrintLiteralInt(fStatements[0], 2); | 116 _checkPrintLiteralInt(fStatements[0], 2); |
| 117 // TODO(paulberry): now test incremental updates | 117 // TODO(paulberry): now test incremental updates |
| 118 } | 118 } |
| 119 | 119 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 } | 164 } |
| 165 throw fail('No function declaration found with name "$name"'); | 165 throw fail('No function declaration found with name "$name"'); |
| 166 } | 166 } |
| 167 | 167 |
| 168 NodeList<Statement> _getFunctionStatements(FunctionDeclaration function) { | 168 NodeList<Statement> _getFunctionStatements(FunctionDeclaration function) { |
| 169 var body = function.functionExpression.body; | 169 var body = function.functionExpression.body; |
| 170 expect(body, new isInstanceOf<BlockFunctionBody>()); | 170 expect(body, new isInstanceOf<BlockFunctionBody>()); |
| 171 return (body as BlockFunctionBody).block.statements; | 171 return (body as BlockFunctionBody).block.statements; |
| 172 } | 172 } |
| 173 } | 173 } |
| OLD | NEW |