Skip to content

Commit 15198eb

Browse files
pqcommit-bot@chromium.org
authored andcommitted
add pubspec caching to PubWorkspacePackages
See: https://github.com/dart-lang/linter/issues/29 Change-Id: Ifcd4ad359a43c9183ab42ed6bb0ebb3586c73afd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/134861 Commit-Queue: Phil Quitslund <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 4d10cd9 commit 15198eb

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

pkg/analyzer/lib/src/workspace/pub.dart

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

55
import 'package:analyzer/file_system/file_system.dart';
6+
import 'package:analyzer/src/context/packages.dart';
67
import 'package:analyzer/src/generated/source.dart';
8+
import 'package:analyzer/src/lint/pub.dart';
79
import 'package:analyzer/src/workspace/simple.dart';
810
import 'package:analyzer/src/workspace/workspace.dart';
9-
import 'package:analyzer/src/context/packages.dart';
1011

1112
/// Information about a Pub workspace.
1213
class PubWorkspace extends SimpleWorkspace {
@@ -18,10 +19,14 @@ class PubWorkspace extends SimpleWorkspace {
1819
/// Each Pub workspace is itself one package.
1920
PubWorkspacePackage _theOnlyPackage;
2021

22+
/// The associated pubspec file.
23+
final File _pubspecFile;
24+
2125
PubWorkspace._(
2226
ResourceProvider provider,
2327
Map<String, List<Folder>> packageMap,
2428
String root,
29+
this._pubspecFile,
2530
) : super(provider, packageMap, root);
2631

2732
@override
@@ -52,10 +57,11 @@ class PubWorkspace extends SimpleWorkspace {
5257
return null;
5358
}
5459

55-
if (folder.getChildAssumingFile(_pubspecName).exists) {
60+
var pubspec = folder.getChildAssumingFile(_pubspecName);
61+
if (pubspec.exists) {
5662
// Found the pubspec.yaml file; this is our root.
5763
String root = folder.path;
58-
return PubWorkspace._(provider, packageMap, root);
64+
return PubWorkspace._(provider, packageMap, root, pubspec);
5965
}
6066

6167
// Go up a folder.
@@ -73,11 +79,31 @@ class PubWorkspacePackage extends WorkspacePackage {
7379
@override
7480
final String root;
7581

82+
Pubspec _pubspec;
83+
84+
/// A flag to indicate if we've tried to parse the pubspec.
85+
bool _parsedPubspec = false;
86+
7687
@override
7788
final PubWorkspace workspace;
7889

7990
PubWorkspacePackage(this.root, this.workspace);
8091

92+
/// Get the associated parsed [Pubspec], or `null` if there was an error in
93+
/// reading or parsing.
94+
Pubspec get pubspec {
95+
if (!_parsedPubspec) {
96+
_parsedPubspec = true;
97+
try {
98+
final content = workspace._pubspecFile.readAsStringSync();
99+
_pubspec = Pubspec.parse(content);
100+
} catch (_) {
101+
// Pubspec will be null.
102+
}
103+
}
104+
return _pubspec;
105+
}
106+
81107
@override
82108
bool contains(Source source) {
83109
String filePath = filePathFromSource(source);

pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:async';
77
import 'package:analyzer/src/context/builder.dart';
88
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
99
import 'package:analyzer/src/lint/linter.dart';
10+
import 'package:analyzer/src/workspace/pub.dart';
1011
import 'package:test/test.dart';
1112
import 'package:test_reflective_loader/test_reflective_loader.dart';
1213

@@ -17,6 +18,7 @@ main() {
1718
defineReflectiveTests(CanBeConstConstructorTest);
1819
defineReflectiveTests(CanBeConstTest);
1920
defineReflectiveTests(EvaluateExpressionTest);
21+
defineReflectiveTests(PubDependencyTest);
2022
});
2123
}
2224

@@ -289,3 +291,32 @@ var x = 42;
289291
return context.evaluateConstant(node);
290292
}
291293
}
294+
295+
@reflectiveTest
296+
class PubDependencyTest extends AbstractLinterContextTest {
297+
test_dependencies() async {
298+
newFile('/test/pubspec.yaml', content: '''
299+
name: test
300+
301+
dependencies:
302+
args: '>=0.12.1 <2.0.0'
303+
charcode: ^1.1.0
304+
''');
305+
await resolve(r'''
306+
/// Dummy class.
307+
class C { }
308+
''');
309+
310+
expect(context.package, TypeMatcher<PubWorkspacePackage>());
311+
final pubPackage = context.package as PubWorkspacePackage;
312+
final pubspec = pubPackage.pubspec;
313+
314+
final argsDep = pubspec.dependencies
315+
.singleWhere((element) => element.name.text == 'args');
316+
expect(argsDep.version.value.text, '>=0.12.1 <2.0.0');
317+
318+
final charCodeDep = pubspec.dependencies
319+
.singleWhere((element) => element.name.text == 'charcode');
320+
expect(charCodeDep.version.value.text, '^1.1.0');
321+
}
322+
}

0 commit comments

Comments
 (0)