Commit 3580ee31 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

ErlangCodeFactory: fix production of try-of structures.

parent f4864559
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -958,7 +958,7 @@ public class ErlangCodeFactory
		varElements[0] = new OtpErlangAtom("clause");
		varElements[1] = new OtpErlangLong(1);
		varElements[2] = new OtpErlangList(this.parseEmptyVar());
		varElements[3] = new OtpErlangList(new OtpErlangObject[0]);
		varElements[3] = new OtpErlangList();
		varElements[4] = new OtpErlangList(this.parseEmptyLiteral());

		return new OtpErlangTuple(varElements);
@@ -1059,22 +1059,11 @@ public class ErlangCodeFactory
	// Try Catch
	private OtpErlangTuple parseTry(Node _try)
	{
		final List<Node> tryClauses = edg.getChildren(_try);
		final Node last = tryClauses.get(tryClauses.size()-1);
		final List<Node> tryClauses = edg.getChildrenNonResult(_try);
		final OtpErlangObject[] tryElements = new OtpErlangObject[6];

		// Parse after Part
		if (last.getType() == Node.Type.AfterTry)
		{
			tryClauses.remove(last);
			final List<Node> body = edg.getChildren(last);
			final List<Node> afterExpressions = edg.getChildren(body.get(0));
			tryElements[5] = this.parseAfterExpressions(afterExpressions, false);
		}
		else
		{
			tryElements[5] = new OtpErlangList(new OtpErlangObject[0]);
		}
		tryElements[5] = parseAfterTry(tryClauses);

		tryElements[0] = new OtpErlangAtom("try");
		tryElements[1] = new OtpErlangLong(1);
@@ -1082,6 +1071,7 @@ public class ErlangCodeFactory
		// Parse try part
		final Node tryPart = tryClauses.remove(0);
		final List<Node> tryExpressions = edg.getChildren(tryPart);
		tryClauses.addAll(0, extractCases(tryExpressions));
		tryElements[2] = this.parse(tryExpressions, false);

		// Parse catch part
@@ -1090,12 +1080,30 @@ public class ErlangCodeFactory
		tryElements[4] = this.parseCatchClauses(catchClauses);

		// Parse try_of clauses
		tryElements[3] = this.parseClauses(tryClauses);
		if (_try.getType() == Node.Type.TryOf && tryElements[3].equals(new OtpErlangList(new OtpErlangObject[0])))
		tryElements[3] = this.parseCaseClauses(tryClauses);
		if (_try.getType() == Node.Type.TryOf && tryElements[3].equals(new OtpErlangList()))
			tryElements[3] = new OtpErlangList(this.parseEmptyClause());
		return new OtpErlangTuple(tryElements);
	}

	private OtpErlangList parseAfterTry(List<Node> tryClauses) {
		Node last = tryClauses.get(tryClauses.size() - 1);
		if (last.getType() == Node.Type.AfterTry) {
			tryClauses.remove(last);
			final List<Node> body = edg.getChildren(last);
			if (!body.isEmpty())
				return this.parseAfterExpressions(edg.getChildren(body.get(0)), false);
		}
		return new OtpErlangList();
	}

	private List<Node> extractCases(List<Node> expressions) {
		List<Node> cases = expressions.stream().filter(n -> n.getType() == Node.Type.Case).toList();
		expressions.removeAll(cases);
		cases.stream().map(edg::getResFromNode).forEach(expressions::remove);
		return cases;
	}

	private OtpErlangTuple parseEmptyClause()
	{
		final OtpErlangObject[] clauseElements = new OtpErlangObject[5];
@@ -1103,7 +1111,7 @@ public class ErlangCodeFactory
		clauseElements[0] = new OtpErlangAtom("clause");
		clauseElements[1] = new OtpErlangLong(1);
		clauseElements[2] = new OtpErlangList(this.parseEmptyVar());
		clauseElements[3] = new OtpErlangList(new OtpErlangObject[0]);
		clauseElements[3] = new OtpErlangList();
		clauseElements[4] = new OtpErlangList(this.parseEmptyLiteral());

		return new OtpErlangTuple(clauseElements);
@@ -1149,7 +1157,7 @@ public class ErlangCodeFactory
		emptyCatch[0] = new OtpErlangAtom("clause");
		emptyCatch[1] = new OtpErlangLong(1);
		emptyCatch[2] = new OtpErlangList(this.parseCatchEmptyPattern());
		emptyCatch[3] = new OtpErlangList(new OtpErlangObject[0]);
		emptyCatch[3] = new OtpErlangList();
		emptyCatch[4] = new OtpErlangList(this.parseEmptyLiteral());

		return new OtpErlangTuple(emptyCatch);
@@ -1205,7 +1213,7 @@ public class ErlangCodeFactory
	{
		final List<Node> ors = edg.getChildren(guards);
		if (ors.size() == 0)
			return new OtpErlangList(new OtpErlangObject[0]);
			return new OtpErlangList();
		final Node or = ors.get(0);

		final List<Node> ands = edg.getChildren(or);