Author |
Topic |
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Aug 16 2004 : 05:16:20 AM
|
This is a weird bug, but I seem to be able to reproduce it reliably.
Consider the following code:class CTeddyBear
{
int GetTeddyBearName();
int GetTeddyBearColour();
int HelloBear()
{
int x = GetName();
}
}; Now try and correct GetName() to GetTeddyBearName() by typing a T after Get, and accepting the suggestion from the suggestion box. When I do this, the result is GetTeddyBearNameName() -- in other words, the suggestion is inserted rather than overwriting the end of GetName() as it should.
The weird thing is that this only seems to happen if the trailing portion is "Name" or "name". Correcting GetColour() to GetTeddyBearColour() works as expected. So does correcting GetrName() to GetTeddyBearName(), or Getame() to GetTeddyBearName().
VAX 1246, .NET 2003. |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
Edited by - Stephen on Aug 16 2004 05:17:18 AM |
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Aug 16 2004 : 07:48:32 AM
|
It also fails if the last word is Count. But, as I mentioned above, sometimes it works fine. |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Aug 16 2004 : 07:57:23 AM
|
confirmed, .NET 2003 and VAX 1246 i will add a case tonight when i get home. |
zen is the art of being at one with the two'ness |
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Aug 16 2004 : 08:11:12 AM
|
i have found a possible pattern. i have "stable symbols in italic" turned on. both GetName() and GetCount() are italic.
if the function is italic, then you type one character which prompts a suggestion listbox which you accept with tab then it goes wrong.
*experiments* this does not happen with Get|EditSel() it does happen with Get|Locale() i had to shrink the TeddyBear class to get this to show up in the suggestion listbox.
GetEdit|Sel() is correctly converted into GetEditTeddyBearSel()
*doh* Init|Storage() is correctly converted into InitTeddyBearStorage()
there seems to be a pattern here, but i am not certain of the trigger condition. |
zen is the art of being at one with the two'ness |
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Aug 16 2004 : 08:38:50 AM
|
this has just happened to me. in a .h editing the line:
class QEdit; it became:
class QL|Edit; at which point i accepted the suggestion listbox "QLineEdit" and i ended up with:
class QLineEdit|Edit; |
zen is the art of being at one with the two'ness |
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Aug 16 2004 : 4:13:13 PM
|
case=212 |
zen is the art of being at one with the two'ness |
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Aug 17 2004 : 04:46:44 AM
|
Colour was OK, but Color is also broken. Wild guess, but I'm thinking it might be something to do with whether the trailing portion is a symbol that is already known about somewhere else? (Not that my test file includes any header files, but I think VAX always knows about standard headers even if they're not included). |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Aug 17 2004 : 06:03:13 AM
|
yes, this fits all of the cases i found. all of the problem end parts are shown as italic, either coloured as functions or macro's when typed in on their own.
like you, i have very few includes, but the static symbols seem to be coming from a single global lookup list, regardless of the current includes. |
zen is the art of being at one with the two'ness |
|
|
support
Whole Tomato Software
5566 Posts |
Posted - Aug 18 2004 : 6:17:07 PM
|
Your assessment is correct. VA X does not replace trailing characters if they form a symbol valid in any context. VA X assumes you are typing in front of existing code. (VA X checks any context because this is quick -- checking current context slows the insert too much.)
See "Suggestions Within Symbols" near the bottom of: http://www.wholetomato.com/products/features/suggestion.html?more=yes
and "Completing Text to Left of Caret" in: http://www.wholetomato.com/products/features/members.html?more=yes
We opted for this behavior because VA X used to eat code. We believe we aggravated Larry the most. Can't remember.
Can you suggest a case in which VA X should eat code, ie an exception to the policy of not eating if the trailing characters make a symbol? |
Edited by - support on Aug 18 2004 6:27:17 PM |
|
|
WannabeeDeveloper
Tomato Guru
Germany
775 Posts |
Posted - Aug 18 2004 : 6:30:51 PM
|
Hmm... I'd say eat everything that is already part of the Symbol I try to get, until a non-symbol-character (like "{[()]}"). For example, if I have a variable called MyName and MyLastName, I put the Caret into MyName and type MyL|Name, it should suggest MyLastName, and on accepting completely replace MyName with MyLastName. |
|
Edited by - WannabeeDeveloper on Aug 18 2004 6:31:37 PM |
|
|
support
Whole Tomato Software
5566 Posts |
Posted - Aug 18 2004 : 7:10:10 PM
|
Wannabee's example is what VA X did long ago. The scenario seems fine until you have existing code, place the caret in front of it and start typing. Your existing code starts disappearing. Oops.
If you have this statement:
name(); and want to add an "if (MyLastName==0)" to guard the call to name(), you move your caret in front of name() and start typing:
if (MyL|name(); If you accept a suggestion for MyLastName, you want name() to remain intact:
if (MyLastName|name(); We found it more annoying to have disappearing code, and so did our users, than it was to have extra remnants. |
Edited by - support on Aug 18 2004 8:06:51 PM |
|
|
WannabeeDeveloper
Tomato Guru
Germany
775 Posts |
Posted - Aug 18 2004 : 7:17:43 PM
|
Yup, looks like the old behaviour. But, whenever I (just me, might be different for others) enter any new code above any existing code, first I add some NewLines/Blank Lines to the code, in order to find it quickly or be able to delete it without having to be too cautious (frightened to delete working, existing code when I rollback my stupid experiments).
That way the "disappearing code" never occured to me.
It's bad that it did for other users...
|
|
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Aug 19 2004 : 04:40:49 AM
|
I see the conflict, but I would definitely prefer it to eat. Like Wannabee, I don't think I would type new code onto the beginning of a word like in your example.
The problem at the moment is that almost any real word falls foul of this rule, because it occurs in a header file somewhere. Which reminds me -- you didn't explain why my example fails at all, given that nothing is #include'd in that file. Does VAX really implicitly include all standard header files in every file? Doesn't it have some better idea than that of what's in scope? |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Aug 19 2004 : 06:02:06 AM
|
Stephen, the answer is the comment:
quote: Originally posted by support
VA X does not replace trailing characters if they form a symbol valid in any context.
taking static symbols as an example, there seems to be a single global list of these, which is built and then remembered when these are parsed.
i have seen static symbols shown in italics even though the relevant .h has not yet been included.
from memory of other threads, this is down to VAX's policy of helping you type, which can involve pulling in suggestions from any open code file.
as for adding in front of existing code, i often have to go from:
testFuncion(); via:
nE|testFuncion(); on the way to:
nErr = |testFuncion(); when i suddenly care about the return value, normally when i am debugging something, or someone else has just changed one of the ground rules on me.
while developing new code, changing the forward declarations of class names in .h's is also very common, hence my example:
class QEdit; becoming:
class QL|Edit; on the way to:
class QLineEdit|Edit;
to be honest, i want VAX to read my mind, so it will do the correct thing always
*considers* now i know what is happening, and why, i can live with this. deleting code when i am adding if statements or assignment statements to existing code would be a *deeply* bad thing
WannabeeDeveloper, if i am making small changes to code i know well i simply edit the lines directly, and use the undo buffer if i need to. sometimes i will undo 20 minutes of work if it all fails horribly.
however, if i am doing a bulk replace of a chunk of code, i will comment the original code, comment it out, and then edit the live copy.
this is all about saving typing. it is less typing to just edit the code in place. also, less chance of forgetting to delete the reference code. |
zen is the art of being at one with the two'ness |
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Aug 19 2004 : 06:46:58 AM
|
It seems to pull in suggestions from files that have never been included or seen. I opened my TeddyBear file as soon as I started up the IDE, without opening any project, and it still had this problem.
I think this may be the cause of a lot of the bugs where symbols are coloured in the wrong category, just because they happen to exist in another category in some other unrelated file. |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
support
Whole Tomato Software
5566 Posts |
Posted - Aug 19 2004 : 5:56:37 PM
|
Suggestions are taken from many places, including recently typed strings and nearby strings. VA X keeps a history so suggestions remain "smart" after you restart your IDE. Only suggestions valid in a context are offered.
If we understand the TeddyBear example, Name() is left untouched because it exists somewhere, albeit not valid in the current context. VA X does not want to remove code if not absolutely sure it should go. |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Sep 14 2004 : 11:19:49 AM
|
quote: Originally posted by WannabeeDeveloper
Hmm... I'd say eat everything that is already part of the Symbol I try to get, until a non-symbol-character (like "{[()]}").
For example, if I have a variable called MyName and MyLastName, I put the Caret into MyName and type MyL|Name, it should suggest MyLastName, and on accepting completely replace MyName with MyLastName.
This seems like what I want VAX to do, also. Support, can you provide a counter-example that demonstrates how this behavior could eat code in an incorrect manner?
Sorry, I meant 'behaviour'...
|
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Sep 14 2004 : 11:53:04 AM
|
I guess it wasn't Larry that you aggravated the most with the eating behaviour, then. |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Sep 21 2004 : 06:27:26 AM
|
Support, is there any chance of reconsidering this? It bites me at least once a day, and it's really annoying. Most real words seem to be valid suggestions from somewhere, even if I've never heard of them.
My proposal is that the following word or word portion should be deleted if and only if it's the trailing portion of the accepted suggestion.
These other experienced users have said they agree with me (other threads in private forum): WannabeeDeveloper (above), LarryLeonard (above, 2864, 2896), patluja (2928). Would any other users like to proffer an opinion, for or against? |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
Edited by - Stephen on Sep 21 2004 06:51:33 AM |
|
|
WannabeeDeveloper
Tomato Guru
Germany
775 Posts |
Posted - Sep 21 2004 : 2:48:52 PM
|
Although I'm already mentioned, I'd second my vote here:
PRO! Totally PRO!
Bites me several times a day! Make it an Option to let the user decide which behaviour he wants/needs!
I really hate getting "MySettings.bUseTrilinearTrilinear" everytime! You read me? I HATE IT!!!one!!eleven!1
|
|
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Sep 21 2004 : 3:38:51 PM
|
Thanks for the support, Wannabee. I don't think it should be an option, myself. This is the sort of case where the developers have to decide which is the right thing. |
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Sep 21 2004 : 5:06:37 PM
|
i accepted support's explanation of how this feature works, since i agree that having it delete the wrong code really is a *bad* idea. the problem is that none of us can predict what VAX is going to do when we are typing
personally i consider the current behaviour to be the lesser of two evils *shrug* Stephen, your suggestion is definitely a major step forward also, it is so obvious once someone points it out!
i will put this to support, and hopefully something can be done about this. |
zen is the art of being at one with the two'ness |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Sep 22 2004 : 3:25:08 PM
|
Not to be be ugly, but in the spirit of an honest user being a developer's best friend: if this isn't fixed, I have to go back to 1246 or whatever. I can't live like this. I just spent thirty seconds trying to insert the "..\\Mumble\\" part of:
#include "..\\Mumble\\Snafu.h"
The second period erased the "snafu.h" part (I've reported this), and when I typed in Sna and hit tab, I got "SnaSnafu.h". Seriously annoying: anagrams or shortcuts or whatever they're called are not worth these two bugs...
|
|
|
feline
Whole Tomato Software
United Kingdom
19023 Posts |
Posted - Sep 22 2004 : 4:16:34 PM
|
i have raised this thread with the developers. hopefully they will do something about this. |
zen is the art of being at one with the two'ness |
|
|
support
Whole Tomato Software
5566 Posts |
Posted - Sep 23 2004 : 12:23:35 PM
|
We believe Larry's problem with #include is separate from the consume-to-the-right issue.
case=267 |
|
|
support
Whole Tomato Software
5566 Posts |
Posted - Sep 23 2004 : 12:26:14 PM
|
As for the consume-to-the-right problem, we are not yet willing to change behavior to always consume-to-the-right. Instead, we would like to understand more about the circumstances which cause you grief. We believe if we understood more, we might find a solution to make more people happy.
Are you navigating to the middle of an existing symbol and pressing Ctrl+Space?
Are you navigating to the middle of a symbol, typing a letter or two and picking from a suggestion list?
Something else? |
|
|
LarryLeonard
Tomato Guru
USA
1041 Posts |
Posted - Sep 23 2004 : 12:55:02 PM
|
quote: Originally posted by support
We believe Larry's problem with #include is separate from the consume-to-the-right issue.
case=267
Like I said, I've already reported this, and I think it already has a case; just grep this board for 'Cokie Roberts' and you'll find it. Hmmm... maybe you're saying 267 *is* the existing case? Either way...
|
|
|
Stephen
Tomato Guru
United Kingdom
781 Posts |
Posted - Sep 23 2004 : 1:05:45 PM
|
Thanks for giving this your attention.
I almost never press Ctrl-Space. So I'm navigating to the middle of a symbol, or else overtyping the middle of a symbol, and picking from a suggestion list.
The key question is, why am I doing this? And I'm not exactly sure. I know I do do it, but I need to catch myself doing it to be sure of the reason. But I think I might be changing the name of a function to make it more explicit (GetName() -> GetTeddyBearName(); go to the middle of the word, press T, accept the suggestion, whoops you've got GetTeddyBearNameName). Or perhaps I typed the wrong function to begin with, or I'm just cutting, pasting and editing some previous code, but the function I have and the function I want have similar names, so rather than type the whole thing again, I go to the middle and type. I'll look out next time it happens.
|
Stephen Turner ClickTracks http://www.clicktracks.com/ Winner: ClickZ's Best Web Analytics Tool 2003 & 2004
|
|
|
WannabeeDeveloper
Tomato Guru
Germany
775 Posts |
Posted - Sep 23 2004 : 1:46:51 PM
|
That's it: Pure Lazyness!
When I have GetMySpecialSuperDuperName, but want GetMySpecialSuperDuperLastName, I put the Caret there: GetMySpecialSuperDuper|Name and type "L". VAX suggests GetMySpecialSuperDuperLastName (cause I have already defined it somewhere else) which I gladly accept, but only to get GetMySpecialSuperDuperLastNameName.
Imagine what happens with GetSpecialSuperDuperLastName when I want GetMySpecialSuperDuperLastName...
GetMySpecialSuperDuperLastNameSpecialSuperDuperLastName
I only (read my lips: ONLY) type within existing symbols with a reason. I do not type stuff I might regret in a few hours! So let VAX replace the whole word I'm currently typing in with the suggestion I accept...
|
|
Edited by - WannabeeDeveloper on Sep 23 2004 2:15:07 PM |
|
|
WannabeeDeveloper
Tomato Guru
Germany
775 Posts |
Posted - Sep 23 2004 : 2:21:04 PM
|
quote: Originally posted by WannabeeDeveloper
Imagine what happens with GetSpecialSuperDuperLastName when I want GetMySpecialSuperDuperLastName...
GetMySpecialSuperDuperLastNameSpecialSuperDuperLastName
I have to correct me: It does NOT give that stupid long name, it just does what we want: replace the symbol I'm typing in.
Why does it replace the whole word when the change is: GetSpecialSuperDuperLastName GetMySpecialSuperDuperLastName
and not on: GetMySpecialSuperDuperName GetMySpecialSuperDuperLastName ??? |
|
|
|
support
Whole Tomato Software
5566 Posts |
|
Topic |
|