Skip to content

Commit 714314a

Browse files
authored
Refactor SDK index construction: removing mutable state. (#8761)
1 parent 77dd7c3 commit 714314a

7 files changed

+148
-153
lines changed

app/lib/search/dart_sdk_mem_index.dart

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'package:gcloud/service_scope.dart' as ss;
66
import 'package:logging/logging.dart';
7-
import 'package:meta/meta.dart';
87

98
import 'backend.dart';
109
import 'sdk_mem_index.dart';
@@ -14,7 +13,6 @@ final _logger = Logger('search.dart_sdk_mem_index');
1413
/// Results from these libraries are ranked with lower score and
1514
/// will be displayed only if the query has the library name, or
1615
/// there are not other results that could match the query.
17-
@visibleForTesting
1816
const dartSdkLibraryWeights = <String, double>{
1917
'dart:html': 0.7,
2018
};
@@ -37,14 +35,9 @@ SdkMemIndex? get dartSdkMemIndex =>
3735
/// was an error parsing the file or building the index.
3836
Future<SdkMemIndex?> createDartSdkMemIndex() async {
3937
try {
40-
final index = await SdkMemIndex.dart();
41-
final content = await loadOrFetchSdkIndexJsonAsString(index.indexJsonUri);
42-
await index.addDartdocIndex(DartdocIndex.parseJsonText(content));
43-
index.updateWeights(
44-
libraryWeights: dartSdkLibraryWeights,
45-
apiPageDirWeights: {},
46-
);
47-
return index;
38+
final content =
39+
await loadOrFetchSdkIndexJsonAsString(SdkMemIndex.dartSdkIndexJsonUri);
40+
return SdkMemIndex.dart(index: DartdocIndex.parseJsonText(content));
4841
} catch (e, st) {
4942
_logger.warning('Unable to load Dart SDK index.', e, st);
5043
return null;

app/lib/search/flutter_sdk_mem_index.dart

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import 'sdk_mem_index.dart';
1212
/// regular packages. The selected libraries are unique to the index.json.
1313
///
1414
/// TODO: try to find a way to derive this list automatically.
15-
const _allowedLibraries = <String>{
15+
const flutterSdkAllowedLibraries = <String>{
1616
'dart:ui',
1717
'animation',
1818
'cupertino',
@@ -32,7 +32,7 @@ const _allowedLibraries = <String>{
3232
'flutter_web_plugins',
3333
};
3434

35-
const _flutterApiPageDirWeights = <String, double>{
35+
const flutterApiPageDirWeights = <String, double>{
3636
'cupertino/CupertinoIcons': 0.25,
3737
'material/Icons': 0.25,
3838
};
@@ -54,14 +54,10 @@ SdkMemIndex? get flutterSdkMemIndex =>
5454
/// api.flutter.dev and returns search results based on [SdkMemIndex].
5555
Future<SdkMemIndex?> createFlutterSdkMemIndex() async {
5656
try {
57-
final index = SdkMemIndex.flutter();
58-
final content = await loadOrFetchSdkIndexJsonAsString(index.indexJsonUri);
59-
await index.addDartdocIndex(DartdocIndex.parseJsonText(content),
60-
allowedLibraries: _allowedLibraries);
61-
index.updateWeights(
62-
libraryWeights: {},
63-
apiPageDirWeights: _flutterApiPageDirWeights,
64-
);
57+
final content = await loadOrFetchSdkIndexJsonAsString(
58+
SdkMemIndex.flutterSdkIndexJsonUri);
59+
final index =
60+
SdkMemIndex.flutter(index: DartdocIndex.parseJsonText(content));
6561
return index;
6662
} catch (e, st) {
6763
_logger.warning('Unable to load Flutter SDK index.', e, st);

app/lib/search/sdk_mem_index.dart

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import 'package:meta/meta.dart';
88
// ignore: implementation_imports
99
import 'package:pana/src/dartdoc/dartdoc_index.dart';
1010
import 'package:path/path.dart' as p;
11+
import 'package:pub_dev/search/dart_sdk_mem_index.dart';
12+
import 'package:pub_dev/search/flutter_sdk_mem_index.dart';
1113

1214
import '../shared/versions.dart';
1315
import 'search_service.dart';
@@ -23,39 +25,55 @@ class SdkMemIndex {
2325
final _tokensPerLibrary = <String, TokenIndex<String>>{};
2426
final _baseUriPerLibrary = <String, String>{};
2527
final _descriptionPerLibrary = <String, String>{};
26-
final _libraryWeights = <String, double>{};
27-
final _apiPageDirWeights = <String, double>{};
28+
final Map<String, double> _libraryWeights;
29+
final Map<String, double> _apiPageDirWeights;
2830

2931
SdkMemIndex({
3032
required String sdk,
3133
required String? version,
3234
required Uri baseUri,
35+
required DartdocIndex index,
36+
Set<String>? allowedLibraries,
37+
Map<String, double>? libraryWeights,
38+
Map<String, double>? apiPageDirWeights,
3339
}) : _sdk = sdk,
3440
_version = version,
35-
_baseUri = baseUri;
41+
_baseUri = baseUri,
42+
_libraryWeights = libraryWeights ?? const {},
43+
_apiPageDirWeights = apiPageDirWeights ?? const {} {
44+
_addDartdocIndex(index, allowedLibraries);
45+
}
3646

37-
static Future<SdkMemIndex> dart() async {
47+
static SdkMemIndex dart({required DartdocIndex index}) {
3848
return SdkMemIndex(
3949
sdk: 'dart',
4050
version: runtimeSdkVersion,
4151
baseUri: Uri.parse('https://api.dart.dev/stable/latest/'),
52+
index: index,
53+
libraryWeights: dartSdkLibraryWeights,
4254
);
4355
}
4456

45-
factory SdkMemIndex.flutter() {
57+
factory SdkMemIndex.flutter({required DartdocIndex index}) {
4658
return SdkMemIndex(
4759
sdk: 'flutter',
4860
version: null,
4961
baseUri: Uri.parse('https://api.flutter.dev/flutter/'),
62+
index: index,
63+
allowedLibraries: flutterSdkAllowedLibraries,
64+
apiPageDirWeights: flutterApiPageDirWeights,
5065
);
5166
}
5267

53-
late final indexJsonUri = _baseUri.resolve('index.json');
68+
static final dartSdkIndexJsonUri =
69+
Uri.parse('https://api.dart.dev/stable/latest/index.json');
70+
static final flutterSdkIndexJsonUri =
71+
Uri.parse('https://api.flutter.dev/flutter/index.json');
5472

55-
Future<void> addDartdocIndex(
56-
DartdocIndex index, {
73+
void _addDartdocIndex(
74+
DartdocIndex index,
5775
Set<String>? allowedLibraries,
58-
}) async {
76+
) {
5977
final textsPerLibrary = <String, Map<String, String>>{};
6078
for (final f in index.entries) {
6179
final library = f.qualifiedName?.split('.').first;
@@ -86,15 +104,6 @@ class SdkMemIndex {
86104
}
87105
}
88106

89-
/// Updates the non-default weight for libraries.
90-
void updateWeights({
91-
required Map<String, double> libraryWeights,
92-
required Map<String, double> apiPageDirWeights,
93-
}) {
94-
_libraryWeights.addAll(libraryWeights);
95-
_apiPageDirWeights.addAll(apiPageDirWeights);
96-
}
97-
98107
List<SdkLibraryHit> search(
99108
String query, {
100109
int? limit,

app/test/search/backend_test.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import '../shared/test_services.dart';
1313
void main() {
1414
group('search backend', () {
1515
testWithProfile('fetch SDK library description', fn: () async {
16-
final index = await SdkMemIndex.dart();
17-
final content = await loadOrFetchSdkIndexJsonAsString(index.indexJsonUri);
18-
await index.addDartdocIndex(DartdocIndex.parseJsonText(content));
16+
final content = await loadOrFetchSdkIndexJsonAsString(
17+
SdkMemIndex.dartSdkIndexJsonUri);
18+
final index =
19+
SdkMemIndex.dart(index: DartdocIndex.parseJsonText(content));
1920
expect(
2021
index.getLibraryDescription('dart:async'),
2122
'Support for asynchronous programming, with classes such as Future and Stream.',

app/test/search/dartdoc_index_parsing_test.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ void main() {
6666
expect(parserWithoutFirstEntry, originalWithoutFirstEntry);
6767

6868
// parsing into SDK index
69-
final sdkMemIndex = SdkMemIndex.flutter();
70-
await sdkMemIndex.addDartdocIndex(index);
69+
final sdkMemIndex = SdkMemIndex.flutter(index: index);
7170
final rs = sdkMemIndex.search('StatelessWidget');
7271
expect(json.decode(json.encode(rs)), [
7372
{

app/test/search/result_combiner_test.dart

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -31,49 +31,48 @@ void main() {
3131
final combiner = SearchResultCombiner(
3232
primaryIndex: primaryIndex,
3333
dartSdkMemIndex: SdkMemIndex(
34-
sdk: 'dart',
35-
version: runtimeSdkVersion,
36-
baseUri: Uri.parse('https://api.dart.dev/stable/$runtimeSdkVersion/'))
37-
..addDartdocIndex(
38-
DartdocIndex.fromJsonList([
39-
{
40-
'name': 'dart:core',
41-
'qualifiedName': 'dart:core',
42-
'href': 'dart-core/dart-core-library.html',
43-
'kind': 8,
44-
'overriddenDepth': 0,
45-
'packageName': 'Dart'
46-
},
47-
{
48-
'name': 'String',
49-
'qualifiedName': 'dart:core.String',
50-
'href': 'dart-core/String-class.html',
51-
'kind': 3,
52-
'overriddenDepth': 0,
53-
'packageName': 'Dart',
54-
'enclosedBy': {'name': 'dart:core', 'kind': 8}
55-
},
56-
{
57-
'name': 'substring',
58-
'qualifiedName': 'dart:core.String.substring',
59-
'href': 'dart-core/String/substring.html',
60-
'kind': 9,
61-
'overriddenDepth': 0,
62-
'packageName': 'Dart',
63-
'enclosedBy': {'name': 'String', 'kind': 3}
64-
},
65-
{
66-
// fake method for checking the package name matches
67-
'name': 'stringutils',
68-
'qualifiedName': 'dart:core.String.stringutils',
69-
'href': 'dart-core/String/stringutils.html',
70-
'kind': 9,
71-
'overriddenDepth': 0,
72-
'packageName': 'Dart',
73-
'enclosedBy': {'name': 'String', 'kind': 3}
74-
},
75-
]),
76-
),
34+
sdk: 'dart',
35+
version: runtimeSdkVersion,
36+
baseUri: Uri.parse('https://api.dart.dev/stable/$runtimeSdkVersion/'),
37+
index: DartdocIndex.fromJsonList([
38+
{
39+
'name': 'dart:core',
40+
'qualifiedName': 'dart:core',
41+
'href': 'dart-core/dart-core-library.html',
42+
'kind': 8,
43+
'overriddenDepth': 0,
44+
'packageName': 'Dart'
45+
},
46+
{
47+
'name': 'String',
48+
'qualifiedName': 'dart:core.String',
49+
'href': 'dart-core/String-class.html',
50+
'kind': 3,
51+
'overriddenDepth': 0,
52+
'packageName': 'Dart',
53+
'enclosedBy': {'name': 'dart:core', 'kind': 8}
54+
},
55+
{
56+
'name': 'substring',
57+
'qualifiedName': 'dart:core.String.substring',
58+
'href': 'dart-core/String/substring.html',
59+
'kind': 9,
60+
'overriddenDepth': 0,
61+
'packageName': 'Dart',
62+
'enclosedBy': {'name': 'String', 'kind': 3}
63+
},
64+
{
65+
// fake method for checking the package name matches
66+
'name': 'stringutils',
67+
'qualifiedName': 'dart:core.String.stringutils',
68+
'href': 'dart-core/String/stringutils.html',
69+
'kind': 9,
70+
'overriddenDepth': 0,
71+
'packageName': 'Dart',
72+
'enclosedBy': {'name': 'String', 'kind': 3}
73+
},
74+
]),
75+
),
7776
flutterSdkMemIndex: null,
7877
);
7978

0 commit comments

Comments
 (0)