Fix nodes not being properly assigned to CEqual

This commit is contained in:
Sam Vervaeck 2023-04-13 17:22:45 +02:00
parent e2923f63c0
commit d3b713624d
Signed by: samvv
SSH key fingerprint: SHA256:dIg0ywU1OP+ZYifrYxy8c5esO72cIKB+4/9wkZj1VaY

View file

@ -763,7 +763,7 @@ abstract class ConstraintBase {
public abstract freeTypeVars(): Iterable<TVar>; public abstract freeTypeVars(): Iterable<TVar>;
public abstract substitute(sub: TVSub, node: Syntax | null): Constraint; public abstract substitute(sub: TVSub): Constraint;
} }
@ -779,11 +779,11 @@ class CEqual extends ConstraintBase {
super(); super();
} }
public substitute(sub: TVSub, node: Syntax | null = null): CEqual { public substitute(sub: TVSub): CEqual {
return new CEqual( return new CEqual(
this.left.substitute(sub), this.left.substitute(sub),
this.right.substitute(sub), this.right.substitute(sub),
node, this.node,
); );
} }
@ -808,10 +808,10 @@ class CMany extends ConstraintBase {
super(); super();
} }
public substitute(sub: TVSub, node: Syntax | null = null): CMany { public substitute(sub: TVSub): CMany {
const newElements = []; const newElements = [];
for (const element of this.elements) { for (const element of this.elements) {
newElements.push(element.substitute(sub, node)); newElements.push(element.substitute(sub));
} }
return new CMany(newElements); return new CMany(newElements);
} }
@ -839,7 +839,7 @@ class CEmpty extends ConstraintBase {
public readonly kind = ConstraintKind.Empty; public readonly kind = ConstraintKind.Empty;
public substitute(_sub: TVSub, _node: Syntax | null = null): Constraint { public substitute(_sub: TVSub): Constraint {
return this; return this;
} }
@ -1271,10 +1271,6 @@ export class Checker {
} }
private instantiate(scheme: Scheme, node: Syntax | null, sub = this.createSubstitution(scheme)): Type { private instantiate(scheme: Scheme, node: Syntax | null, sub = this.createSubstitution(scheme)): Type {
const update = (constraint: CEqual) => {
constraint.node = node;
constraint.prevInstantiation = scheme.constraint;
}
const transform = (constraint: Constraint): Constraint => { const transform = (constraint: Constraint): Constraint => {
switch (constraint.kind) { switch (constraint.kind) {
case ConstraintKind.Many: case ConstraintKind.Many:
@ -1287,7 +1283,8 @@ export class Checker {
return constraint; return constraint;
case ConstraintKind.Equal: case ConstraintKind.Equal:
const newConstraint = constraint.substitute(sub); const newConstraint = constraint.substitute(sub);
update(newConstraint); newConstraint.node = node;
newConstraint.prevInstantiation = constraint;
return newConstraint; return newConstraint;
} }
} }