Jump to content
Vincent Parrett

Tool to fix up uses clause unit namespaces?

Recommended Posts

Hi All

 

Anyone know of a tool that can fix up unit namespaces in the uses clause, ie change 

 

uses

  sysutils, stdctrls;

 

to

 

uses

  System.SysUtils, Vcl.StdCtrls; 

 

I have a few thousand units to go through and clean up, I've tried regex etc but it's not reliable enough. 

 

  • Like 1

Share this post


Link to post

I believe the GExperts Uses Clause manager will remove or add unit prefixes, just not sure if you can automate that without extracting the pertinent code from their repo and fashioning a tool.  Perhaps macros with the UCM?

Share this post


Link to post

GExperts has this functionality, but only for the current unit. Feel free to use that code to build a batch tool (it's not quite so easy since you must take the project settings and search paths into account). I'll accept patches, of course. 😉

Edited by dummzeuch
  • Like 2

Share this post


Link to post

I have written a tool including that functionality some time ago. Although I didn't find the time to polish it up before going public, it basically does what it is supposed to.

 

Expanding unit scope names is only part of the whole process, which consists of

  • resolve all unit aliases
  • expand unit scope names
  • group units
  • compress uses clause

Taking your example above it will convert

uses
  sysutils, stdctrls;

into

uses
  System.SysUtils, 
  Vcl.StdCtrls; 

Feel free to adjust the sources to your needs.

UsesCleanerSource.zip

  • Like 1
  • Thanks 3

Share this post


Link to post

I use the MMX Code Explorer for that.  The feature is a bit hidden and listed under "Group and Sort Uses".    I think it only works on the current uses statement (e.g. you need to put the caret on the uses clause and hit the hotkey for it.  It does work well as I've used it quite a bit when working with my older units.

Share this post


Link to post

The code used in MMX Code Explorer is almost identical to what I attached above. The command line application allows targeting multiple units in one go, while as you noticed MMX only works on the uses clause the cursor is positioned in the current unit.

Share this post


Link to post
On 2/9/2020 at 6:29 PM, Vincent Parrett said:

I have a few thousand units to go through and clean up, I've tried regex etc but it's not reliable enough. 

Do you really need this, though?  If you simply include 'System' and 'Vcl' in the Unit Scope Names list in your project options, you won't need to update the 'uses' clauses at all.

Share this post


Link to post
On 2/10/2020 at 6:47 AM, Uwe Raabe said:

The code used in MMX Code Explorer is almost identical to what I attached above. The command line application allows targeting multiple units in one go, while as you noticed MMX only works on the uses clause the cursor is positioned in the current unit.

Is it not true, though, that they both refuse to tangle with comments -- and compiler directives -- in the uses clauses? That is an issue for the couple of thousand modules I need to process. And yes, it is a less simple problem than it looks. I spent some time on it, and was not willing to spend more, as I have other priorities which demand my time.

Edited by Bill Meyer

Share this post


Link to post
59 minutes ago, Remy Lebeau said:

Do you really need this, though?  If you simply include 'System' and 'Vcl' in the Unit Scope Names list in your project options, you won't need to update the 'uses' clauses at all.

Not strictly speaking, but not relying on the scope names does actually speed up compilation. Then there's the different code styles in thousands of units created over 20 years, I'm a bit OCD I guess and want to apply the same standard across all my code!

  • Like 1

Share this post


Link to post
59 minutes ago, Bill Meyer said:

Is it not true, though, that they both refuse to tangle with comments -- and compiler directives -- in the uses clauses?

Regarding compiler directives you can give the above sources a try. Although there might still be cases where it fails, they should do a better job than the official MMX version does.

Share this post


Link to post
5 minutes ago, Uwe Raabe said:

Regarding compiler directives you can give the above sources a try. Although there might still be cases where it fails, they should do a better job than the official MMX version does.

If I get out from under some of my other tasks, I will. My TODO list is a bit long at the moment. 😉

Share this post


Link to post
32 minutes ago, Bill Meyer said:

My TODO list is a bit long at the moment.

Same here. That's why MMX development is actually stalled - unfortunately. Otherwise the beta version would have long been finished.

Share this post


Link to post

I just got done with this and it just worked! I did have to modify the hard coded path for the UsesHelper.SearchPath to match the delphi version I'm using.  I tested first by specifying an output directory, and after checking with beyond compare to see how it did, I just processed the  original files. 

 

It did also introduce some compilation errors, where I have prefixed function calls with the unit names (e.g SysUtils.DeleteFile ), simple to fix though. 

 

Thanks @Uwe Raabe

  • Like 2

Share this post


Link to post
On 2/11/2020 at 3:40 PM, Uwe Raabe said:

Regarding compiler directives you can give the above sources a try. Although there might still be cases where it fails, they should do a better job than the official MMX version does.

Spent a bit of time with your source. So far, it appears to correctly handle some of the thornier issues which we have in our legacy code. I do need to do some additional testing, and find my way to some of the settings, but what I see so far is very encouraging.

Share this post


Link to post

@Uwe Raabe this is great - thanks so much for putting it together.

 

One question. We recently shifted our project to FMX but updated the units by removing "VCL" from the project Scope Names and adding "FMX". When we ran this cleaner it is inserting VCL where we need it to be FMX. 

 

Aside from a manual review, is there a known solution for this? 

 

Thanks again

 

Mathew

Share this post


Link to post
14 minutes ago, MathewV said:

Aside from a manual review, is there a known solution for this? 

If you look at this method

 

procedure TSourceFileUsesClauseFormatter.InitSettings;
begin
  UsesHelper.UnitAliases := 'WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;';
  UsesHelper.UnitScopeNames := 'Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell';
  UsesHelper.SearchPath := 'c:\Program Files (x86)\Embarcadero\Studio\19.0\lib\win32\release';
  UsesHelper.GroupNames := '<UnitScopeNames>';
end;

I would hazzard a guess that you can solve this by removing the vcl unit scope names and adding the fmx ones. I don't use fmx so not 100% on this, but a new blank multi device application, the default unit scope names are

Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap

So maybe that's all you need 🤔

Share this post


Link to post

Meanwhile the project is on GitHub: https://github.com/UweRaabe/UsesCleaner

You don't even need to change the sources to handle FMX. The -c command line parameter lets you specify a configuration file with your preferred settings. An example can be found on GitHub.

  • Like 1

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×