gpt4 book ai didi

scala - 从 Scala 项目中排除特定的隐式

转载 作者:行者123 更新时间:2023-12-01 19:20:36 24 4
gpt4 key购买 nike

如何防止在我的 scala 代码中使用特定的隐式?

例如,我最近被 https://github.com/scala/scala/blob/68bad81726d15d03a843dc476d52cbbaf52fb168/src/library/scala/io/Codec.scala#L76 提供的默认 Codec 所困扰。 。有没有一种方法可以确保任何调用隐式编解码器:Codec的代码都不会使用fallbackSystemCodec提供的代码?或者,是否可以阻止所有隐式编解码器?

这应该可以使用 scalafix 实现吗?

最佳答案

Scalafix 可以 inspect implicit arguments使用语义树。 Here是通过定义自定义 scalafix 规则的示例解决方案。

给定

import scala.io.Codec

object Hello {
def foo(implicit codec: Codec) = 3
foo
}

我们可以定义自定义规则

class ExcludedImplicitsRule(config: ExcludedImplicitsRuleConfig)
extends SemanticRule("ExcludedImplicitsRule") {

...

override def fix(implicit doc: SemanticDocument): Patch = {
doc.tree.collect {
case term: Term if term.synthetic.isDefined => // TODO: Use ApplyTree(func, args)
val struct = term.synthetic.structure
val isImplicit = struct.contains("implicit")
val excludedImplicit = config.blacklist.find(struct.contains)
if (isImplicit && excludedImplicit.isDefined)
Patch.lint(ExcludedImplicitsDiagnostic(term, excludedImplicit.getOrElse(config.blacklist.mkString(","))))
else
Patch.empty
}.asPatch
}

}

和相应的.scalafix.conf

rule = ExcludedImplicitsRule
ExcludedImplicitsRuleConfig.blacklist = [
fallbackSystemCodec
]

应该启用sbt scalafix来引发诊断

[error] /Users/mario/IdeaProjects/scalafix-exclude-implicits/example-project/scalafix-exclude-implicits-example/src/main/scala/example/Hello.scala:7:3: error: [ExcludedImplicitsRule] Attempting to pass excluded implicit fallbackSystemCodec to foo'
[error] foo
[error] ^^^
[error] (Compile / scalafix) scalafix.sbt.ScalafixFailed: LinterError

注意 println(term.synthetic.struct) 的输出

Some(ApplyTree(
OriginalTree(Term.Name("foo")),
List(
IdTree(SymbolInformation(scala/io/LowPriorityCodecImplicits#fallbackSystemCodec. => implicit lazy val method fallbackSystemCodec: Codec))
)
))

显然,上述解决方案在搜索字符串时效率不高,但它应该给出一些指导。也许匹配 ApplyTree(func, args) 会更好。

scalafix-exclude-implicits-example显示如何配置项目以使用 ExcludedImplicitsRule

关于scala - 从 Scala 项目中排除特定的隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50336960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com