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

Commit e81eabb

Browse files
authored
feat: add byte store to improve performance (#428)
* feat: add bytestore to improve performance * chore: fix analyzer errors * chore: fix analyzer errors * chore: update changelog * chore: rename function
1 parent f6739aa commit e81eabb

File tree

4 files changed

+48
-14
lines changed

4 files changed

+48
-14
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+
## Unpublished
4+
5+
* Improve cli performance.
6+
37
## 4.2.0-dev.3
48

59
* Changed the supported `analyzer` version to `^2.1.0`.

lib/src/analyzers/lint_analyzer/lint_analyzer.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import 'dart:io';
22
import 'dart:math';
33

4-
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
54
import 'package:analyzer/dart/analysis/results.dart';
65
import 'package:analyzer/dart/ast/ast.dart';
7-
import 'package:analyzer/file_system/physical_file_system.dart';
86
import 'package:path/path.dart';
97

108
import '../../config_builder/config_builder.dart';
119
import '../../config_builder/models/analysis_options.dart';
1210
import '../../reporters/models/reporter.dart';
11+
import '../../utils/analyzer_utils.dart';
1312
import '../../utils/exclude_utils.dart';
1413
import '../../utils/file_utils.dart';
1514
import '../../utils/node_utils.dart';
@@ -73,11 +72,7 @@ class LintAnalyzer {
7372
String rootFolder,
7473
LintConfig config,
7574
) async {
76-
final collection = AnalysisContextCollection(
77-
includedPaths:
78-
folders.map((path) => normalize(join(rootFolder, path))).toList(),
79-
resourceProvider: PhysicalResourceProvider.INSTANCE,
80-
);
75+
final collection = createAnalysisContextCollection(folders, rootFolder);
8176

8277
final analyzerResult = <LintFileReport>[];
8378

lib/src/analyzers/unused_files_analyzer/unused_files_analyzer.dart

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

3-
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
43
import 'package:analyzer/dart/analysis/results.dart';
54
import 'package:analyzer/dart/analysis/utilities.dart';
6-
import 'package:analyzer/file_system/physical_file_system.dart';
75
import 'package:path/path.dart';
86

97
import '../../config_builder/config_builder.dart';
108
import '../../config_builder/models/analysis_options.dart';
119
import '../../reporters/models/reporter.dart';
10+
import '../../utils/analyzer_utils.dart';
1211
import '../../utils/file_utils.dart';
1312
import 'models/unused_files_file_report.dart';
1413
import 'reporters/reporter_factory.dart';
@@ -32,11 +31,7 @@ class UnusedFilesAnalyzer {
3231
String rootFolder,
3332
UnusedFilesConfig config,
3433
) async {
35-
final collection = AnalysisContextCollection(
36-
includedPaths:
37-
folders.map((path) => normalize(join(rootFolder, path))).toList(),
38-
resourceProvider: PhysicalResourceProvider.INSTANCE,
39-
);
34+
final collection = createAnalysisContextCollection(folders, rootFolder);
4035

4136
final unusedFiles = <String>{};
4237

lib/src/utils/analyzer_utils.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// ignore_for_file: implementation_imports
2+
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
3+
import 'package:analyzer/file_system/physical_file_system.dart';
4+
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
5+
import 'package:analyzer/src/dart/analysis/byte_store.dart';
6+
import 'package:analyzer/src/dart/analysis/file_byte_store.dart';
7+
import 'package:path/path.dart';
8+
9+
AnalysisContextCollection createAnalysisContextCollection(
10+
Iterable<String> folders,
11+
String rootFolder,
12+
) {
13+
final resourceProvider = PhysicalResourceProvider.INSTANCE;
14+
15+
return AnalysisContextCollectionImpl(
16+
includedPaths:
17+
folders.map((path) => normalize(join(rootFolder, path))).toList(),
18+
resourceProvider: resourceProvider,
19+
byteStore: _createByteStore(resourceProvider),
20+
);
21+
}
22+
23+
/// If the state location can be accessed, return the file byte store,
24+
/// otherwise return the memory byte store.
25+
ByteStore _createByteStore(PhysicalResourceProvider resourceProvider) {
26+
const M = 1024 * 1024 /*1 MiB*/;
27+
const G = 1024 * 1024 * 1024 /*1 GiB*/;
28+
29+
const memoryCacheSize = M * 128;
30+
31+
final stateLocation = resourceProvider.getStateLocation('.dart-code-metrics');
32+
if (stateLocation != null) {
33+
return MemoryCachingByteStore(
34+
EvictingFileByteStore(stateLocation.path, G),
35+
memoryCacheSize,
36+
);
37+
}
38+
39+
return MemoryCachingByteStore(NullByteStore(), memoryCacheSize);
40+
}

0 commit comments

Comments
 (0)