Created
August 17, 2021 14:59
-
-
Save HelloCore/e87377da7e2352398f3e6bca39d2e33d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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