Developer forums (C::B DEVELOPMENT STRICTLY!) > Plugins development
Code completion using LSP and clangd
AndrewCot:
The plugin spec says they need to be the same. I cannot remember which OS or if it was the plugin, but case differences have caused me problems. I missed this one when comparing CodeBlocks_wx31_64.cbp and clangd_client_wx31_64.cbp changes for the plugin as my CodeBlocks_wx31_64.cbp has the following line for the output:
<Option output="devel31_64/share/CodeBlocks/plugins/clangd_client" prefix_auto="1" extension_auto="1" />
Pecan:
@ ollydbg
This change didn't work for me. (Message #69)
I want the codepoint. I don't get any asserts.
With "wxUniChar uniChar(invChar);" I get:
--- Code: ---Error: Removed clangd response invalid utf8 char:position(3665), hex(85), U(2026), <cant post> ResponseID:textDocument/completion
--- End code ---
Note that I get the codepoint U(2026) back.
With "wxUniChar uniChar(unsigned int(invChar));" I get:
--- Code: ---Error: Removed clangd response invalid utf8 char:position(6899), hex(85), U(85), ,<cant post on sf>. ResponseID:textDocument/completion
--- End code ---
Here I get only the hex value.
So I changed the wxString::Format to:
--- Code: ---msg += wxString::Format("position(%d), hex(%02hhX), U(%x), \'%s\'", invloc, (unsigned int)invChar, (int)uniChar.GetValue(), invStr );
--- End code ---
Note the "(int)uniChar.GetValue()"
I'm using wx3.1.5 on windows and wx3.0 on linux.
Works with no asserts.
Does it work for you
Note: it took me 45 minutes to post this. Don't try and post a msg with an invalid utf8 char. It's a PITA
ollydbg:
--- Quote from: AndrewCot on January 23, 2022, 10:43:26 pm ---The plugin spec says they need to be the same. I cannot remember which OS or if it was the plugin, but case differences have caused me problems. I missed this one when comparing CodeBlocks_wx31_64.cbp and clangd_client_wx31_64.cbp changes for the plugin as my CodeBlocks_wx31_64.cbp has the following line for the output:
<Option output="devel31_64/share/CodeBlocks/plugins/clangd_client" prefix_auto="1" extension_auto="1" />
--- End quote ---
For generated files, I prefer the lower case file name format. Since you have the commit right to the svn repo, can you fix them?
BTW:
The custom variables in build options can be improved from my point of view:
1, I see "TARGET_DEVEL_DIR_AC" and "TARGET_DEVEL_DIR_PECAN" and "TARGET_DEVEL_DIR" in custom variables. Can we just keep only one variable? I mean we can use a "global variable" in the Menu->Settings->Global variables. This way, we can set those variables by our own setting.
2, the name TARGET_DEVEL_DIR is not correct here. I think "DEVEL_DIR" mainly refer to a folder named "devel31_64" which store the built exe or dlls. So, a better name could be "CB_SOURCE_ROOT" which refer the the root of the svn/git source code root folder.
ollydbg:
--- Quote from: Pecan on January 23, 2022, 11:46:27 pm ---@ ollydbg
This change didn't work for me. (Message #69)
I want the codepoint. I don't get any asserts.
With "wxUniChar uniChar(invChar);" I get:
--- Code: ---Error: Removed clangd response invalid utf8 char:position(3665), hex(85), U(2026), <cant post> ResponseID:textDocument/completion
--- End code ---
Note that I get the codepoint U(2026) back.
With "wxUniChar uniChar(unsigned int(invChar));" I get:
--- Code: ---Error: Removed clangd response invalid utf8 char:position(6899), hex(85), U(85), ,<cant post on sf>. ResponseID:textDocument/completion
--- End code ---
Here I get only the hex value.
So I changed the wxString::Format to:
--- Code: ---msg += wxString::Format("position(%d), hex(%02hhX), U(%x), \'%s\'", invloc, (unsigned int)invChar, (int)uniChar.GetValue(), invStr );
--- End code ---
Note the "(int)uniChar.GetValue()"
I'm using wx3.1.5 on windows and wx3.0 on linux.
Works with no asserts.
Does it work for you
--- End quote ---
In my computer, it works differently than yours.
I did a simple test:
--- Code: --- unsigned char invChar = 0x83;
wxUniChar uniChar(invChar);
wxString msg = wxString::Format("hex(%02hhX), U(%x)", (unsigned int)invChar, uniChar.GetValue());
wxLogMessage(msg);
--- End code ---
With the above code, the program just pop up an alert (see screen shot in attachment)
While, with below code, it works OK without the alert.
--- Code: --- unsigned char invChar = 0x83;
wxUniChar uniChar((unsigned int)invChar);
wxString msg = wxString::Format("hex(%02hhX), U(%x)", (unsigned int)invChar, uniChar.GetValue());
wxLogMessage(msg);
--- End code ---
Please note that "Create a character from the 8-bit character value c using the current locale encoding.", which means in my locale encoding, a 0x83 is not a valid Unicode code point, I mean maybe we need two bytes or three bytes to convert it to a Unicode code point.
I'm not sure why in your test case, a 0x83 will becomes a larger value code point U(2026). Maybe, you have different locale encoding as mine. I'm on Windows 7 64bit Chinese language edition, so my local encoding maybe some Chinese language.
--- Quote ---Note: it took me 45 minutes to post this. Don't try and post a msg with an invalid utf8 char. It's a PITA
--- End quote ---
I also meet this kind of forum error from time to time. So bad.
ollydbg:
This is a code format fix:
--- Code: --- clangd_client/src/LSPclient/src/client.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clangd_client/src/LSPclient/src/client.cpp b/clangd_client/src/LSPclient/src/client.cpp
index fadcb51..459b809 100644
--- a/clangd_client/src/LSPclient/src/client.cpp
+++ b/clangd_client/src/LSPclient/src/client.cpp
@@ -702,9 +702,9 @@ void ProcessLanguageClient::OnLSP_Terminated(wxThreadEvent& event_pipedprocess_t
wxCommandEvent terminatedEvt(wxEVT_COMMAND_MENU_SELECTED, XRCID("idLSP_Process_Terminated"));
terminatedEvt.SetEventObject((wxObject*)m_pCBProject);
terminatedEvt.SetInt(processExitCode);
- Manager::Get()->GetAppFrame()->GetEventHandler()->ProcessEvent(terminatedEvt)
+ Manager::Get()->GetAppFrame()->GetEventHandler()->ProcessEvent(terminatedEvt);
-; if (processExitCode != 0)
+ if (processExitCode != 0)
{
wxString msg = "Unusual termination of LanguageProcessClient(LSP) occured.";
if (lspClientLogFile.IsOpened() )
--- End code ---
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version