Alireza Ahmadi
04/06/2020, 11:13 AMclass WarnningsExtension(
) : AnalysisHandlerExtension {
override fun analysisCompleted(project: Project, module: ModuleDescriptor, bindingTrace:
BindingTrace, files: Collection<KtFile>): AnalysisResult? {
val diagnostics = bindingTrace.bindingContext.diagnostics
return AnalysisResult.Companion.success(bindingContext, module)
}
}
But, I also want to modify this list like
val newDiagnostics = diagnostics.filter { //myFilter }
And return this result back instead. Is something like this possible? Or is there any extension that allow me to modify diagnostics?raulraja
04/06/2020, 12:38 PMAlireza Ahmadi
04/06/2020, 2:05 PMoverride fun analysisCompleted(project: Project, module: ModuleDescriptor, bindingTrace:
BindingTrace, files: Collection<KtFile>): AnalysisResult? {
val stringBuilder = StringBuilder()
val bindingContext = bindingTrace.bindingContext
val newDiagnosticList = bindingContext.diagnostics.filter {
//myfilter
}
val newDiagnostics = MyDiagnostics(bindingContext.diagnostics, newDiagnosticList)
val newBindingContext = MyBindingContext(bindingContext, newDiagnostics)
return AnalysisResult.Companion.success(newBindingContext, module)
}
Here is MyDiagnostics
implementation
class MyDiagnostics(private val diagnostics: Diagnostics, private val newDiagnostics: Collection<Diagnostic>) : Diagnostics {
override fun all(): Collection<Diagnostic> {
return newDiagnostics
}
override fun forElement(psiElement: PsiElement): Collection<Diagnostic> {
return diagnostics.forElement(psiElement)
}
override fun noSuppression(): Diagnostics {
return diagnostics.noSuppression()
}
override val modificationTracker = diagnostics.modificationTracker
override fun isEmpty() = diagnostics.isEmpty()
override fun iterator() = diagnostics.iterator()
}
And MyBindingContext
class MyBindingContext(private val bindingContext: BindingContext,
private val newDiagnostics: Diagnostics): BindingContext {
override fun <K : Any?, V : Any?> getKeys(p0: WritableSlice<K, V>?): Collection<K> {
return bindingContext.getKeys(p0)
}
override fun getType(p0: KtExpression): KotlinType? {
return bindingContext.getType(p0)
}
override fun <K : Any?, V : Any?> get(p0: ReadOnlySlice<K, V>?, p1: K): V? {
return bindingContext.get(p0, p1)
}
override fun getDiagnostics(): Diagnostics {
return newDiagnostics
}
override fun addOwnDataTo(p0: BindingTrace, p1: Boolean) {
bindingContext.addOwnDataTo(p0, p1)
}
override fun <K : Any?, V : Any?> getSliceContents(p0: ReadOnlySlice<K, V>): ImmutableMap<K,
V> {
return bindingContext.getSliceContents(p0)
}
}
Alireza Ahmadi
04/06/2020, 2:07 PMAlireza Ahmadi
04/06/2020, 2:25 PMval diagnostics: MutableDiagnosticsWithSuppression =
BindingTraceContext::class.java.getDeclaredField("mutableDiagnostics").also { it.isAccessible = true }.get(bindingTrace) as MutableDiagnosticsWithSuppression
val mutableDiagnostics = diagnostics.getOwnDiagnostics() as ArrayList<Diagnostic>
mutableDiagnostics.removeIf { //myfilter }
And it works.Alireza Ahmadi
04/06/2020, 2:26 PMraulraja
04/06/2020, 2:55 PM