|
6 | 6 |
|
7 | 7 | package com.whatsapp.eqwalizer.tc
|
8 | 8 |
|
| 9 | +import com.whatsapp.eqwalizer.ast.Forms.RecDecl |
9 | 10 | import com.whatsapp.eqwalizer.ast.Types.Key.asType
|
10 | 11 | import com.whatsapp.eqwalizer.ast.{RemoteId, Show, TypeVars}
|
11 |
| -import com.whatsapp.eqwalizer.ast.Types._ |
| 12 | +import com.whatsapp.eqwalizer.ast.Types.* |
| 13 | + |
12 | 14 | import scala.util.boundary
|
13 | 15 |
|
14 | 16 | /**
|
@@ -296,30 +298,30 @@ class TypeMismatch(pipelineContext: PipelineContext) {
|
296 | 298 |
|
297 | 299 | case (r: RecordType, t: TupleType) =>
|
298 | 300 | util.getRecord(r.module, r.name) match {
|
299 |
| - case Some(recDecl) => |
| 301 | + case Some(recDecl) if isRecordCandidate(recDecl, t) => |
300 | 302 | findMismatch(recordAsTuple(recDecl), t, seen)
|
301 |
| - case None => |
| 303 | + case _ => |
302 | 304 | Details(Some(t1, t2, Incompatible), 20)
|
303 | 305 | }
|
304 | 306 | case (t: TupleType, r: RecordType) =>
|
305 | 307 | util.getRecord(r.module, r.name) match {
|
306 |
| - case Some(recDecl) => |
| 308 | + case Some(recDecl) if isRecordCandidate(recDecl, t) => |
307 | 309 | findMismatch(t, recordAsTuple(recDecl), seen)
|
308 |
| - case None => |
| 310 | + case _ => |
309 | 311 | Details(Some(t1, t2, Incompatible), 20)
|
310 | 312 | }
|
311 | 313 | case (r: RefinedRecordType, t: TupleType) =>
|
312 | 314 | util.getRecord(r.recType.module, r.recType.name) match {
|
313 |
| - case Some(recDecl) => |
| 315 | + case Some(recDecl) if isRecordCandidate(recDecl, t) => |
314 | 316 | findMismatch(refinedRecordAsTuple(recDecl, r), t, seen)
|
315 |
| - case None => |
| 317 | + case _ => |
316 | 318 | Details(Some(t1, t2, Incompatible), 20)
|
317 | 319 | }
|
318 | 320 | case (t: TupleType, r: RefinedRecordType) =>
|
319 | 321 | util.getRecord(r.recType.module, r.recType.name) match {
|
320 |
| - case Some(recDecl) => |
| 322 | + case Some(recDecl) if isRecordCandidate(recDecl, t) => |
321 | 323 | findMismatch(t, refinedRecordAsTuple(recDecl, r), seen)
|
322 |
| - case None => |
| 324 | + case _ => |
323 | 325 | Details(Some(t1, t2, Incompatible), 20)
|
324 | 326 | }
|
325 | 327 | case (refRec: RefinedRecordType, rec: RecordType) if refRec.recType.name == rec.name =>
|
@@ -543,4 +545,8 @@ class TypeMismatch(pipelineContext: PipelineContext) {
|
543 | 545 | Details(Some(t1, t2, Incompatible), 0)
|
544 | 546 | }
|
545 | 547 | }
|
| 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 | + } |
546 | 552 | }
|
0 commit comments