Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save HelloCore/e87377da7e2352398f3e6bca39d2e33d to your computer and use it in GitHub Desktop.
Save HelloCore/e87377da7e2352398f3e6bca39d2e33d to your computer and use it in GitHub Desktop.
import 'dart:io';
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:danger_core/danger_core.dart';
import 'package:path/path.dart' as path;
enum _AnalysisVisitorType {
listenWithoutAddTo,
compositeAdd,
}
class _AnalysisVisitorResult {
late final _AnalysisVisitorType type;
late final int offset;
_AnalysisVisitorResult(this.type, this.offset);
}
class _AnalysisVisitor extends RecursiveAstVisitor<int> {
final result = <_AnalysisVisitorResult>[];
@override
int? visitMethodInvocation(MethodInvocation node) {
final childEntities = node.childEntities.toList();
if (childEntities.length > 2) {
final methodName = childEntities[childEntities.length - 2].toString();
if (methodName == 'listen') {
result.add(_AnalysisVisitorResult(
_AnalysisVisitorType.listenWithoutAddTo, childEntities[childEntities.length - 1].end));
return null;
}
}
if (childEntities.length > 3) {
final firstMethod =
childEntities[0].toString() + childEntities[1].toString() + childEntities[2].toString();
if (firstMethod == 'compositeSubscription.add') {
result.add(
_AnalysisVisitorResult(_AnalysisVisitorType.compositeAdd, childEntities[0].offset));
return null;
}
}
return null;
}
}
class DangerPluginReportListenToCompositeSubscription {
static void process() {
final allfiles = danger.git.createdFiles + danger.git.modifiedFiles;
allfiles.where((file) => file.endsWith('.dart')).forEach((filePath) {
final file = File(filePath);
final lines = file.readAsLinesSync();
final collection =
AnalysisContextCollection(includedPaths: [path.normalize(file.absolute.path)]);
collection.contexts.forEach((context) {
context.contextRoot.analyzedFiles().forEach((analyzedFile) {
final session = context.currentSession;
final result = session.getParsedUnit(analyzedFile);
final unit = result.unit;
final visitor = _AnalysisVisitor();
unit.accept(visitor);
final errorResults = visitor.result;
errorResults.forEach((errorResult) {
final lineInfo = result.lineInfo.getLocation(errorResult.offset);
final lineNo = lineInfo.lineNumber;
switch (errorResult.type) {
case _AnalysisVisitorType.compositeAdd:
warn('Please use .listen().addTo(compositeSubscription);` instead',
file: filePath, line: lineNo + 1);
break;
case _AnalysisVisitorType.listenWithoutAddTo:
warn('Don\'t forget to use `.addTo(compositeSubscription)` !!',
file: filePath, line: lineNo + 1);
break;
}
});
});
});
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment