Skip to content

Commit

Permalink
normalize: MemberCall extends BetaRedex
Browse files Browse the repository at this point in the history
  • Loading branch information
ice1000 committed Jul 8, 2024
1 parent 8e33f0c commit a1247a7
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 14 deletions.
5 changes: 0 additions & 5 deletions base/src/main/java/org/aya/normalize/Normalizer.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,6 @@ case FnCall(var fn, int ulift, var args) -> switch (fn) {
? apply(fnRule.toFnCall())
: reduceRule;
}
case MemberCall memberCall -> {
var result = MemberCall.make(memberCall);
if (result != memberCall) yield apply(result);
yield defaultValue;
}
case ConCall(var head, _) when !head.ref().hasEq() -> defaultValue;
case ConCall call when call.conArgs().getLast() instanceof DimTerm dim ->
call.head().ref().equality(call.args(), dim == DimTerm.I0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@
import org.aya.syntax.core.term.ClassCastTerm;
import org.aya.syntax.core.term.NewTerm;
import org.aya.syntax.core.term.Term;
import org.aya.syntax.core.term.marker.BetaRedex;
import org.jetbrains.annotations.NotNull;

public record MemberCall(
@NotNull Term of,
@Override @NotNull MemberDefLike ref,
@Override int ulift,
@Override @NotNull ImmutableSeq<@NotNull Term> args
) implements Callable.Tele {
) implements Callable.Tele, BetaRedex {
private MemberCall update(Term clazz, ImmutableSeq<Term> newArgs) {
return clazz == of && newArgs.sameElements(args, true) ? this
: new MemberCall(clazz, ref, ulift, newArgs);
Expand All @@ -34,23 +35,23 @@ private MemberCall update(Term clazz, ImmutableSeq<Term> newArgs) {
) {
var impl = typeOfOf.get(ref);
if (impl != null) return impl.apply(of);
return make(new MemberCall(of, ref, ulift, args));
return new MemberCall(of, ref, ulift, args).make();
}

public static @NotNull Term make(@NotNull MemberCall call) {
return switch (call.of()) {
public @NotNull Term make() {
return switch (of()) {
case NewTerm neu -> {
var impl = neu.inner().get(call.ref);
var impl = neu.inner().get(ref);
assert impl != null; // NewTerm is always fully applied
yield impl.apply(neu);
}
case ClassCastTerm cast -> {
var impl = cast.get(call.ref);
var impl = cast.get(ref);
if (impl != null) yield impl.apply(cast);
// no impl, try inner
yield call.update(cast.subterm(), call.args);
yield update(cast.subterm(), args);
}
default -> call;
default -> this;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
import org.aya.syntax.core.term.AppTerm;
import org.aya.syntax.core.term.ProjTerm;
import org.aya.syntax.core.term.Term;
import org.aya.syntax.core.term.call.MemberCall;
import org.aya.syntax.core.term.xtt.PAppTerm;
import org.jetbrains.annotations.NotNull;

public sealed interface BetaRedex extends Term permits AppTerm, PAppTerm, ProjTerm {
public sealed interface BetaRedex extends Term permits AppTerm, ProjTerm, MemberCall, PAppTerm {
@NotNull Term make();
}

0 comments on commit a1247a7

Please sign in to comment.