Skip to content
Snippets Groups Projects
Commit 014812b2 authored by Nathan PERIER's avatar Nathan PERIER
Browse files

Get the list of generics with the visitor

parent faa7cf80
No related branches found
No related tags found
No related merge requests found
......@@ -45,11 +45,6 @@ public class GenericType extends Type {
return this;
}
@Override
public List<String> getGenerics() {
return List.of(getName());
}
@Override
public <T> T acceptVisitor(TypeVisitor<T> visitor) {
return visitor.visitGeneric(this);
......
......@@ -76,15 +76,6 @@ public class SumType extends Type {
return this;
}
@Override
public List<String> getGenerics() {
List<String> res = new ArrayList<>();
for(Type t : specifics) {
res.addAll(t.getGenerics());
}
return res;
}
@Override
public <T> T acceptVisitor(TypeVisitor<T> visitor) {
return visitor.visitSum(this);
......
package fr.insarennes.nperier.minichamo.language.typing;
import fr.insarennes.nperier.minichamo.language.typing.visitor.GetGenericsVisitor;
import fr.insarennes.nperier.minichamo.language.typing.visitor.ReplaceGenericsVisitor;
import fr.insarennes.nperier.minichamo.language.typing.visitor.TypeVisitor;
......@@ -60,16 +61,14 @@ public abstract class Type {
return specifics.length > 0;
}
public abstract <T> T acceptVisitor(TypeVisitor<T> visitor);
public List<String> getGenerics() {
List<String> res = new ArrayList<>();
for(Type t : specifics) {
res.addAll(t.getGenerics());
}
return res;
GetGenericsVisitor visitor = new GetGenericsVisitor();
acceptVisitor(visitor);
return visitor.getOrder();
}
public abstract <T> T acceptVisitor(TypeVisitor<T> visitor);
public Type replaceGenerics(Map<String, Type> mapping) {
return acceptVisitor(new ReplaceGenericsVisitor(mapping));
}
......
package fr.insarennes.nperier.minichamo.language.typing.visitor;
import fr.insarennes.nperier.minichamo.language.typing.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class GetGenericsVisitor implements TypeVisitor<Set<String>> {
private final List<String> order;
public GetGenericsVisitor() {
order = new ArrayList<>();
}
public List<String> getOrder() {
return order;
}
private Set<String> visitCommon(Type t) {
Set<String> res = new HashSet<>();
t.streamSpecifics().forEach(ty -> res.addAll(ty.acceptVisitor(this)));
return res;
}
@Override
public Set<String> visitAlias(AliasType t) {
return visitCommon(t);
}
@Override
public Set<String> visitBuiltin(BuiltinType t) {
return visitCommon(t);
}
@Override
public Set<String> visitFunction(FunctionType t) {
return visitCommon(t);
}
@Override
public Set<String> visitGeneric(GenericType t) {
String name = t.getName();
if(!order.contains(name)) {
order.add(name);
}
return Set.of(name);
}
@Override
public Set<String> visitNuple(NupleType t) {
return visitCommon(t);
}
@Override
public Set<String> visitSum(SumType t) {
return visitCommon(t);
}
}
......@@ -13,9 +13,8 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TypeTests {
......@@ -37,15 +36,15 @@ public class TypeTests {
@Test
public void getGenericsTest() {
TokenPeekIterator it = new Lexer("('a, 'c) lol * 'b list * int * 'd;; type ('a, 'b) mdr = Aaa of 'a | Bbb of 'b -> 'b;;").wrap();
TokenPeekIterator it = new Lexer("('a, 'c) lol * 'b list * 'a * 'd;; type ('a, 'b) mdr = Aaa of 'a | Bbb of 'b -> 'b;;").wrap();
Type t = TypeParser.parse(it, ctx);
Assertions.assertTrue(it.junkIf(TokenType.TERMINATION));
Assertions.assertTrue(it.junkIf(TokenType.TYPEDEF));
TypeDef td = TypedefParser.parse(it, ctx);
Assertions.assertTrue(it.junkIf(TokenType.TERMINATION));
Assertions.assertFalse(it.hasNext());
Assertions.assertEquals(Set.of("a", "b", "c", "d"), new HashSet<>(t.getGenerics()));
Assertions.assertEquals(Set.of("a", "b"), new HashSet<>(td.getType().getGenerics()));
Assertions.assertEquals(List.of("a", "c", "b", "d"), t.getGenerics());
Assertions.assertEquals(List.of("a", "b"), td.getType().getGenerics());
}
@Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment