Skip to content

Commit 524e60e

Browse files
committed
Fix SAM method reference #SCL-8931 Fixed
1 parent c3e220f commit 524e60e

File tree

2 files changed

+49
-23
lines changed

2 files changed

+49
-23
lines changed

src/org/jetbrains/plugins/scala/lang/resolve/processor/MethodResolveProcessor.scala

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,34 @@ object MethodResolveProcessor {
202202
}
203203

204204
def checkFunction(fun: PsiNamedElement): ConformanceExtResult = {
205+
def default(): ConformanceExtResult = {
206+
fun match {
207+
case fun: ScFunction if fun.paramClauses.clauses.isEmpty ||
208+
fun.paramClauses.clauses.head.parameters.isEmpty ||
209+
isUnderscore => ConformanceExtResult(problems)
210+
case fun: ScFun if fun.paramClauses == Seq() || fun.paramClauses == Seq(Seq()) || isUnderscore =>
211+
addExpectedTypeProblems()
212+
ConformanceExtResult(problems)
213+
case method: PsiMethod if method.getParameterList.getParameters.isEmpty ||
214+
isUnderscore =>
215+
addExpectedTypeProblems()
216+
ConformanceExtResult(problems)
217+
case _ =>
218+
addExpectedTypeProblems()
219+
problems += MissedParametersClause(null)
220+
ConformanceExtResult(problems)
221+
}
222+
}
223+
224+
def processFunctionType(retType: ScType, params: Seq[ScType]): ConformanceExtResult = {
225+
val args = params.map(new Expression(_))
226+
val result = Compatibility.compatible(fun, substitutor, List(args), checkWithImplicits = false,
227+
scope = ref.getResolveScope, isShapesResolve = isShapeResolve)
228+
problems ++= result.problems
229+
addExpectedTypeProblems(Some(retType))
230+
result.copy(problems)
231+
}
232+
205233
fun match {
206234
case fun: ScFunction if fun.paramClauses.clauses.isEmpty =>
207235
addExpectedTypeProblems()
@@ -213,30 +241,13 @@ object MethodResolveProcessor {
213241
}
214242

215243
expectedOption().map(_.removeAbstracts) match {
216-
case Some(ScFunctionType(retType, params)) =>
217-
val args = params.map(new Expression(_))
218-
val result = Compatibility.compatible(fun, substitutor, List(args), checkWithImplicits = false,
219-
scope = ref.getResolveScope, isShapesResolve = isShapeResolve)
220-
problems ++= result.problems
221-
addExpectedTypeProblems(Some(retType))
222-
result.copy(problems)
223-
case _ =>
224-
fun match {
225-
case fun: ScFunction if fun.paramClauses.clauses.isEmpty ||
226-
fun.paramClauses.clauses.head.parameters.isEmpty ||
227-
isUnderscore => ConformanceExtResult(problems)
228-
case fun: ScFun if fun.paramClauses == Seq() || fun.paramClauses == Seq(Seq()) || isUnderscore =>
229-
addExpectedTypeProblems()
230-
ConformanceExtResult(problems)
231-
case method: PsiMethod if method.getParameterList.getParameters.isEmpty ||
232-
isUnderscore =>
233-
addExpectedTypeProblems()
234-
ConformanceExtResult(problems)
235-
case _ =>
236-
addExpectedTypeProblems()
237-
problems += MissedParametersClause(null)
238-
ConformanceExtResult(problems)
244+
case Some(ScFunctionType(retType, params)) => processFunctionType(retType, params)
245+
case Some(tp: ScType) if ScalaPsiUtil.isSAMEnabled(fun) =>
246+
ScalaPsiUtil.toSAMType(tp, fun.getResolveScope) match {
247+
case Some(ScFunctionType(retType, params)) => processFunctionType(retType, params)
248+
case _ => default()
239249
}
250+
case _ => default()
240251
}
241252
}
242253

test/org/jetbrains/plugins/scala/annotator/SingleAbstractMethodTest.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,21 @@ class SingleAbstractMethodTest extends ScalaLightPlatformCodeInsightTestCaseAdap
278278
checkCodeHasNoErrors(code)
279279
}
280280

281+
def testSAMMethodReference(): Unit = {
282+
val code =
283+
"""
284+
|trait F[T, R] {
285+
| def apply(a: T): R
286+
|}
287+
|
288+
|def len(s: String): Int = s.length
289+
|
290+
|val f: F[String, Int] = len
291+
|
292+
""".stripMargin
293+
checkCodeHasNoErrors(code)
294+
}
295+
281296
def checkCodeHasNoErrors(code: String) {
282297
assertMatches(messages(code)) {
283298
case Nil =>

0 commit comments

Comments
 (0)