Skip to content

Commit 092cf1e

Browse files
VLanvinfacebook-github-bot
authored andcommitted
Avoid unecessary record->tuple conversions in errors
Summary: Use heuristic to allow conversion of record to tuple in error messages (matching arity + first component being an atom). Reviewed By: TD5 Differential Revision: D80942528 fbshipit-source-id: 469350986416d5b05cd685acada4838a66453766
1 parent 4474505 commit 092cf1e

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

eqwalizer/src/main/scala/com/whatsapp/eqwalizer/tc/TypeMismatch.scala

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66

77
package com.whatsapp.eqwalizer.tc
88

9+
import com.whatsapp.eqwalizer.ast.Forms.RecDecl
910
import com.whatsapp.eqwalizer.ast.Types.Key.asType
1011
import com.whatsapp.eqwalizer.ast.{RemoteId, Show, TypeVars}
11-
import com.whatsapp.eqwalizer.ast.Types._
12+
import com.whatsapp.eqwalizer.ast.Types.*
13+
1214
import scala.util.boundary
1315

1416
/**
@@ -296,30 +298,30 @@ class TypeMismatch(pipelineContext: PipelineContext) {
296298

297299
case (r: RecordType, t: TupleType) =>
298300
util.getRecord(r.module, r.name) match {
299-
case Some(recDecl) =>
301+
case Some(recDecl) if isRecordCandidate(recDecl, t) =>
300302
findMismatch(recordAsTuple(recDecl), t, seen)
301-
case None =>
303+
case _ =>
302304
Details(Some(t1, t2, Incompatible), 20)
303305
}
304306
case (t: TupleType, r: RecordType) =>
305307
util.getRecord(r.module, r.name) match {
306-
case Some(recDecl) =>
308+
case Some(recDecl) if isRecordCandidate(recDecl, t) =>
307309
findMismatch(t, recordAsTuple(recDecl), seen)
308-
case None =>
310+
case _ =>
309311
Details(Some(t1, t2, Incompatible), 20)
310312
}
311313
case (r: RefinedRecordType, t: TupleType) =>
312314
util.getRecord(r.recType.module, r.recType.name) match {
313-
case Some(recDecl) =>
315+
case Some(recDecl) if isRecordCandidate(recDecl, t) =>
314316
findMismatch(refinedRecordAsTuple(recDecl, r), t, seen)
315-
case None =>
317+
case _ =>
316318
Details(Some(t1, t2, Incompatible), 20)
317319
}
318320
case (t: TupleType, r: RefinedRecordType) =>
319321
util.getRecord(r.recType.module, r.recType.name) match {
320-
case Some(recDecl) =>
322+
case Some(recDecl) if isRecordCandidate(recDecl, t) =>
321323
findMismatch(t, refinedRecordAsTuple(recDecl, r), seen)
322-
case None =>
324+
case _ =>
323325
Details(Some(t1, t2, Incompatible), 20)
324326
}
325327
case (refRec: RefinedRecordType, rec: RecordType) if refRec.recType.name == rec.name =>
@@ -543,4 +545,8 @@ class TypeMismatch(pipelineContext: PipelineContext) {
543545
Details(Some(t1, t2, Incompatible), 0)
544546
}
545547
}
548+
549+
private def isRecordCandidate(decl: RecDecl, tupleType: TupleType): Boolean = {
550+
decl.fields.size + 1 == tupleType.argTys.size && subtype.gradualSubType(tupleType.argTys.head, AtomType)
551+
}
546552
}

0 commit comments

Comments
 (0)