Fix nodes not being properly assigned to CEqual
This commit is contained in:
parent
e2923f63c0
commit
d3b713624d
1 changed files with 8 additions and 11 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue