Code::Blocks Forums

Developer forums (C::B DEVELOPMENT STRICTLY!) => Development => CodeCompletion redesign => Topic started by: Loaden on March 24, 2010, 08:47:56 am

Title: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 08:47:56 am
Code
Index: src/sdk/cbeditor.cpp

===================================================================

--- src/sdk/cbeditor.cpp (revision 6196)

+++ src/sdk/cbeditor.cpp (working copy)

@@ -414,6 +414,21 @@

             control->GotoPos(pos);
             if (ch == _T('{'))
             {
+                int curLine = control->GetCurrentLine();
+                int keyLine = curLine;
+                wxString text;
+                do
+                {
+                    int keyPos = control->GetLineIndentPosition(keyLine);
+                    int start = control->WordStartPosition(keyPos, true);
+                    int end = control->WordEndPosition(keyPos, true);
+                    text = control->GetTextRange(start, end);
+                }
+                while (text.IsEmpty() && --keyLine);
+
+                if (text == _T("class") || text == _T("struct"))
+                    control->InsertText(control->GetLineEndPosition(curLine), _T(";"));
+
                 const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
                 if (reg.Matches(control->GetCurLine()))
                 {

Example, this code:
Code
class A {|}
class B
{
    |
}

struct A {|}
struct B
{
    |
}

After apply this patch, it's auto changed to:
Code
class A {|};
class B
{
    |
};

struct A {|};
struct B
{
    |
};

A semicolon add here: };

[attachment deleted by admin]
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: oBFusCATed on March 24, 2010, 10:01:16 am
What will happen if I type:
Code
{|}
or
{
    |
}
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 10:10:56 am
Sorry, I do not know what you mean.
If not class or struct, then it do nothing.
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 02:05:35 pm
Update: support 'enum' keyword
Update2: support 'union' keyword  :P
Code
Index: src/sdk/cbeditor.cpp

===================================================================

--- src/sdk/cbeditor.cpp (revision 6196)

+++ src/sdk/cbeditor.cpp (working copy)

@@ -414,6 +414,21 @@

             control->GotoPos(pos);
             if (ch == _T('{'))
             {
+                int curLine = control->GetCurrentLine();
+                int keyLine = curLine;
+                wxString text;
+                do
+                {
+                    int keyPos = control->GetLineIndentPosition(keyLine);
+                    int start = control->WordStartPosition(keyPos, true);
+                    int end = control->WordEndPosition(keyPos, true);
+                    text = control->GetTextRange(start, end);
+                }
+                while (text.IsEmpty() && --keyLine);
+
+                if (text == _T("class") || text == _T("struct") || text == _T("enum") || text == _T("union"))
+                    control->InsertText(control->GetLineEndPosition(curLine), _T(";"));
+
                 const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
                 if (reg.Matches(control->GetCurLine()))
                 {
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: ptDev on March 24, 2010, 03:15:56 pm
A small suggestion for your patch: you should also support the "union" keyword.

Wow, that was fast! You guys are great! :)
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: MortenMacFly on March 24, 2010, 04:13:09 pm
What happens in my whole file looks like:
Code
{ | }
???
You don't check for the first line / character in the editor being reached, or am I wrong?!
If so, your code my result in an infinite loop, maybe even in a crash.
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: ollydbg on March 24, 2010, 04:24:40 pm
What happens in my whole file looks like:
Code
{ | }
???
You don't check for the first line / character in the editor being reached, or am I wrong?!
If so, your code my result in an infinite loop, maybe even in a crash.
@morten:

Loaden use this for condition below:
Code
while (text.IsEmpty() && --keyLine);

Look at the variable: keyLine, when it reaches zero, the loop will break, so, there will never be a infinite loop.

Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: MortenMacFly on March 24, 2010, 04:27:49 pm
Loaden use this for condition below:
Code
while (text.IsEmpty() && --keyLine);
Look at the variable: keyLine, when it reaches zero, the loop will break, so, there will never be a infinite loop.
Indeed. I missed that. C++ style calculations inside an if/while statement - I don't allow such in my coding style, so I am not used to it.
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: thomas on March 24, 2010, 04:30:15 pm
namespace blah{};  ?
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 04:37:58 pm
namespace blah{};  ?
OK, I will fix it!  :D
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 04:40:28 pm
Loaden use this for condition below:
Code
while (text.IsEmpty() && --keyLine);
Look at the variable: keyLine, when it reaches zero, the loop will break, so, there will never be a infinite loop.
Indeed. I missed that. C++ style calculations inside an if/while statement - I don't allow such in my coding style, so I am not used to it.

Please test this demo:


Code
class A



{
If not use "do/while", when type '{', it can not judge the class type. :(
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: MortenMacFly on March 24, 2010, 04:43:29 pm
Please test this demo:
Code
class A



{
If not use "do/while", when type '{', it can not judge the class type. :(
??? Strange. I did not apply in my copy yet, but what if you use:
Code
                do
                {
                    int keyPos = control->GetLineIndentPosition(keyLine);
                    int start = control->WordStartPosition(keyPos, true);
                    int end = control->WordEndPosition(keyPos, true);
                    text = control->GetTextRange(start, end)
                    text.Trim();
                    --keyLine;
                }
                while ( text.IsEmpty() && (keyLine>0) );
Notice: This is untested.
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: ollydbg on March 24, 2010, 04:46:38 pm
But noone will write this kind of code, search to the previous line is enough.
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 04:51:14 pm
??? Strange. I did not apply in my copy yet, but what if you use:
Code
                do
                {
                    int keyPos = control->GetLineIndentPosition(keyLine);
                    int start = control->WordStartPosition(keyPos, true);
                    int end = control->WordEndPosition(keyPos, true);
                    text = control->GetTextRange(start, end)
                    text.Trim();
                    --keyLine;
                }
                while ( text.IsEmpty() && (keyLine>0) );
Notice: This is untested.
I test it, but it's not work for 'namespace {' question.
I will check it, and fix this problem.
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: oBFusCATed on March 24, 2010, 04:55:42 pm
But noone will write this kind of code, search to the previous line is enough.

Code

class A :
       public B1,
       public B2,
       public B3,
       public B4
{
     |
};

Replace A, B1-4 with very long strings and for sure someone will write such code :)

Code
namespace my
{
}; <--- here the semicolon is not needed!
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 05:13:36 pm
namespace blah{};  ?
namespace blah{};
Sorry, I can not reproduce this problem.
Can you give me some demo?
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: Loaden on March 24, 2010, 05:57:53 pm
I make a new patch, welcome test.
Code
Index: src/sdk/cbeditor.cpp

===================================================================

--- src/sdk/cbeditor.cpp (revision 6195)

+++ src/sdk/cbeditor.cpp (working copy)

@@ -414,6 +414,23 @@

             control->GotoPos(pos);
             if (ch == _T('{'))
             {
+                int curLine = control->GetCurrentLine();
+                int keyLine = curLine;
+                wxString text;
+                do
+                {
+                    int keyPos = control->GetLineIndentPosition(keyLine);
+                    int start = control->WordStartPosition(keyPos, true);
+                    int end = control->WordEndPosition(keyPos, true);
+                    text = control->GetTextRange(start, end);
+                }
+                while ((text.IsEmpty() || text == _T("public") || text == _T("protected") || text == _T("private"))
+                       && text != _T("namespace")
+                       && (--keyLine));
+
+                if (text == _T("class") || text == _T("struct") || text == _T("enum") || text == _T("union"))
+                    control->InsertText(control->GetLineEndPosition(curLine), _T(";"));
+
                 const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
                 if (reg.Matches(control->GetCurLine()))
                 {

[attachment deleted by admin]
Title: Re: Patch, Auto add a semicolon for '{}' auto-complete
Post by: thomas on March 25, 2010, 10:56:17 am
Can you give me some demo?
Code
namespace my
{
}; <--- here the semicolon is not needed!
That's what I wanted to point out:)
Although most compilers in non-strict mode will silently convert that trailing semicolon to ((void)0); and ignore it, nevertheless it doesn't belong there.