SharedFile Statement Summary
SharedFile is terminal, utility statement that can occur only in command scripts. It is used after a set of project files have been loaded with the
SourceCodeattribute turned on. It scans the loaded form, class, and module files to see if any are loaded by more that one project. It then reports the summary counts and gives a detailed listing of each shared file and the projects that use it.
The
SharedFilestatement has no attributes or substatements.
This utility is completely general and can be used for any multi-project application once the
BuildOrderhas been established. A sample script using it looks as follows.
<gmBasic>
<Storage Action="Create" Identifier="Shared" />
<Select Target="..." Local=".." System=".." />
<Load project="project(1).vbp" SourceCode="On" />
<Load project="project(2).vbp" SourceCode="On" />
.....
<Load project="project(n).vbp" SourceCode="On" />
<Output Status="New" Filename="SharedFile.out" />
<SharedFile />
<Storage Action="Close" />
</gmBasic>
The projects must be loaded in build order. The
SharedFilecommand then produces a report that starts off as follows (counts will clearly vary).
There were 94 Shared Files in this group of projects: Modules = 55, Forms = 2 Classes = 37
The Module file [module.bas] is shared by 258 projects
(1) project(i).vbp
(2) project(j).vbp
......
and it then concludes with a set of
GlobalSettingsregistry commands that look as follows
<Registry type="SharedFile" Source="module1.bas" Target="project(i).vbp" />
<Registry type="SharedFile" Source="module2.bas" Target="project(k).vbp" />
<Registry type="SharedFile" Source="module3.bas" Target="project(k).vbp" />
.....
These SharedFiles are being used within other codes. They participate in the TypeInference algorithms and have their types inferred based on that other code. Once they are pulled out separately their types can no longer be changed by other codes. An IDF is needed to ensure this. The process goes as follows: First, the
GlobalSetting Registry command
SharedFilenames the SharedFile as the Source and names that project to be used to establish the precise typing for the Shared File as the Target. Second, when the target project is processed it will produce the shared form of the file and it will also produce an IDF file for that code. Third, downstream projects, when their project files specify a SharedFile, would load the IDF not the actual file.
The convention used by the
ShareFile utility statement above names the first project in encounters using the shared file as the target process. Henceforth these projects will be referred to as the "Defining" project for the shared file. Projects that load a SharedFile, but are not the Defining project will be termed a "Using" project of the shared file. Since the projects were loaded in BuildOrder this will ensure that there are no first-order circular references introduced -- i.e. the defining projects will also precede the using projects for every shared file. However, given that cross-references between shared and non-shared code will be present it is impossible to say how complex the circular reference problem will be for client codes that have them.