use of ast.Expression.ClassB.Member in project L42 by ElvisResearchGroup.
the class InjectionOnSugar method visit.
@Override
public Expression visit(ClassB s) {
Doc doc1 = s.getDoc1();
Header h = (s.isInterface()) ? new Ast.InterfaceHeader() : new Ast.TraitHeader();
List<Type> supertypes = s.getSupertypes();
List<Member> members = new ArrayList<>();
for (ast.ExpCore.ClassB.Member mi : s.getMs()) {
members.add(mi.match(nc -> new Expression.ClassB.NestedClass(nc.getDoc(), nc.getName(), lift(nc.getInner()), nc.getP()), mimpl -> new Expression.ClassB.MethodImplemented(mimpl.getDoc(), mimpl.getS(), lift(mimpl.getInner()), mimpl.getP()), mwt -> {
Doc idoc = mwt.getDoc();
MethodSelector is = mwt.getMs();
MethodType mt = mwt.getMt();
return new Expression.ClassB.MethodWithType(idoc, is, mt, lift(mwt.get_inner()), mwt.getP());
}));
}
return new Expression.ClassB(doc1, h, Collections.emptyList(), supertypes, members, s.getP());
}
use of ast.Expression.ClassB.Member in project L42 by ElvisResearchGroup.
the class Desugar method visit.
public Expression visit(ClassB s) {
Position pos = s.getP();
assert !(s.getH() instanceof ConcreteHeader);
if (!s.getFields().isEmpty()) {
List<Member> ms = s.getFields().stream().flatMap(f -> Desugar.field(pos, f)).collect(Collectors.toList());
ms.addAll(s.getMs());
s = s.withMs(ms).withH(new Ast.TraitHeader());
}
Set<String> oldUsedVars = this.usedVars;
HashMap<String, Type> oldVarEnv = this.varEnv;
try {
s = (ClassB) super.visit(s);
s = FlatFirstLevelLocalNestedClasses.of(s, this);
s = DesugarCatchDefault.of(s);
return s;
} finally {
this.usedVars = oldUsedVars;
this.varEnv = oldVarEnv;
}
}
use of ast.Expression.ClassB.Member in project L42 by ElvisResearchGroup.
the class CheckVarUsedAreInScope method visit.
public Expression visit(ClassB s) {
for (Member m : s.getMs()) {
m.match(nc -> {
CheckVarUsedAreInScope.of(nc.getInner(), Collections.emptyList());
return null;
}, mi -> {
List<String> names = new ArrayList<>(mi.getS().getNames());
names.add("this");
CheckVarUsedAreInScope.of(mi.getInner(), names);
return null;
}, mt -> {
if (mt.getInner().isPresent()) {
List<String> names = new ArrayList<>(mt.getMs().getNames());
names.add("this");
CheckVarUsedAreInScope.of(mt.getInner().get(), names);
}
;
return null;
});
}
return s;
}
use of ast.Expression.ClassB.Member in project L42 by ElvisResearchGroup.
the class CloneVisitor method visit.
public Expression visit(ClassB s) {
Header h = liftH(s.getH());
List<FieldDec> fs = Map.of(this::liftF, s.getFields());
List<Type> superT = Map.of(this::liftT, s.getSupertypes());
List<Member> ms = Map.of(this::liftM, s.getMs());
return new ClassB(liftDoc(s.getDoc1()), h, fs, superT, ms, s.getP());
}
use of ast.Expression.ClassB.Member in project L42 by ElvisResearchGroup.
the class Desugar method visit.
public Expression visit(ClassReuse s) {
ClassB res = lift(s.getInner());
//ClassB reused2=OnLineCode.getCode(s.getUrl());
ExpCore.ClassB _reused = this.importedLibs.get(s.getUrl());
assert _reused != null : s.getUrl() + " " + this.importedLibs.keySet() + this.importedLibs.get(s.getUrl()) + this.importedLibs;
ExpCore.ClassB reused = RefreshUniqueNames.refreshTopLevel(_reused);
for (Member m2 : res.getMs()) {
m2.match(nc2 -> {
for (ast.ExpCore.ClassB.NestedClass nc1 : reused.ns()) {
if (nc1.getName().equals(nc2.getName())) {
throw new ast.ErrorMessage.NotWellFormedMsk(s, s, "Nested class \"" + nc1.getName() + "\" already present in reused library " + s.getUrl());
}
}
return null;
}, mi -> {
return null;
}, mwt2 -> {
for (ast.ExpCore.ClassB.MethodWithType mwt1 : reused.mwts()) {
if (mwt1.getMs().equals(mwt2.getMs())) {
throw new ast.ErrorMessage.NotWellFormedMsk(s, s, "Method with type \"" + mwt1.getMs() + "\" already present in reused library " + s.getUrl());
}
}
return null;
});
}
return new ClassReuse(res, s.getUrl(), reused);
}
Aggregations