Author |
Topic |
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 08 2017 : 06:07:54 AM
|
Right clicking on a new function declared in a cpp file and then selecting "Quick Actions and Refactoring (VA)" quite often has the "Create Declaration" option greyed out, sometimes repeating the process may make the option available and others times not, if not I then have to create the declaration by hand in the header file.
Is this a bug in VA or is there something I'm missing or doing wrong as it's now becoming really annoying? |
Sean Townsend |
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 08 2017 : 06:45:33 AM
|
When this is happening, has the new function been coloured by VA as a function yet? If you have not paused typing for a couple of seconds to give VA time to parse your latest edits, then VA won't know about this new function, so won't know which refactoring commands to offer on it.
Another thought, if the function name has been written for a few minutes but the Create Declaration command is still not offered, something may be confusing our parser, is the function above "finished", so it contains the same number of open and closing curly brackets?
If you look at VA Outline, is the new function implementation shown correctly? It should be, if not, then this may be a useful clue as to why you are seeing these problems. |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 08 2017 : 06:59:45 AM
|
Yes, the function has been syntax coloured and the function is a finished function. Sometimes it works and others it doesn't. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 08 2017 : 08:57:14 AM
|
Next time you have a case where this does not work, can you please look and see if this function implementation is shown in VA Outline, and if it is in the correct position in the file?
Since VA is coloring the function correctly, I would expect Create Declaration to be offered and to work correctly all of the time. |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 08 2017 : 10:12:28 AM
|
I now have a function that is coloured as expected (with a red underline), it is showing up in VA Outline (albeit in bold) in the correct place and the create declaration is greyed out, I can send you a screenshot if this would help. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 08 2017 : 2:36:27 PM
|
Can you please try Alt-g on this function name, and see what, if anything, happens? If VA, for some reason, thinks a declaration already exists then Create Declaration won't be offered. What refactoring commands are being offered on this function?
Is this a free function, or a class member function?
Bold in VA Outline just shows your current position in the file, so if you move the caret into a different function in the current file, the bold marker should move to match the new cursor position. Useful when you know what is going on, but this should have no effect on what refactoring commands are offered. |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 11 2017 : 04:51:59 AM
|
Alt-G does nothing and the only refactoring commands available are:
Extract Method... Create File... Rename Files... Edit refactoring snippets... Find References
Also, this function is a class member function
|
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 11 2017 : 05:45:11 AM
|
This sort of makes sense, since this is what I would expect VA to show if the caret was in the white space in a file, so not in any symbol at all. So it suggests VA has no idea about this function, but I am not sure why.
With the caret in the function name, what, if anything, is shown in the VA navigation bar? This is normally shown at the top of the editor window, and is where the Alt-M list appears from.
If you move the caret back into the class name, does VA now show anything in the navigation bar? Does alt-g on the class name do anything?
Can you please try adding the following simple test into the .h and .cpp file where you are seeing this problem? I am wondering if somehow the problem is file specific, if so, this simple example, that works correctly for me, may now fail. This code goes into the header file:
class felineSimpleTestingClass
{
void fullMethodForReference();
}; and this code goes into the matching .cpp file:
void felineSimpleTestingClass::fullMethodForReference() { }
// test - caret into function name and VA navigation bar shows
// class and function name
void felineSimpleTestingClass::simpleCreateDecTest() { }
// test - caret into function name and VA navigation bar shows
// class and function name
long felineSimpleTestingClass::paramCreateDecTest(std::vector<std::pair<int, std::string> > vecParamTesting) { }
|
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 11 2017 : 06:14:44 AM
|
1) With the caret in the function name, the VA navigator bar is empty. 2) If I move the caret into whitespace within the file it shows the filename 3) If I move the caret within the function body it shows the function name. 4) Clicking on the VA navigation bar lists all the function in the file, including the function in question. 5) Moving the caret to any other function in the file has the VA navigation bar empty. 6) Adding the code snippet to the header file resolved all the above issues, I then CTRL-Z the changes in the header file and all the issues are still resolved.
I have a few files that are showing this behaviour, making any changes at all to the header file resolves all the issues VA has with the functions in the cpp file. |
Edited by - MrT on Dec 11 2017 06:42:44 AM |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 11 2017 : 07:15:14 AM
|
This suggests that VA reparsing the header file, due to you making a code edit, is what is fixing the problem. Do you have:
VA Options -> Performance -> Parse all files when opening a project
turned On or Off?
When you see this problem, if you close both the .h and matching .cpp file, give VA a couple of seconds to catch up, and then re-open the files, do you still see the issue?
I am trying to work out what could be triggering such an odd behaviour.
Are you aware of anything "odd" or "different" about the files that show this problem? Are they standard C++ code? Using standard file extensions? Are they in a different project in your solution?
Heavy use of macros or template code? |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 11 2017 : 07:23:15 AM
|
I have the "Parse all files when opening a project" option ticked. Closing and opening the files again make no difference. The files are using plain C/C++ there's no heavy use of macros or templates etc.
Loading up the project on some of my work colleagues PC's doesn't show this behaviour, so it looks like it's specific to my PC/IDE.
|
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 11 2017 : 1:42:27 PM
|
Perhaps a silly question, but do your colleges have the same solution, the same files and versions of the files? I am just checking you are not on significantly different code bases / versions of the solution.
Just to double check, can you search your solution directory tree for any files called "va_stdafx.h", I assume you don't have any of these, but best to double check that assumption.
Do you have any IDE extensions installed that your colleges don't?
Once you find a function that has this problem, and then make a small edit to the header file, adding and removing a blank line maybe, to fix the problem, does closing and reloading the IDE bring the problem back?
Do you keep your IDE open for days at a time? I am wondering if the files are being changed on the hard drive after VA has parsed them on solution load. Perhaps due to source control merging in changes? On this line of thought, do you have:
VA Options -> Performance -> Watch for externally modified files and reparse when necessary
turned On or Off? |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 12 2017 : 04:57:46 AM
|
Yes, my colleagues have the same solution and files, they have just got them straight out of our source control system.
I do not have va_stdafx.h in my solution tree.
My colleagues have the same IDE extensions that I have plus a few others of their own.
Closing and re-opening the IDE does not cause the problem to re-occur after making changes to the header file.
Yes, I keep my IDE open for days but I am the only person working on the project so files are not being merged or modified in any other way.
I have the "watch for externally modified files and reparse when necessary" option ticked. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 12 2017 : 08:32:57 AM
|
Next time you come across this, can you go to the .h file, and without making any edits, see if VA Outline is showing the correct outline for the file?
By the looks of it, all it takes to fix this is a re-parse of the header file, so hopefully something will be "wrong" in the initial VA Outline view of the file. If that something is then fixed after a file edit and undo, that would give us a solid clue about what is going wrong here. |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 12 2017 : 08:46:35 AM
|
VA outline for the header files is as expected, showing all classes, member variables and member functions.
VA outline is also correct for the cpp file. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 12 2017 : 12:04:48 PM
|
Are you seeing any signs or hints of problems that I have missed? Apart from the VA context and navigation fields in the new function name in the cpp file, and the refactoring not being offered, everything looks and works correctly doesn't it? I would expect what ever is going on here to show up somewhere else, somehow else.
OK, then let's test my assumption that its actually the reparse of the file that fixes this. While in the header file, can you please use the menu command:
VAssistX -> Tools -> Reparse Current File
without actually editing the file. When you go back to the .cpp file, is Create Declaration now offered correctly? Or is VA still not offering this refactoring? |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 13 2017 : 04:59:44 AM
|
VA works as expected with the other files, Reparsing the header file using VAssist->Tools->Reparse Current File and then going back to the cpp file resolves the issue, so it looks like changes made to the file are not triggering a reparse for some reason. |
Edited by - MrT on Dec 13 2017 05:43:47 AM |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 14 2017 : 12:37:26 PM
|
While you are still seeing this problem, please go to the .cpp file, and the problem function implementation. If you show VA View, then place keyboard focus back into the editor, and now hover the mouse over the class name before the function name, is the correct information for this class displayed?
If VA knows about the class, and recognises that there is no declaration for this function, then I would expect the refactoring command to be offered, even if VA is not 100% up to date on changes to the header file.
A second check, can you please find the .h and .cpp files in Windows Explorer, and check both their modified and accessed date / time stamp in the file properties? I am wondering if for some strange reason the modified date / time stamp is not being updated when the file is updated by your source control system. I don't see why this should happen, but it might help to explain what is going on here. |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 15 2017 : 05:01:40 AM
|
Hovering over the class for the following function:
void GameLog::writef(const char* p_cFormat, ...)
shows:
class GameLog
hovering over the function itself shows
void GameLog::writef(const char* p_cFormat,...)
The date accessed and date modified are both the same |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 15 2017 : 05:12:35 AM
|
Apologies, I was not clear in my description. With VA View showing, and keyboard focus in the editor, when you hover the mouse over a class that VA knows about, the bottom section of VA View should be updated with the class details, showing all of its members, and any base classes it inherits from. Since this information is coming from VA's symbol database, not from the current file, it might give us a clue as to what is happening, especially if the class members listed for GameLog are out of date.
Does the date accessed seem correct? Are you doing a source code update with the IDE open or closed? Or both? |
zen is the art of being at one with the two'ness |
|
|
MrT
Junior Member
United Kingdom
14 Posts |
Posted - Dec 15 2017 : 06:58:08 AM
|
I had to reboot my PC as a process was hogging the sound card meaning I couldn't start the game I was working on, after rebooting and going through all the class files they all appear to be behaving correctly now.
It's probably about 2-3 weeks since a last rebooted my PC and I have only been working on this one project. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Dec 15 2017 : 07:24:41 AM
|
Thank you for the update. At a wild guess, something was "blocking" VA from seeing the new updates to the files, so the header files were not quite up to date, but that still does not explain why the refactoring was not being offered in the cpp file.
That's very strange. Obviously if this comes back again please let me know. At least now we know to try looking into external processes that could be "locking" files in some sense, which is a clue of sorts. |
zen is the art of being at one with the two'ness |
|
|
|
Topic |
|