Skip to content

Commit bcfb330

Browse files
committed
Implement Java Compiler Plugin for witness resolution verification
1 parent 09cfa6d commit bcfb330

17 files changed

Lines changed: 807 additions & 25 deletions

.idea/compiler.xml

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/encodings.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/google-java-format.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/jarRepositories.xml

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/workspace.xml

Lines changed: 175 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.garciat.typeclasses.processor;
2+
3+
import java.util.List;
4+
5+
import static com.garciat.typeclasses.api.TypeClass.Witness.Overlap.OVERLAPPABLE;
6+
import static com.garciat.typeclasses.api.TypeClass.Witness.Overlap.OVERLAPPING;
7+
8+
public final class OverlappingInstances {
9+
private OverlappingInstances() {}
10+
11+
/**
12+
* @implSpec <a href=
13+
* "https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/instances.html#overlapping-instances">6.8.8.5.
14+
* Overlapping instances</a>
15+
*/
16+
public static List<WitnessConstructor> reduce(List<WitnessConstructor> candidates) {
17+
return candidates.stream()
18+
.filter(
19+
iX ->
20+
candidates.stream().filter(iY -> iX != iY).noneMatch(iY -> isOverlappedBy(iX, iY)))
21+
.toList();
22+
}
23+
24+
private static boolean isOverlappedBy(WitnessConstructor iX, WitnessConstructor iY) {
25+
return (iX.overlap() == OVERLAPPABLE || iY.overlap() == OVERLAPPING)
26+
&& isSubstitutionInstance(iX, iY)
27+
&& !isSubstitutionInstance(iY, iX);
28+
}
29+
30+
private static boolean isSubstitutionInstance(
31+
WitnessConstructor base, WitnessConstructor reference) {
32+
return Unification.unify(base.returnType(), reference.returnType())
33+
.fold(() -> false, map -> !map.isEmpty());
34+
}
35+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.garciat.typeclasses.processor;
2+
3+
import javax.lang.model.type.DeclaredType;
4+
import javax.lang.model.type.PrimitiveType;
5+
import javax.lang.model.type.TypeMirror;
6+
import javax.lang.model.type.TypeVariable;
7+
8+
public sealed interface ParsedType {
9+
record Var(TypeVariable java) implements ParsedType {}
10+
11+
record App(ParsedType fun, ParsedType arg) implements ParsedType {}
12+
13+
record ArrayOf(ParsedType elementType) implements ParsedType {}
14+
15+
record Const(DeclaredType java) implements ParsedType {}
16+
17+
record Primitive(PrimitiveType java) implements ParsedType {}
18+
19+
default String format() {
20+
return switch (this) {
21+
case Var v -> v.java.toString();
22+
case Const c ->
23+
c.java().asElement().getSimpleName()
24+
+ c.java().getTypeArguments().stream()
25+
.map(TypeMirror::toString)
26+
.reduce((a, b) -> a + ", " + b)
27+
.map(s -> "[" + s + "]")
28+
.orElse("");
29+
case App a -> a.fun.format() + "(" + a.arg.format() + ")";
30+
case ArrayOf a -> a.elementType.format() + "[]";
31+
case Primitive p -> p.java().toString();
32+
};
33+
}
34+
}

0 commit comments

Comments
 (0)