Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 24 additions & 7 deletions lib/pana.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class PackageAnalyzer {

Future<Summary> inspectPackage(String package,
{String version, bool keepTransitiveLibs: false}) async {
List<AnalyzerIssue> issues = [];
var sdkVersion = _dartSdk.version;
log.info("SDK: $sdkVersion");

Expand Down Expand Up @@ -65,8 +66,8 @@ class PackageAnalyzer {
log.info("Checking pubspec.yaml...");
var pubspec = new Pubspec.parseFromDir(pkgDir);
if (pubspec.hasUnknownSdks) {
throw new Exception(
'Unknown SDKs in pubspec.yaml: ${pubspec.dependentSdks}');
issues.add(new AnalyzerIssue(AnalyzerScopes.pubspec,
'Unknown SDKs: ${pubspec.unknownSdks}', 'unknown-sdks'));
}

log.info("Pub upgrade...");
Expand All @@ -85,18 +86,24 @@ class PackageAnalyzer {
libraryScanner = new LibraryScanner(package, pkgDir, isFlutter);
} on StateError catch (e, stack) {
log.severe("Could not create LibraryScanner", e, stack);
issues.add(new AnalyzerIssue(
AnalyzerScopes.libraryScanner, e.toString(), 'init'));
}

if (libraryScanner != null) {
try {
allDirectLibs = await libraryScanner.scanDirectLibs();
} catch (e, st) {
log.severe('Error scanning direct librariers', e, st);
issues.add(new AnalyzerIssue(
AnalyzerScopes.libraryScanner, e.toString(), 'direct'));
}
try {
allTransitiveLibs = await libraryScanner.scanTransitiveLibs();
} catch (e, st) {
log.severe('Error scanning transitive librariers', e, st);
issues.add(new AnalyzerIssue(
AnalyzerScopes.libraryScanner, e.toString(), 'transient'));
}
libraryScanner.clearCaches();
}
Expand All @@ -108,7 +115,8 @@ class PackageAnalyzer {
if (e.toString().contains("No dart files found at: .")) {
log.warning("No files to analyze...");
} else {
rethrow;
issues
.add(new AnalyzerIssue(AnalyzerScopes.dartAnalyzer, e.toString()));
}
}

Expand Down Expand Up @@ -148,25 +156,34 @@ class PackageAnalyzer {
}
}

return new Summary(
sdkVersion, package, new Version.parse(pkgInfo.version), summary, files,
return new Summary(sdkVersion, package, new Version.parse(pkgInfo.version),
summary, files, issues,
flutterVersion: flutterVersion);
}

Future<Set<AnalyzerOutput>> _pkgAnalyze(String pkgPath) async {
log.info('Running `dartanalyzer`...');
var proc = await _dartSdk.runAnalyzer(pkgPath);

String output = proc.stderr;
if ('\n$output'.contains('\nUnhandled exception:\n')) {
log.severe("Bad input?");
log.severe(output);
String errorMessage =
'\n$output'.split('\nUnhandled exception:\n')[1].split('\n').first;
throw new ArgumentError('dartanalyzer exception: $errorMessage');
}

try {
return new SplayTreeSet.from(LineSplitter
.split(proc.stderr)
.split(output)
.map((s) => AnalyzerOutput.parse(s, projectDir: pkgPath))
.where((e) => e != null));
} on ArgumentError {
// TODO: we should figure out a way to succeed here, right?
// Or at least do partial results and not blow up
log.severe("Bad input?");
log.severe(proc.stderr);
log.severe(output);
rethrow;
}
}
Expand Down
10 changes: 6 additions & 4 deletions lib/src/pubspec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,11 @@ class Pubspec {
return _dependentSdks;
}

bool get hasUnknownSdks {
Set<String> sdks = new Set.from(dependentSdks);
sdks.remove('flutter');
return sdks.isNotEmpty;
Set<String> get unknownSdks {
Set<String> unknowns = new Set.from(dependentSdks);
unknowns.remove('flutter');
return unknowns;
}

bool get hasUnknownSdks => unknownSdks.isNotEmpty;
}
39 changes: 37 additions & 2 deletions lib/src/summary.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,10 @@ class Summary {
final Version packageVersion;
final PubSummary pubSummary;
final Map<String, DartFileSummary> dartFiles;
final List<AnalyzerIssue> issues;

Summary(this.sdkVersion, this.packageName, this.packageVersion,
this.pubSummary, this.dartFiles,
this.pubSummary, this.dartFiles, this.issues,
{this.flutterVersion});

factory Summary.fromJson(Map<String, dynamic> json) {
Expand All @@ -90,9 +91,12 @@ class Summary {
Map<String, DartFileSummary> dartFiles = new SplayTreeMap.fromIterable(
filesMap.keys,
value: (key) => new DartFileSummary.fromJson(filesMap[key]));
List issuesRaw = json['issues'];
List<AnalyzerIssue> issues =
issuesRaw?.map((Map map) => new AnalyzerIssue.fromJson(map))?.toList();

return new Summary(
sdkVersion, packageName, packageVersion, pubSummary, dartFiles,
sdkVersion, packageName, packageVersion, pubSummary, dartFiles, issues,
flutterVersion: json['flutterVersion']);
}

Expand All @@ -116,6 +120,37 @@ class Summary {
'dartFiles': dartFiles,
});

if (issues != null && issues.isNotEmpty) {
map['issues'] = issues;
}

return map;
}
}

class AnalyzerIssue {
final String scope;
final String message;
final dynamic code;

AnalyzerIssue(this.scope, this.message, [this.code]);

factory AnalyzerIssue.fromJson(Map<String, dynamic> json) =>
new AnalyzerIssue(
json['scope'],
json['message'],
json['code'],
);

Map<String, dynamic> toJson() {
var map = <String, dynamic>{'scope': scope, 'message': message};
if (code != null) map['code'] = code;
return map;
}
}

abstract class AnalyzerScopes {
static const String pubspec = 'pubspec';
static const String dartAnalyzer = 'dart-analyzer';
static const String libraryScanner = 'library-scanner';
}
4 changes: 2 additions & 2 deletions test/end2end/http_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ final data = {
"charcode": "1.1.1",
"collection": "1.14.1",
"http_parser": "3.1.1",
"path": "1.4.1",
"path": startsWith("1.4."),
"source_span": "1.4.0",
"stack_trace": "1.7.3",
"string_scanner": "1.0.2",
Expand All @@ -42,7 +42,7 @@ final data = {
"charcode": "1.1.1",
"collection": "1.14.1",
"http_parser": "3.1.1",
"path": "1.4.1",
"path": startsWith("1.4."),
"source_span": "1.4.0",
"stack_trace": "1.7.3",
"string_scanner": "1.0.2",
Expand Down
4 changes: 2 additions & 2 deletions test/end2end/pub_server_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ final data = {
"mime": "0.9.3",
"package_config": "1.0.1",
"package_resolver": "1.0.2",
"path": "1.4.1",
"path": startsWith("1.4."),
"plugin": "0.2.0",
"pool": "1.3.1",
"pub_semver": "1.3.2",
Expand Down Expand Up @@ -86,7 +86,7 @@ final data = {
"mime": "0.9.3",
"package_config": "1.0.1",
"package_resolver": "1.0.2",
"path": "1.4.1",
"path": startsWith("1.4."),
"plugin": "0.2.0",
"pool": "1.3.1",
"pub_semver": "1.3.2",
Expand Down