use of coreVisitors.From in project L42 by ElvisResearchGroup.
the class Methods method methods.
// -methods(p,P0)=M1'..Mk'
// p(P0)={interface? implements Ps Ms}
public List<MethodWithType> methods(Ast.Path p0) {
if (p0.isPrimitive()) {
return Collections.emptyList();
}
Program p = this;
ClassB cb0 = p.extractClassB(p0);
List<Ast.Path> ps = cb0.getSuperPaths();
// P1..Pn=collect(p,Ps[from P0]), error unless forall i, p(Pi) is an interface
List<Ast.Path> p1n = collect(p, Map.of(pi -> From.fromP(pi, p0), ps));
List<ClassB> cb1n = Map.of(pi -> p.extractClassB(pi), p1n);
{
int i = -1;
for (ClassB cbi : cb1n) {
i++;
if (!cbi.isInterface()) {
throw new ast.ErrorMessage.NonInterfaceImplements(p0, p1n.get(i));
}
}
}
// ms1..msk={ms|p(Pi)(ms) is defined}
HashMap<Ast.MethodSelector, List<ClassB.Member>> ms1k = new LinkedHashMap<>();
for (ClassB.Member mij : cb0.getMs()) {
mij.match(nc -> null, mi -> add(true, ms1k, mi.getS(), From.from(mij, p0)), mt -> add(true, ms1k, mt.getMs(), From.from(mij, p0)));
}
for (Ast.Path pi : p1n) {
//call the memoized methods
for (ClassB.Member mij : p.methods(pi)) {
mij.match(nc -> null, mi -> add(false, ms1k, mi.getS(), mij), mt -> add(false, ms1k, mt.getMs(), mij));
}
}
// such that p(Pj)(ms)=mh e? //no refine
for (Entry<MethodSelector, List<Member>> ei : ms1k.entrySet()) {
if (!exactly1NoRefine(ei.getValue())) {
throw new ast.ErrorMessage.NotExaclyOneMethodOrigin(p0, ei.getKey(), ei.getValue());
}
}
List<ClassB.MethodWithType> ms = new ArrayList<>();
// for the smallest j in 1..k such that methods(p,Pj)(msi) of form refine? mh
for (Entry<MethodSelector, List<Member>> ei : ms1k.entrySet()) {
List<Member> memsi = ei.getValue();
if (memsi.get(0) != null && memsi.get(0) instanceof MethodWithType) {
ms.add((MethodWithType) memsi.get(0));
continue;
}
ClassB.MethodImplemented mem0 = (ClassB.MethodImplemented) memsi.get(0);
for (Member mj : memsi) {
// 0 will fail instanceof
if (mj == null || !(mj instanceof MethodWithType)) {
continue;
}
// Mi'=Mi
if (mem0 != null) {
mj = mj.withInner(mem0.getE());
}
ms.add(addRefine((MethodWithType) mj));
break;
}
}
return ms;
}
use of coreVisitors.From in project L42 by ElvisResearchGroup.
the class Translator method useFrom.
//this should take a class, strip out nested and 'from' it so that it is as at top level
static ClassB useFrom(ClassB ct, Path p) {
ArrayList<Member> ms = new ArrayList<Member>();
for (Member m : ct.getMs()) {
m.match(nc -> null, mi -> {
throw Assertions.codeNotReachable();
}, mt -> ms.add(From.from(mt, p)));
}
//for(PathMwt pmwt:ct.getStage().getInherited()){
for (PathMwt pmwt : Collections.<PathMwt>emptyList()) {
if (Functions.getIfInDom(ms, pmwt.getMwt().getMs()).isPresent()) {
continue;
}
ms.add(From.from(pmwt.getMwt(), p));
}
List<Path> sup = tools.Map.of(ti -> (Path) From.fromP(ti.getPath(), p), ct.getSupertypes());
//tools.Map.of(pi->(Path)From.fromP(pi,p),ct.getStage().getInheritedPaths());
List<Path> supAll = sup;
ClassB res = ct.withMs(ms).withSupertypes(tools.Map.of(pi -> pi.toImmNT(), sup));
return res;
}
Aggregations