Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: pkg/analyzer/lib/src/dart/analysis/file_state.dart

Issue 2545753003: Compute top-level declarations in a file. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/dart/analysis/top_level_declarations.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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:convert'; 5 import 'dart:convert';
6 import 'dart:typed_data'; 6 import 'dart:typed_data';
7 7
8 import 'package:analyzer/dart/ast/ast.dart'; 8 import 'package:analyzer/dart/ast/ast.dart';
9 import 'package:analyzer/dart/ast/token.dart'; 9 import 'package:analyzer/dart/ast/token.dart';
10 import 'package:analyzer/error/listener.dart'; 10 import 'package:analyzer/error/listener.dart';
11 import 'package:analyzer/file_system/file_system.dart'; 11 import 'package:analyzer/file_system/file_system.dart';
12 import 'package:analyzer/src/dart/analysis/byte_store.dart'; 12 import 'package:analyzer/src/dart/analysis/byte_store.dart';
13 import 'package:analyzer/src/dart/analysis/driver.dart'; 13 import 'package:analyzer/src/dart/analysis/driver.dart';
14 import 'package:analyzer/src/dart/analysis/referenced_names.dart'; 14 import 'package:analyzer/src/dart/analysis/referenced_names.dart';
15 import 'package:analyzer/src/dart/analysis/top_level_declarations.dart';
15 import 'package:analyzer/src/dart/scanner/reader.dart'; 16 import 'package:analyzer/src/dart/scanner/reader.dart';
16 import 'package:analyzer/src/dart/scanner/scanner.dart'; 17 import 'package:analyzer/src/dart/scanner/scanner.dart';
17 import 'package:analyzer/src/generated/engine.dart'; 18 import 'package:analyzer/src/generated/engine.dart';
18 import 'package:analyzer/src/generated/parser.dart'; 19 import 'package:analyzer/src/generated/parser.dart';
19 import 'package:analyzer/src/generated/source.dart'; 20 import 'package:analyzer/src/generated/source.dart';
20 import 'package:analyzer/src/generated/utilities_dart.dart'; 21 import 'package:analyzer/src/generated/utilities_dart.dart';
21 import 'package:analyzer/src/source/source_resource.dart'; 22 import 'package:analyzer/src/source/source_resource.dart';
22 import 'package:analyzer/src/summary/api_signature.dart'; 23 import 'package:analyzer/src/summary/api_signature.dart';
23 import 'package:analyzer/src/summary/format.dart'; 24 import 'package:analyzer/src/summary/format.dart';
24 import 'package:analyzer/src/summary/idl.dart'; 25 import 'package:analyzer/src/summary/idl.dart';
26 import 'package:analyzer/src/summary/name_filter.dart';
25 import 'package:analyzer/src/summary/summarize_ast.dart'; 27 import 'package:analyzer/src/summary/summarize_ast.dart';
26 import 'package:analyzer/src/util/fast_uri.dart'; 28 import 'package:analyzer/src/util/fast_uri.dart';
27 import 'package:convert/convert.dart'; 29 import 'package:convert/convert.dart';
28 import 'package:crypto/crypto.dart'; 30 import 'package:crypto/crypto.dart';
29 import 'package:meta/meta.dart'; 31 import 'package:meta/meta.dart';
30 32
31 /** 33 /**
32 * [FileContentOverlay] is used to temporary override content of files. 34 * [FileContentOverlay] is used to temporary override content of files.
33 */ 35 */
34 class FileContentOverlay { 36 class FileContentOverlay {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 String _content; 88 String _content;
87 String _contentHash; 89 String _contentHash;
88 LineInfo _lineInfo; 90 LineInfo _lineInfo;
89 Set<String> _referencedNames; 91 Set<String> _referencedNames;
90 UnlinkedUnit _unlinked; 92 UnlinkedUnit _unlinked;
91 List<int> _apiSignature; 93 List<int> _apiSignature;
92 94
93 List<FileState> _importedFiles; 95 List<FileState> _importedFiles;
94 List<FileState> _exportedFiles; 96 List<FileState> _exportedFiles;
95 List<FileState> _partedFiles; 97 List<FileState> _partedFiles;
98 List<NameFilter> _exportFilters;
99
96 Set<FileState> _directReferencedFiles = new Set<FileState>(); 100 Set<FileState> _directReferencedFiles = new Set<FileState>();
97 Set<FileState> _transitiveFiles; 101 Set<FileState> _transitiveFiles;
98 String _transitiveSignature; 102 String _transitiveSignature;
99 103
104 List<TopLevelDeclaration> _topLevelDeclarations;
105
100 FileState._(this._fsState, this.path, this.uri, this.source); 106 FileState._(this._fsState, this.path, this.uri, this.source);
101 107
102 /** 108 /**
103 * The unlinked API signature of the file. 109 * The unlinked API signature of the file.
104 */ 110 */
105 List<int> get apiSignature => _apiSignature; 111 List<int> get apiSignature => _apiSignature;
106 112
107 /** 113 /**
108 * The content of the file. 114 * The content of the file.
109 */ 115 */
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 * The list of files this library file references as parts. 167 * The list of files this library file references as parts.
162 */ 168 */
163 List<FileState> get partedFiles => _partedFiles; 169 List<FileState> get partedFiles => _partedFiles;
164 170
165 /** 171 /**
166 * The external names referenced by the file. 172 * The external names referenced by the file.
167 */ 173 */
168 Set<String> get referencedNames => _referencedNames; 174 Set<String> get referencedNames => _referencedNames;
169 175
170 /** 176 /**
177 * Return top-level declarations declared in the file.
178 */
179 List<TopLevelDeclaration> get topLevelDeclarations {
180 if (_topLevelDeclarations == null) {
181 _topLevelDeclarations = <TopLevelDeclaration>[];
182 // Add types.
183 for (UnlinkedClass type in unlinked.classes) {
184 _topLevelDeclarations.add(
185 new TopLevelDeclaration(TopLevelDeclarationKind.type, type.name));
186 }
187 for (UnlinkedEnum type in unlinked.enums) {
188 _topLevelDeclarations.add(
189 new TopLevelDeclaration(TopLevelDeclarationKind.type, type.name));
190 }
191 for (UnlinkedTypedef type in unlinked.typedefs) {
192 _topLevelDeclarations.add(
193 new TopLevelDeclaration(TopLevelDeclarationKind.type, type.name));
194 }
195 // Add functions and variables.
196 Set<String> addedVariableNames = new Set<String>();
197 for (UnlinkedExecutable executable in unlinked.executables) {
198 String name = executable.name;
199 if (executable.kind == UnlinkedExecutableKind.functionOrMethod) {
200 _topLevelDeclarations.add(
201 new TopLevelDeclaration(TopLevelDeclarationKind.function, name));
202 } else if (executable.kind == UnlinkedExecutableKind.getter ||
203 executable.kind == UnlinkedExecutableKind.setter) {
204 if (executable.kind == UnlinkedExecutableKind.setter) {
205 name = name.substring(0, name.length - 1);
206 }
207 if (addedVariableNames.add(name)) {
208 _topLevelDeclarations.add(new TopLevelDeclaration(
209 TopLevelDeclarationKind.variable, name));
210 }
211 }
212 }
213 for (UnlinkedVariable variable in unlinked.variables) {
214 String name = variable.name;
215 if (addedVariableNames.add(name)) {
216 _topLevelDeclarations.add(
217 new TopLevelDeclaration(TopLevelDeclarationKind.variable, name));
218 }
219 }
220 }
221 return _topLevelDeclarations;
222 }
223
224 /**
171 * Return the set of transitive files - the file itself and all of the 225 * Return the set of transitive files - the file itself and all of the
172 * directly or indirectly referenced files. 226 * directly or indirectly referenced files.
173 */ 227 */
174 Set<FileState> get transitiveFiles { 228 Set<FileState> get transitiveFiles {
175 if (_transitiveFiles == null) { 229 if (_transitiveFiles == null) {
176 _transitiveFiles = new Set<FileState>(); 230 _transitiveFiles = new Set<FileState>();
177 231
178 void appendReferenced(FileState file) { 232 void appendReferenced(FileState file) {
179 if (_transitiveFiles.add(file)) { 233 if (_transitiveFiles.add(file)) {
180 file._directReferencedFiles.forEach(appendReferenced); 234 file._directReferencedFiles.forEach(appendReferenced);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 if (_partedFiles != null) { 371 if (_partedFiles != null) {
318 for (FileState part in _partedFiles) { 372 for (FileState part in _partedFiles) {
319 _fsState._partToLibraries[part]?.remove(this); 373 _fsState._partToLibraries[part]?.remove(this);
320 } 374 }
321 } 375 }
322 376
323 // Build the graph. 377 // Build the graph.
324 _importedFiles = <FileState>[]; 378 _importedFiles = <FileState>[];
325 _exportedFiles = <FileState>[]; 379 _exportedFiles = <FileState>[];
326 _partedFiles = <FileState>[]; 380 _partedFiles = <FileState>[];
381 _exportFilters = <NameFilter>[];
327 for (UnlinkedImport import in _unlinked.imports) { 382 for (UnlinkedImport import in _unlinked.imports) {
328 if (!import.isImplicit) { 383 if (!import.isImplicit) {
329 String uri = import.uri; 384 String uri = import.uri;
330 if (!_isDartUri(uri)) { 385 if (!_isDartUri(uri)) {
331 FileState file = _fileForRelativeUri(uri); 386 FileState file = _fileForRelativeUri(uri);
332 if (file != null) { 387 if (file != null) {
333 _importedFiles.add(file); 388 _importedFiles.add(file);
334 } 389 }
335 } 390 }
336 } 391 }
337 } 392 }
338 for (UnlinkedExportPublic export in _unlinked.publicNamespace.exports) { 393 for (UnlinkedExportPublic export in _unlinked.publicNamespace.exports) {
339 String uri = export.uri; 394 String uri = export.uri;
340 if (!_isDartUri(uri)) { 395 if (!_isDartUri(uri)) {
341 FileState file = _fileForRelativeUri(uri); 396 FileState file = _fileForRelativeUri(uri);
342 if (file != null) { 397 if (file != null) {
343 _exportedFiles.add(file); 398 _exportedFiles.add(file);
399 _exportFilters
400 .add(new NameFilter.forUnlinkedCombinators(export.combinators));
344 } 401 }
345 } 402 }
346 } 403 }
347 for (String uri in _unlinked.publicNamespace.parts) { 404 for (String uri in _unlinked.publicNamespace.parts) {
348 if (!_isDartUri(uri)) { 405 if (!_isDartUri(uri)) {
349 FileState file = _fileForRelativeUri(uri); 406 FileState file = _fileForRelativeUri(uri);
350 if (file != null) { 407 if (file != null) {
351 _partedFiles.add(file); 408 _partedFiles.add(file);
352 // TODO(scheglov) Sort for stable results? 409 // TODO(scheglov) Sort for stable results?
353 _fsState._partToLibraries 410 _fsState._partToLibraries
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 .where((f) => f._transitiveFiles == null) 612 .where((f) => f._transitiveFiles == null)
556 .toSet(); 613 .toSet();
557 } 614 }
558 615
559 Set<FileState> get filesWithoutTransitiveSignature { 616 Set<FileState> get filesWithoutTransitiveSignature {
560 return state._uriToFile.values 617 return state._uriToFile.values
561 .where((f) => f._transitiveSignature == null) 618 .where((f) => f._transitiveSignature == null)
562 .toSet(); 619 .toSet();
563 } 620 }
564 } 621 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/dart/analysis/top_level_declarations.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698