Author |
Topic |
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 03 2018 : 11:09:48 AM
|
Just tried adding something here:
Without an array I see tons of stuff:
|
Edited by - Zeblote on Jun 12 2018 1:40:42 PM |
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 03 2018 : 11:16:16 AM
|
I'm pretty sure autocomplete has worked properly on arrays in other places, so this is strange. |
|
|
accord
Whole Tomato Software
United Kingdom
3287 Posts |
Posted - Jun 04 2018 : 03:50:22 AM
|
Is there any macros that generate code before this piece of code, in the same file? Can you please check if this still works in other places so we know if something above this code confuses our parser OR we have trouble parsing TArray now? |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 12 2018 : 1:34:53 PM
|
I've tested in a lot of other files and it looks like autocomplete for TArray elements has completely broken.
. to -> correction on arrays of pointers is broken aswell. |
Edited by - Zeblote on Jun 12 2018 1:36:56 PM |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 12 2018 : 1:38:17 PM
|
This isn't limited to only TArray, I don't get autocomplete on std::vector elements either. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Jun 12 2018 : 3:26:11 PM
|
Can you please add the following simple test code to a new, blank cpp file in your solution, and see what happens?
class simpleFelineTestClass
{
public:
int m_nSize;
public:
simpleFelineTestClass() { m_nSize = 1; }
simpleFelineTestClass(int nSizeOne, int nSizeTwo) { m_nSize = nSizeOne + nSizeTwo; }
void simpleMethodImplementation() { }
void simpleMethodTwo() { }
void simpleMethodThree() { }
void simpleMethodFour() { }
};
void simpleVectorAccess()
{
std::vector<simpleFelineTestClass> felineVector;
// test - type dot on the next line for a listbox of class members
felineVector[0];
} The reason for trying this in a new blank file is to see if the problem is related to something further up the files, or one of your include lines. If you get the same problem, can you please try making a new, default C++ project, and see what happens if you try this code there? This will tell us if the problem is solution specific or global to your machine. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 12 2018 : 3:47:36 PM
|
It looks like autocomplete on that vector works in a new solution, but not the one generated by unreal. |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 12 2018 : 6:44:54 PM
|
In case this has something to do with it, I still have intellisense off (disable database true) |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Jun 13 2018 : 4:30:34 PM
|
Are you using a customized version of Unreal, or are you using the standard unreal engine?
Can you please open the two solutions at once, so you can do some simple side by side comparisons? Is VA showing the same information in its Context and Definition fields as you move through this simple sample code?
What about what is shown / offered in the Alt-Shift-G menu on the type "vector"?
It is as if there is another type / definition of std::vector that is at work in your unreal solution. I have tried here in a very simple unreal project, and the test code works as expected for me. So simply having unreal involved is not enough on its own to trigger this bug. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 13 2018 : 7:11:50 PM
|
It's a custom build branched off 4.19.2-release, but no major changes that would affect this.
Opened the 2 solutions at once, unreal to the left:
First observation is that the color of "vector" is different in the unreal one.
Left:
Right:
Left:
Right:
Left:
Right:
Left:
Right:
Though, even if there is another definition of std::vector, how would that break autocomplete for TArray? |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Jun 14 2018 : 08:21:36 AM
|
Interesting, I did not test TArray at first, just std::vector, rather rashly assuming that the two would behave the same here. I am seeing the TArray problem, but not the std::vector problem. I want to run some tests on TArray, just to make sure I am not doing something silly here in my test before putting in a bug report.
What are the other declarations of vector? The fact that vector has a different colour, and more than one declaration does suggest this could be part of the problem. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jun 14 2018 : 10:08:01 AM
|
Is from one of the engine plugins, it has a dependency on boost which forward declares it for unknown reasons.
|
|
|
ChrisG
Whole Tomato Software
USA
299 Posts |
Posted - Jun 14 2018 : 4:16:54 PM
|
I was able to reproduce the issue and have opened case 117081.
Thank you for the report. |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jul 14 2018 : 3:46:03 PM
|
This is very strange, in my 4.20 test install the autocomplete on array members works properly. In my project on 4.19 it doesn't. |
Edited by - Zeblote on Jul 14 2018 3:46:19 PM |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Jul 16 2018 : 11:02:15 AM
|
In the solution where you are having this problem, can you please create a new empty text file called "va_stdafx.h" and make sure this file is in the same directory as your .SLN file. There is no need to add this file to the solution, VA knows to look for this file, and if it is found, it is parsed before we parse anything else.
Edit the file, and add the code:
template<class ElementType, class _A>
class TArray
{
public:
ElementType& operator[](int32 Index)
}; making sure that the file ends with a blank line. Now press the button:
VA Options -> Performance -> Rebuild symbol databases
and restart your IDE.
This should fix the problem for you, it works here in my tests.
I am not sure why this works in one place and not the other, but it does suggest some changes to the TArray class that might be helping VA to parse it more successfully. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Jul 16 2018 : 12:11:32 PM
|
Looks like that works! |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Jul 16 2018 : 1:01:56 PM
|
Excellent news, thank you for the update. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 19 2018 : 07:35:28 AM
|
Btw, do you have a collection of all these hints to put in the file somewhere? I just found some for TMap in another topic by accident. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Sep 19 2018 : 07:49:22 AM
|
If you have the time can you please try deleting all Unreal Engine fixes from your current va_stdafx.h file and replacing them with the following block of fixes. This set of fixes is still a work in progress, but it is working well in my tests, and a couple of other users are seeing good results with it.
You will need to trigger a VA symbol database rebuild before these fixes will take effect,
VA Options -> Performance -> Rebuild symbol databases
I would be very interested in knowing how well this works for you, and if it breaks anything, and any other cases that you are encountering that this does not yet fix:
// va_stdafx.h Colin Unreal Engine fixes
// Version 2.2
// fixed dot converted to -> on iterator over TMap of pointer type
// helps ranged for loop iterate across TMap
template<class KeyType, class ValueType>
class TTuple
{
public:
KeyType Key;
ValueType Value;
};
// so that for ranged-loop works correctly when TTuple key is a pointer
// the iterator is still returning the TTuple, not the pointer key
template<typename ContainerType, typename ElementType, typename IndexType>
class TIndexedContainerIterator
{
ElementType operator* () const;
};
template<class ElementType, class _A>
class TArray
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
typedef TIndexedContainerIterator<ElementType, ElementType> const_iterator;
typedef TIndexedContainerIterator<ElementType, ElementType> reverse_iterator;
typedef TIndexedContainerIterator<ElementType, ElementType> const_reverse_iterator;
// iterator access
iterator begin();
iterator end();
const_iterator cbegin() const;
const_iterator cend() const;
reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator crbegin() const;
const_reverse_iterator crend() const;
public:
// data access
ElementType& operator[](int32 Index);
};
template<class ElementType, class _A>
class TArrayView
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
iterator begin();
iterator end();
};
template<class ElementType, class _A>
class TChunkedArray
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
iterator begin();
iterator end();
};
template <class ElementType>
class TDoubleLinkedList
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
iterator begin();
iterator end();
};
template<typename ElementType, typename Allocator>
class TIndirectArray
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
iterator begin();
iterator end();
public:
// data access
ElementType& operator[](int32 Index);
};
template<typename ElementType>
class TLinkedList
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
iterator begin();
iterator end();
};
template<class KeyType, class ValueType, class _A, class _S>
class TMap
{
public:
// required since the member TIterator class has a different pair API
// uses functions not exposed members, unlike the STL style iterator below
// BUT also overloads -> to access Key and Value as members
template<class KeyType, class ValueType>
class TIterator
{
KeyType Key();
ValueType Value();
TTuple<KeyType, ValueType> operator->() const;
}
TMap::TIterator<KeyType, ValueType> CreateIterator();
TMap::TIterator<KeyType, ValueType> CreateConstIterator() const;
TMap::TIterator<KeyType, ValueType> CreateKeyIterator(KeyType InKey);
TMap::TIterator<KeyType, ValueType> CreateConstKeyIterator(KeyType InKey) const;
public:
// STL style iterator movement - ranged for loop
typedef TBaseIterator<TTuple<KeyType, ValueType> > iterator;
iterator begin();
iterator end();
};
template<typename ElementType, typename KeyFuncs, typename Allocator>
class TSet
{
public:
// iterator movement
typedef TIndexedContainerIterator<ElementType, ElementType> iterator;
iterator begin();
iterator end();
};
template<class KeyType, class ValueType, class _A, class _S>
class TSortedMap
{
public:
// required since the member TIterator class has a different pair API
// uses functions not exposed members, unlike the STL style iterator below
template<class KeyType, class ValueType>
class TIterator
{
KeyType Key();
ValueType Value();
void RemoveCurrent();
}
TSortedMap::TIterator<KeyType, ValueType> CreateIterator();
TSortedMap::TIterator<KeyType, ValueType> CreateConstIterator() const;
TSortedMap::TIterator<KeyType, ValueType> CreateKeyIterator(KeyType InKey);
TSortedMap::TIterator<KeyType, ValueType> CreateConstKeyIterator(KeyType InKey) const;
public:
// STL style iterator movement - ranged for loop
typedef TIndexedContainerIterator<TTuple<KeyType, ValueType>, TTuple<KeyType, ValueType> > iterator;
iterator begin();
iterator end();
};
|
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 19 2018 : 08:43:47 AM
|
Hmm. The arrays are working perfectly, but a range for on a TMap thinks I'm still working with the map itself:
Map:
Attempting to iterate it shows autocomplete as if Entry was a TMap, but it should be a const TPair<Key, Value>&:
|
Edited by - Zeblote on Sep 19 2018 09:24:39 AM |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 19 2018 : 09:31:37 AM
|
Also, VA does not realize that TPair has .Value and .Key when I write it explicitly:
|
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Sep 19 2018 : 11:07:36 AM
|
Thank you, this is exactly the sort of testing I am looking for. I will post updated versions of the file as I work out what to do about these, but please do post any further problems you spot.
There is currently a problem with Unreal Engine using pointers to smart pointers internally, but this is something I cannot work around with va_stdafx.h, but we are working on a fix inside VA for these cases. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 23 2018 : 8:30:47 PM
|
For some reason there's no autocomplete on this array even with your new hint file.
|
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 23 2018 : 11:37:18 PM
|
This seems to keep breaking itself. Autocomplete has broken on all arrays again. I didn't change the hint file since your last post... |
Edited by - Zeblote on Sep 23 2018 11:52:09 PM |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Sep 24 2018 : 06:27:07 AM
|
This is strange. Lets start with the basics. I am testing VS2017 with VA 2283.2, running under Windows 10. From the Epic Games Launcher I am currently using Unreal Engine 4.20.3.
I have downloaded the Sample RPG game from here:
https://www.unrealengine.com/marketplace/action-rpg
and I am placing my test functions into the file "RPGAssetManager.cpp". This way I have a sensible test project to work with, and I can build the solution in Visual Studio to make sure that my test samples are valid, and work correctly.
I am only loading one instance of the IDE at a time. I am testing with version 2.2 of the va_stdafx.h file, which is in the same directory as the "ActionRPG.sln" file.
To test basic arrays, I have the following test code:
// array access forum thread tests
// Feline is doing all tests with:
// VA Options -> Enhanced Listboxes -> Source of C/C++ content = Visual Assist
void forumUnrealTesting()
{
TArray<FVertexToCreate> VerticiesToCreate;
VerticiesToCreate.SetNum(8);
// VA shows listbox on dot on next line
VerticiesToCreate[0];
// testing the type its self
// Test - Alt-g on the type takes you to the file "EditableMeshTypes.h"
// Test - show VA Outline, place keyboard focus into the editor
// now hover the mouse over the type "FVertexToCreate" and the bottom section
// of VA Outline shows the structure details, listing 4 members
FVertexToCreate testVertext;
// Test - type dot on the next line, listbox with 4 items appears
testVertext;
} Do you see any obvious differences between my test situation and your situation? The fixes in the va_stdafx.h file should not stop working, but if they are, we need to figure out why and fix this first, since until that has been fixed, there is no point in trying further changes to the va_stdafx.h file its self. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 24 2018 : 08:12:18 AM
|
Hmm. I'm using VS 15.8.5 on the latest windows 10. Differences I can think of:
- I'm using a source build of 4.20.3, the generated solution may be different from launcher builds - I often regenerate the project files while VS is open, to add new files and stuff, then click "Reload" or "Discard" in VS to load the new sln - I have intellisense disabled completely - My va_stdafx.h file is in a .va folder - I added things to the top of the hint file:
#define BRICKADIA_API
#define BRICKADIAEDITOR_API
#define BRICKADIAOPENSSL_API
I let VA reparse everything to make sure, then pasted your code snippet to the end of one of my files, the result is: - No autocomplete on the array element - Alt+g works - VA outline doesn't seem to care about me hovering or clicking on the type, still shows the file overview - Autocomplete on single struct works
|
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Sep 24 2018 : 08:54:27 AM
|
When you say your va_stdafx.h file is in a ".va" folder, what else is in this folder along side the va_stdafx.h file? VA only looks for the va_stdafx.h file in the same directory as the .SLN or .VCXPROJ files. So if the va_stdafx.h file is not where VA is looking for it, then it will never be found, and never be parsed. So have you ever seen the va_stdafx.h file work and help you?
Is there a problem with putting the va_stdafx.h file into the same directory as the .SLN file?
Building Unreal from source should not matter, but it may have an effect if your source tree needs different fixes to the default source tree I am testing on and developing fixes for. |
zen is the art of being at one with the two'ness |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Sep 24 2018 : 09:31:28 AM
|
I have now tested the other two bugs you mention, using the code from your screen shots, and so far I cannot reproduce these problems either. I am wondering if your va_stdafx.h file has ever been noticed and parsed by VA. This would explain why you are still seeing these problems. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 24 2018 : 10:48:41 AM
|
Hmmmmmmm. That's interesting. I can't remember why I thought having the file in a .va subfolder would work, and now that I'm searching for it, nothing suggests that it does. Moved it back to the root folder.
After restarting vs and reparsing all files, autocomplete on arrays worked great! It even knew about the .Key / .Value on map entries. After restarting vs a second time, it's broken again. |
|
|
feline
Whole Tomato Software
United Kingdom
19021 Posts |
Posted - Sep 24 2018 : 11:36:42 AM
|
The va_stdafx.h file should be stable. More than this, to remove or replace the entries that the file sets you have to rebuild VA's symbol database. So simply restarting the IDE, without doing a symbol database rebuild, should not remove the help this file provides...
A couple of tests. First, can you add, or find, and instance of the class name "TMap" in your code please, and press Alt-G on it. What happens? You should get a listbox showing two possible definitions of this class. One in "Map.h" and one in your "va_stdafx.h", showing the full path to this file.
This should tell us if VA is still aware of and trying to use the "va_stdafx.h" file and the help it provides.
How many instances of the IDE do you have open? Can you please look in task manager and see if there are any extra instances of "devenv.exe" running?
To make sure that different instances of the IDE cannot interfere with each other VA has a separate database for each instance. So, the following theory would explain what you are seeing.
* you trigger a VA symbol database rebuild, and close all instances of the IDE * open instance 1 of the IDE, and va_stdafx.h is read into the symbol database for this instance * closing the IDE does not close it * reloading the IDE is taken to be instance 2, but due to something, perhaps project being rebuilt, the va_stdafx.h file has been removed from the hard drive. * symbol database is build for instance 2, but since there is no va_stdafx.h, none of the fixes take effect
It's not exactly straight forward, but off the top of my head it's the only way I can think to explain what you are seeing. |
zen is the art of being at one with the two'ness |
|
|
Zeblote
Tomato Guru
183 Posts |
Posted - Sep 24 2018 : 2:53:11 PM
|
Yes, I did click rebuild symbol database then restarted vs after changing the file (that's what I meant by reparsing all)
I can see the 2 things:
I always only use one instance of VS per project, though sometimes I might open a different project (not using unreal engine) in the background. This shouldn't affect VA, right?
Just did another test: - autocomplete on array is currently broken - click these buttons - close vs - make sure vs is really closed - open vs (parses all files) - autocomplete on array works - close vs - make sure vs is really closed - open vs (does not parse all files) - autocomplete on array is broken |
|
|
Topic |
|