Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 260ea4b

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Add an option to use one-phase summaries.
When this flag is enabled, we fail: 2 language_2/ tests; 25 Analyzer tests (mostly by 2 reasons); 0 Analysis Server tests. There is a know problem: because unlinked summaries don't include initializers for variables, we fail to recognize API changes related to inferred types. I will fix this be computing API signatures from pertinent tokens. [email protected], [email protected] Change-Id: I61734e96ee26b3e04027a103ccf6850695815127 Reviewed-on: https://dart-review.googlesource.com/74700 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 7c5b3dc commit 260ea4b

File tree

4 files changed

+63
-15
lines changed

4 files changed

+63
-15
lines changed

pkg/analyzer/lib/src/dart/analysis/file_state.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:analyzer/dart/ast/token.dart';
1111
import 'package:analyzer/error/listener.dart';
1212
import 'package:analyzer/file_system/file_system.dart';
1313
import 'package:analyzer/src/dart/analysis/defined_names.dart';
14+
import 'package:analyzer/src/dart/analysis/one_phase_summaries_selector.dart';
1415
import 'package:analyzer/src/dart/analysis/referenced_names.dart';
1516
import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
1617
import 'package:analyzer/src/dart/scanner/reader.dart';
@@ -386,7 +387,8 @@ class FileState {
386387
*
387388
* If an exception happens during parsing, an empty unit is returned.
388389
*/
389-
CompilationUnit parse(AnalysisErrorListener errorListener) {
390+
CompilationUnit parse([AnalysisErrorListener errorListener]) {
391+
errorListener ??= AnalysisErrorListener.NULL_LISTENER;
390392
try {
391393
return PerformanceStatistics.parse.makeCurrentWhile(() {
392394
return _parse(errorListener);
@@ -430,9 +432,10 @@ class FileState {
430432
{
431433
bytes = _fsState._byteStore.get(_unlinkedKey);
432434
if (bytes == null || bytes.isEmpty) {
433-
CompilationUnit unit = parse(AnalysisErrorListener.NULL_LISTENER);
435+
CompilationUnit unit = parse();
434436
_fsState._logger.run('Create unlinked for $path', () {
435-
UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
437+
UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit,
438+
serializeInferrableFields: !enableOnePhaseSummaries);
436439
DefinedNames definedNames = computeDefinedNames(unit);
437440
List<String> referencedNames = computeReferencedNames(unit).toList();
438441
List<String> subtypedNames = computeSubtypedNames(unit).toList();

pkg/analyzer/lib/src/dart/analysis/library_context.dart

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/analysis/declared_variables.dart';
6+
import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
67
import 'package:analyzer/dart/element/element.dart'
78
show CompilationUnitElement, LibraryElement;
89
import 'package:analyzer/src/context/context.dart';
910
import 'package:analyzer/src/dart/analysis/driver.dart';
1011
import 'package:analyzer/src/dart/analysis/file_state.dart';
12+
import 'package:analyzer/src/dart/analysis/one_phase_summaries_selector.dart';
1113
import 'package:analyzer/src/dart/element/element.dart';
1214
import 'package:analyzer/src/dart/element/handle.dart';
1315
import 'package:analyzer/src/generated/engine.dart'
@@ -16,7 +18,9 @@ import 'package:analyzer/src/generated/source.dart';
1618
import 'package:analyzer/src/summary/format.dart';
1719
import 'package:analyzer/src/summary/idl.dart';
1820
import 'package:analyzer/src/summary/link.dart';
21+
import 'package:analyzer/src/summary/one_phase.dart';
1922
import 'package:analyzer/src/summary/package_bundle_reader.dart';
23+
import 'package:analyzer/src/summary/summarize_elements.dart';
2024
import 'package:front_end/src/api_prototype/byte_store.dart';
2125
import 'package:front_end/src/base/performance_logger.dart';
2226

@@ -93,7 +97,8 @@ class LibraryContext {
9397
appendLibraryFiles(targetLibrary);
9498
});
9599

96-
Set<String> libraryUrisToLink = new Set<String>();
100+
var libraryUrisToLink = new Set<String>();
101+
var libraryFilesToLink = new Set<FileState>();
97102
logger.run('Load linked bundles', () {
98103
for (FileState library in libraries.values) {
99104
if (library.exists || library == targetLibrary) {
@@ -104,6 +109,7 @@ class LibraryContext {
104109
store.addLinkedLibrary(library.uriStr, linked);
105110
} else {
106111
libraryUrisToLink.add(library.uriStr);
112+
libraryFilesToLink.add(library);
107113
}
108114
}
109115
}
@@ -112,16 +118,47 @@ class LibraryContext {
112118
});
113119

114120
Map<String, LinkedLibraryBuilder> linkedLibraries = {};
115-
logger.run('Link bundles', () {
116-
linkedLibraries = link(libraryUrisToLink, (String uri) {
117-
LinkedLibrary linkedLibrary = store.linkedMap[uri];
118-
return linkedLibrary;
119-
}, (String uri) {
120-
UnlinkedUnit unlinkedUnit = store.unlinkedMap[uri];
121-
return unlinkedUnit;
122-
}, (_) => null);
123-
logger.writeln('Linked ${linkedLibraries.length} bundles.');
124-
});
121+
if (enableOnePhaseSummaries) {
122+
var uriToUnit = <String, CompilationUnit>{};
123+
logger.run('Parse files', () {
124+
for (var library in libraryFilesToLink) {
125+
for (var file in library.libraryFiles) {
126+
uriToUnit[file.uriStr] = file.parse();
127+
}
128+
}
129+
logger.writeln('Parsed ${uriToUnit.length} files.');
130+
});
131+
132+
logger.run('Link libraries', () {
133+
var assembler = new PackageBundleAssembler();
134+
summarize(uriToUnit, store, assembler, (_) => null, true);
135+
136+
var bundle = assembler.assemble();
137+
for (int i = 0; i < bundle.linkedLibraryUris.length; i++) {
138+
var uri = bundle.linkedLibraryUris[i];
139+
140+
// TODO(scheglov) At the moment we might get parts here.
141+
if (!libraries.containsKey(uri)) {
142+
continue;
143+
}
144+
145+
linkedLibraries[uri] = bundle.linkedLibraries[i];
146+
}
147+
148+
logger.writeln('Linked ${linkedLibraries.length} libraries.');
149+
});
150+
} else {
151+
logger.run('Link libraries', () {
152+
linkedLibraries = link(libraryUrisToLink, (String uri) {
153+
LinkedLibrary linkedLibrary = store.linkedMap[uri];
154+
return linkedLibrary;
155+
}, (String uri) {
156+
UnlinkedUnit unlinkedUnit = store.unlinkedMap[uri];
157+
return unlinkedUnit;
158+
}, (_) => null);
159+
logger.writeln('Linked ${linkedLibraries.length} libraries.');
160+
});
161+
}
125162

126163
for (String uri in linkedLibraries.keys) {
127164
LinkedLibraryBuilder linkedBuilder = linkedLibraries[uri];
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
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.
4+
5+
/// A flag indicating whether analysis driver should work using one-phase,
6+
/// unresolved AST based summaries, or using old unlinked / link process.
7+
const bool enableOnePhaseSummaries =
8+
const bool.fromEnvironment('enableOnePhaseSummaries', defaultValue: false);

pkg/analyzer/test/src/dart/analysis/driver_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ var A2 = B1;
909909
// Notify the driver about the change.
910910
driver.changeFile(testFile);
911911

912-
// The file was added, so it is scheduled for analysis.
912+
// The file was changed, so it is scheduled for analysis.
913913
expect(driver.test.fileTracker.isFilePending(testFile), isTrue);
914914

915915
// We get a new result.

0 commit comments

Comments
 (0)