mirror of
https://github.com/enso-org/enso.git
synced 2024-12-23 12:52:23 +03:00
Allow empty body blocks with comments (#10969)
close #10849 Changelog: - update: empty body blocks return an `Empty` node resulting in `Nothing`
This commit is contained in:
parent
0543a69594
commit
bc3ab2c7e1
@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.enso.compiler.core.ir.Empty;
|
||||
import org.enso.compiler.core.ir.Expression;
|
||||
import org.enso.compiler.core.ir.Location;
|
||||
import org.enso.compiler.core.ir.Module;
|
||||
import org.enso.compiler.core.ir.expression.errors.Syntax;
|
||||
@ -580,6 +581,19 @@ public class ErrorCompilerTest extends CompilerTest {
|
||||
assertTrue(method.body() instanceof Empty);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBodyWithComment() throws Exception {
|
||||
var ir = parse("""
|
||||
main =
|
||||
# comment
|
||||
""");
|
||||
|
||||
var method = (Method) ir.bindings().apply(0);
|
||||
var body = (Expression.Block) method.body();
|
||||
assertTrue(body.expressions().isEmpty());
|
||||
assertTrue(body.returnValue() instanceof Empty);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exportAllIsNotAllowed() {
|
||||
var ir = parse("""
|
||||
|
@ -7463,6 +7463,54 @@ class RuntimeServerTest
|
||||
)
|
||||
}
|
||||
|
||||
it should "run methods with empty body ending with comment" in {
|
||||
val contextId = UUID.randomUUID()
|
||||
val requestId = UUID.randomUUID()
|
||||
val moduleName = "Enso_Test.Test.Main"
|
||||
val code =
|
||||
"""foo =
|
||||
| # TODO
|
||||
|
|
||||
|main =
|
||||
| foo
|
||||
|""".stripMargin.linesIterator.mkString("\n")
|
||||
|
||||
val mainFile = context.writeMain(code)
|
||||
|
||||
// create context
|
||||
context.send(Api.Request(requestId, Api.CreateContextRequest(contextId)))
|
||||
context.receive shouldEqual Some(
|
||||
Api.Response(requestId, Api.CreateContextResponse(contextId))
|
||||
)
|
||||
|
||||
// Set sources for the module
|
||||
context.send(
|
||||
Api.Request(requestId, Api.OpenFileRequest(mainFile, code))
|
||||
)
|
||||
context.receive shouldEqual Some(
|
||||
Api.Response(Some(requestId), Api.OpenFileResponse)
|
||||
)
|
||||
|
||||
// push main
|
||||
context.send(
|
||||
Api.Request(
|
||||
requestId,
|
||||
Api.PushContextRequest(
|
||||
contextId,
|
||||
Api.StackItem.ExplicitCall(
|
||||
Api.MethodPointer(moduleName, moduleName, "main"),
|
||||
None,
|
||||
Vector()
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
context.receiveNIgnoreStdLib(2) should contain theSameElementsAs Seq(
|
||||
Api.Response(requestId, Api.PushContextResponse(contextId)),
|
||||
context.executionComplete(contextId)
|
||||
)
|
||||
}
|
||||
|
||||
it should "support file edit notification with IdMap" in {
|
||||
val contextId = UUID.randomUUID()
|
||||
val requestId = UUID.randomUUID()
|
||||
|
@ -1019,20 +1019,21 @@ final class TreeToIr {
|
||||
}
|
||||
last = translateExpression(expr, false);
|
||||
}
|
||||
// If the block ended in a documentation node without an expression, last may be null;
|
||||
// the return value of the block is a doc comment.
|
||||
// (This is to match the behavior of AstToIr; after the parser transition, we should probably
|
||||
// ignore the orphaned documentation and return the last actual expression in the block.)
|
||||
if (last == null && expressions.size() > 0) {
|
||||
last = expressions.get(expressions.size() - 1);
|
||||
expressions.remove(expressions.size() - 1);
|
||||
var locationWithANewLine = getIdentifiedLocation(body, 0, 0, null);
|
||||
if (last == null) {
|
||||
if (expressions.isEmpty()) {
|
||||
last = new Empty(locationWithANewLine, meta());
|
||||
} else {
|
||||
last = expressions.get(expressions.size() - 1);
|
||||
expressions.remove(expressions.size() - 1);
|
||||
}
|
||||
}
|
||||
var list = CollectionConverters.asScala(expressions.iterator()).toList();
|
||||
var locationWithANewLine = getIdentifiedLocation(body, 0, 0, null);
|
||||
if (last != null && last.location().isDefined()
|
||||
if (last != null
|
||||
&& last.location().isDefined()
|
||||
&& last.location().get().end() != locationWithANewLine.get().end()) {
|
||||
var patched = new Location(last.location().get().start(),
|
||||
locationWithANewLine.get().end() - 1);
|
||||
var patched =
|
||||
new Location(last.location().get().start(), locationWithANewLine.get().end() - 1);
|
||||
var id = IdentifiedLocation.create(patched, last.location().get().id());
|
||||
last = last.setLocation(Option.apply(id));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user