use of ast.Ast.Position 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.Ast.Position in project L42 by ElvisResearchGroup.
the class UsedPaths method usedPathsL.
//- usedPathsL(L, Cs1..Csn)=usedInnerL(L(Cs1),Cs1) U ... U usedInnerL(L(Csn),Csn)
private static Paths usedPathsL(Program pForError, ClassB l, List<List<Ast.C>> css, Phase phase0) {
Paths result = Paths.empty();
for (List<Ast.C> csi : css) {
assert !csi.isEmpty();
ClassB li;
try {
li = l.getClassB(csi);
} catch (ErrorMessage.PathMetaOrNonExistant pne) {
//.withWherePathWasWritten(p);
throw pne.withListOfNodeNames(csi).withCb(l);
}
ClassB liTop = li;
if (csi.size() != 0) {
liTop = l.getClassB(Collections.singletonList(csi.get(0)));
}
assert IsCompiled.of(liTop);
//checked after for newPaths: when the offending value is produced, so we have more context for error message
// throw new ErrorMessage.PathMetaOrNonExistant(true, Collections.singletonList(csi.get(0)), l, null,null);
Paths newPaths = usedInnerL(li, csi, phase0);
try {
newPaths.checkAllDefined(pForError);
} catch (ErrorMessage.PathMetaOrNonExistant pne) {
Position p = FindPathUsage._locate(pForError, li, Path.outer(csi.size() + 1, /*TODO we need to fix this crap for real*/
pne.getListOfNodeNames()));
throw pne.withWherePathWasWritten(p);
}
result = result.union(newPaths);
}
return result;
}
use of ast.Ast.Position in project L42 by ElvisResearchGroup.
the class ReplState method add.
public ReplState add(String code) {
Expression.ClassB cbEmpty = new ClassB(Doc.empty(), new ast.Ast.InterfaceHeader(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Position.noInfo);
try {
//parse
Expression.ClassB codeTmp = (ClassB) Parser.parse("Repl", "{" + code + "}");
//new original
ClassReuse newOriginal = this.originalL;
List<ast.Expression.ClassB.Member> newOriginalMs = newOriginal.getInner().getMs();
newOriginalMs.addAll(codeTmp.getMs());
newOriginal.withInner(newOriginal.getInner().withMs(newOriginalMs));
//new src to desugar
List<ClassB.Member> newMs = new ArrayList<>();
int nestedAdded = 0;
for (Member m : this.desugaredL.getMs()) {
if (!(m instanceof NestedClass)) {
continue;
}
NestedClass nc = (NestedClass) m;
newMs.add(new ClassB.NestedClass(Doc.empty(), nc.getName(), cbEmpty, nc.getP()));
nestedAdded += 1;
}
newMs.addAll(codeTmp.getMs());
codeTmp = codeTmp.withMs(newMs);
Expression code2 = Desugar.of(codeTmp);
ExpCore.ClassB code3 = (ExpCore.ClassB) code2.accept(new InjectionOnCore());
// TODO: will die after new reduction Refresh of position identities, it is used to generate correct Java code.
code3 = (ExpCore.ClassB) code3.accept(new CloneVisitor() {
@Override
public ExpCore visit(ExpCore.ClassB cb) {
Position p = cb.getP();
cb = cb.withP(new Position(p.getFile(), p.getLine1(), p.getPos1(), p.getLine2(), p.getPos2(), p.get_next()));
return super.visit(cb);
}
});
//integrate new desugared src with old desugared code
List<Member> resultMs = new ArrayList<>(this.desugaredL.getMs());
for (int i = nestedAdded; i < code3.getMs().size(); i++) {
resultMs.add(code3.getMs().get(i));
}
code3 = code3.withMs(resultMs);
//call the repl and return
ExpCore.ClassB result = ProgramReduction.allSteps(code3);
return new ReplState(this.originalS + "\n" + code, newOriginal, result);
} catch (ParseCancellationException parser) {
System.out.println(parser.getMessage());
return null;
} catch (ErrorMessage msg) {
ErrorFormatter.topFormatErrorMessage(msg);
return null;
}
}
use of ast.Ast.Position in project L42 by ElvisResearchGroup.
the class DesugarVars method getFakeBlock.
private RoundBlock getFakeBlock(X x, X z, RoundBlock s, List<VarDec> varDecs, int d3First) {
Position pos = Desugar.getPosition(s);
List<Expression.BlockContent> fakeContent = new ArrayList<>();
List<VarDec> fakeDecs = new ArrayList<VarDec>();
if (d3First != -1) {
//d3 not empty
fakeDecs.addAll(varDecs.subList(d3First, varDecs.size()));
}
fakeContent.add(new Expression.BlockContent(fakeDecs, s.getContents().get(0).get_catch()));
RoundBlock fake = s.withContents(fakeContent);
fake = (RoundBlock) XEqOpInZEqOp.of(x, z, fake);
fake = (RoundBlock) XInE.of(x, Desugar.getMCall(pos, z, "#inner", Desugar.getPs()), fake);
return fake;
}
use of ast.Ast.Position in project L42 by ElvisResearchGroup.
the class ErrorFormatter method formatError.
public static ErrorMessage.UserLevelError formatError(Program p, ErrorMessage msg, Class<?> c) throws IllegalAccessException, NoSuchFieldException, SecurityException {
String errorStart = "\n\n\n------------------------------------\n";
ArrayList<Ast.Position> ps = new ArrayList<Ast.Position>();
String errorTxt = "";
errorTxt += infoFields(msg, c, ps);
try {
errorTxt += "Surrounding context:\n";
errorTxt += envs(msg, c, ps);
ArrayList<Position> ps2 = ps;
if (!ps.isEmpty()) {
ps2 = new ArrayList<>();
}
try {
errorTxt += ctxP(msg, c, ps2);
} catch (NoSuchFieldException ignored) {
}
} catch (NoSuchFieldException ignored) {
}
pos(msg, c, ps);
Position pos = positionsFilter(ps);
if (c == ErrorMessage.DotDotDotCanNotBeResolved.class) {
// ErrorMessage.DotDotDotCanNotBeResolved ddd=(ErrorMessage.DotDotDotCanNotBeResolved)msg;
}
errorTxt = "Error kind: " + c.getSimpleName() + "\nPosition:" + ((pos == null) ? "unknown" : pos.toString()) + "\n" + errorTxt;
//ps+"\n"+errorTxt;
ErrorMessage.UserLevelError.Kind kind = findKind(msg);
switch(kind) {
case TypeError:
errorTxt = errorStart + "runStatus: " + kind.name() + "\n" + errorTxt;
break;
case MetaError:
errorTxt = errorStart + "runStatus: " + kind.name() + "\n" + "Error in generating the following class: \n" + reportPlaceOfMetaError(p, msg) + /*.replace(".\n","\n")*/
"\n----------\n" + errorTxt;
default:
break;
}
Throwable cause = null;
if (msg.getCause() != null) {
if (msg.getCause() instanceof ErrorMessage) {
ErrorMessage.UserLevelError uleCause = formatError(p, (ErrorMessage) msg.getCause());
cause = uleCause;
errorTxt += "\n-------- caused by -----\n" + uleCause.getErrorTxt();
} else {
cause = msg.getCause();
}
}
ErrorMessage.UserLevelError result = new ErrorMessage.UserLevelError(kind, pos, msg, errorTxt);
result.initCause(cause);
return result;
}
Aggregations