Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/xinterpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,18 @@ __get_cxx_version ()
return kernel_res;
}

nl::json interpreter::is_complete_request_impl(const std::string& /*code*/)
nl::json interpreter::is_complete_request_impl(const std::string& code)
{
return xeus::create_is_complete_reply("complete", " ");
if (!code.empty() && code[code.size() - 1] == '\\') {
auto found = code.rfind('\n');
if (found == std::string::npos)
found = -1;
auto found1 = found++;
while (isspace(code[++found1])) ;
return xeus::create_is_complete_reply("incomplete", code.substr(found, found1-found));
}

return xeus::create_is_complete_reply("complete");
}

nl::json interpreter::kernel_info_request_impl()
Expand Down
26 changes: 26 additions & 0 deletions test/test_xcpp_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,32 @@ def test_codecomplete(self) -> None:
self.assertEqual(str(reply["content"]["matches"]), "['float', 'foo']")
self.assertEqual(reply["content"]["status"], "ok")

# Continuation
code_continuation_incomplete = ' int foo = 12; \\\n float bar = 1.5f;\\'
code_continuation_complete = ' int foo = 12; \\\n float bar = 1.5f;'

def test_continuation(self) -> None:
if not self.code_continuation_incomplete or not self.code_continuation_complete:
raise SkipTest("No code continuation sample")

# Incomplete
self.flush_channels()
msg_id = self.kc.is_complete(self.code_continuation_incomplete)
reply = self.get_non_kernel_info_reply(timeout=1)
assert reply is not None
self.assertEqual(reply["msg_type"], "is_complete_reply")
self.assertEqual(str(reply["content"]["indent"]), " ")
self.assertEqual(reply["content"]["status"], "incomplete")

# Complete
self.flush_channels()
msg_id = self.kc.is_complete(self.code_continuation_complete)
reply = self.get_non_kernel_info_reply(timeout=1)
assert reply is not None
self.assertEqual(reply["msg_type"], "is_complete_reply")
self.assertEqual(str(reply["content"]["indent"]), "")
self.assertEqual(reply["content"]["status"], "complete")


class XCppTests(jupyter_kernel_test.KernelTests):

Expand Down