Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

Commit cfcd783

Browse files
authored
fix: use empty analysis options exclude to properly resolve units and speed up commands analysis (#998)
* fix: use empty analysis options exclude to properly resolve units and speed up commands analysis * fix: correctly calculate included paths
1 parent fd75f58 commit cfcd783

File tree

10 files changed

+40
-70
lines changed

10 files changed

+40
-70
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
* fix: use empty analysis options exclude to properly resolve units and speed up commands analysis.
6+
37
## 4.18.1
48

59
* fix: fix regression in is! checks for [`avoid-unnecessary-type-assertions`](https://dartcodemetrics.dev/docs/rules/common/avoid-unnecessary-type-assertions).

lib/src/analyzers/unnecessary_nullable_analyzer/unnecessary_nullable_analyzer.dart

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'dart:io';
44

55
import 'package:analyzer/dart/analysis/analysis_context.dart';
66
import 'package:analyzer/dart/analysis/results.dart';
7-
import 'package:analyzer/dart/analysis/utilities.dart';
87
import 'package:analyzer/dart/ast/ast.dart';
98
import 'package:analyzer/dart/element/element.dart';
109
import 'package:analyzer/dart/element/nullability_suffix.dart';
@@ -84,19 +83,9 @@ class UnnecessaryNullableAnalyzer {
8483
invocationsUsages.merge(invocationsUsage);
8584
}
8685

87-
declarationsUsages[filePath] = _analyzeDeclarationsUsage(unit);
88-
}
89-
90-
final notAnalyzedFiles = filePaths.difference(analyzedFiles);
91-
for (final filePath in notAnalyzedFiles) {
92-
if (unnecessaryNullableAnalysisConfig.analyzerExcludedPatterns
86+
if (!unnecessaryNullableAnalysisConfig.analyzerExcludedPatterns
9387
.any((pattern) => pattern.matches(filePath))) {
94-
final unit = await resolveFile2(path: filePath);
95-
96-
final invocationsUsage = _analyzeInvocationsUsage(unit);
97-
if (invocationsUsage != null) {
98-
invocationsUsages.merge(invocationsUsage);
99-
}
88+
declarationsUsages[filePath] = _analyzeDeclarationsUsage(unit);
10089
}
10190
}
10291
}

lib/src/analyzers/unused_code_analyzer/unused_code_analyzer.dart

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:io';
22

33
import 'package:analyzer/dart/analysis/analysis_context.dart';
44
import 'package:analyzer/dart/analysis/results.dart';
5-
import 'package:analyzer/dart/analysis/utilities.dart';
65
import 'package:analyzer/dart/element/element.dart';
76
// ignore: implementation_imports
87
import 'package:analyzer/src/dart/element/element.dart';
@@ -77,19 +76,9 @@ class UnusedCodeAnalyzer {
7776
codeUsages.merge(codeUsage);
7877
}
7978

80-
publicCode[filePath] = _analyzeFilePublicCode(unit);
81-
}
82-
83-
final notAnalyzedFiles = filePaths.difference(analyzedFiles);
84-
for (final filePath in notAnalyzedFiles) {
85-
if (unusedCodeAnalysisConfig.analyzerExcludedPatterns
79+
if (!unusedCodeAnalysisConfig.analyzerExcludedPatterns
8680
.any((pattern) => pattern.matches(filePath))) {
87-
final unit = await resolveFile2(path: filePath);
88-
89-
final codeUsage = _analyzeFileCodeUsages(unit);
90-
if (codeUsage != null) {
91-
codeUsages.merge(codeUsage);
92-
}
81+
publicCode[filePath] = _analyzeFilePublicCode(unit);
9382
}
9483
}
9584
}

lib/src/analyzers/unused_files_analyzer/unused_files_analysis_config.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ import 'package:glob/glob.dart';
33
/// Represents converted unused files config which contains parsed entities.
44
class UnusedFilesAnalysisConfig {
55
final Iterable<Glob> globalExcludes;
6-
final Iterable<Glob> analyzerExcludedPatterns;
76

8-
const UnusedFilesAnalysisConfig(
9-
this.globalExcludes,
10-
this.analyzerExcludedPatterns,
11-
);
7+
const UnusedFilesAnalysisConfig(this.globalExcludes);
128
}

lib/src/analyzers/unused_files_analyzer/unused_files_analyzer.dart

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:io';
22

33
import 'package:analyzer/dart/analysis/analysis_context.dart';
44
import 'package:analyzer/dart/analysis/results.dart';
5-
import 'package:analyzer/dart/analysis/utilities.dart';
65
import 'package:path/path.dart';
76

87
import '../../config_builder/config_builder.dart';
@@ -67,16 +66,6 @@ class UnusedFilesAnalyzer {
6766
final unit = await context.currentSession.getResolvedUnit(filePath);
6867
unusedFiles.removeAll(_analyzeFile(filePath, unit, config.isMonorepo));
6968
}
70-
71-
final notAnalyzedFiles = filePaths.difference(analyzedFiles);
72-
for (final filePath in notAnalyzedFiles) {
73-
if (unusedFilesAnalysisConfig.analyzerExcludedPatterns
74-
.any((pattern) => pattern.matches(filePath))) {
75-
final unit = await resolveFile2(path: filePath);
76-
unusedFiles
77-
.removeAll(_analyzeFile(filePath, unit, config.isMonorepo));
78-
}
79-
}
8069
}
8170

8271
return unusedFiles.map((path) {

lib/src/analyzers/unused_l10n_analyzer/unused_l10n_analysis_config.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ import 'package:glob/glob.dart';
44
/// which contains parsed entities.
55
class UnusedL10nAnalysisConfig {
66
final Iterable<Glob> globalExcludes;
7-
final Iterable<Glob> analyzerExcludedPatterns;
87
final RegExp classPattern;
98

109
UnusedL10nAnalysisConfig(
1110
this.globalExcludes,
12-
this.analyzerExcludedPatterns,
1311
String? classPattern,
1412
) : classPattern = RegExp(classPattern ?? r'I18n$');
1513
}

lib/src/analyzers/unused_l10n_analyzer/unused_l10n_analyzer.dart

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'dart:io';
44

55
import 'package:analyzer/dart/analysis/analysis_context.dart';
66
import 'package:analyzer/dart/analysis/results.dart';
7-
import 'package:analyzer/dart/analysis/utilities.dart';
87
import 'package:analyzer/dart/element/element.dart';
98
import 'package:analyzer/dart/element/type.dart';
109
// ignore: implementation_imports
@@ -79,24 +78,6 @@ class UnusedL10nAnalyzer {
7978
);
8079
});
8180
}
82-
83-
final notAnalyzedFiles = filePaths.difference(analyzedFiles);
84-
85-
for (final filePath in notAnalyzedFiles) {
86-
if (unusedLocalizationAnalysisConfig.analyzerExcludedPatterns
87-
.any((pattern) => pattern.matches(filePath))) {
88-
final unit = await resolveFile2(path: filePath);
89-
90-
_analyzeFile(unit, unusedLocalizationAnalysisConfig.classPattern)
91-
.forEach((classElement, usages) {
92-
localizationUsages.update(
93-
classElement,
94-
(value) => value..addAll(usages),
95-
ifAbsent: () => usages,
96-
);
97-
});
98-
}
99-
}
10081
}
10182

10283
return _checkUnusedL10n(localizationUsages, rootFolder);

lib/src/config_builder/config_builder.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ class ConfigBuilder {
9090
) =>
9191
UnusedFilesAnalysisConfig(
9292
prepareExcludes(config.excludePatterns, rootPath),
93-
prepareExcludes(config.analyzerExcludePatterns, rootPath),
9493
);
9594

9695
/// Creates a raw unused code config from given [excludePatterns].
@@ -136,7 +135,6 @@ class ConfigBuilder {
136135
) =>
137136
UnusedL10nAnalysisConfig(
138137
prepareExcludes(config.excludePatterns, rootPath),
139-
prepareExcludes(config.analyzerExcludePatterns, rootPath),
140138
config.classPattern,
141139
);
142140

lib/src/utils/analyzer_utils.dart

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import 'dart:io';
33

44
import 'package:analyzer/dart/analysis/analysis_context.dart';
55
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
6+
import 'package:analyzer/dart/analysis/context_locator.dart';
7+
import 'package:analyzer/file_system/file_system.dart' hide File;
8+
import 'package:analyzer/file_system/overlay_file_system.dart';
69
import 'package:analyzer/file_system/physical_file_system.dart';
710
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
811
import 'package:analyzer/src/dart/analysis/byte_store.dart';
@@ -18,12 +21,13 @@ AnalysisContextCollection createAnalysisContextCollection(
1821
String rootFolder,
1922
String? sdkPath,
2023
) {
21-
final resourceProvider = PhysicalResourceProvider.INSTANCE;
24+
final includedPaths =
25+
folders.map((path) => normalize(join(rootFolder, path))).toList();
26+
final resourceProvider = _prepareAnalysisOptions(includedPaths);
2227

2328
return AnalysisContextCollectionImpl(
2429
sdkPath: sdkPath,
25-
includedPaths:
26-
folders.map((path) => normalize(join(rootFolder, path))).toList(),
30+
includedPaths: includedPaths,
2731
resourceProvider: resourceProvider,
2832
byteStore: createByteStore(resourceProvider),
2933
);
@@ -48,7 +52,7 @@ Set<String> getFilePaths(
4852

4953
/// If the state location can be accessed, return the file byte store,
5054
/// otherwise return the memory byte store.
51-
ByteStore createByteStore(PhysicalResourceProvider resourceProvider) {
55+
ByteStore createByteStore(ResourceProvider resourceProvider) {
5256
const miB = 1024 * 1024 /*1 MiB*/;
5357
const giB = 1024 * 1024 * 1024 /*1 GiB*/;
5458

@@ -86,3 +90,25 @@ Set<String> _extractDartFilesFromFolders(
8690
))
8791
.map((entity) => normalize(entity.path)))
8892
.toSet();
93+
94+
ResourceProvider _prepareAnalysisOptions(List<String> includedPaths) {
95+
final resourceProvider =
96+
OverlayResourceProvider(PhysicalResourceProvider.INSTANCE);
97+
98+
final contextLocator = ContextLocator(resourceProvider: resourceProvider);
99+
final roots = contextLocator
100+
.locateRoots(includedPaths: includedPaths, excludedPaths: []);
101+
102+
for (final root in roots) {
103+
final path = root.optionsFile?.path;
104+
if (path != null) {
105+
resourceProvider.setOverlay(
106+
path,
107+
content: '',
108+
modificationStamp: DateTime.now().millisecondsSinceEpoch,
109+
);
110+
}
111+
}
112+
113+
return resourceProvider;
114+
}

test/src/analyzers/unused_code_analyzer/unused_code_analyzer_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void main() {
3535
);
3636
});
3737

38-
test('should report 3 files and not report excluded file', () {
38+
test('should report 4 files and not report excluded file', () {
3939
expect(result, hasLength(4));
4040
});
4141

0 commit comments

Comments
 (0)