On Thu, 18 May 2017, Mattias Gaertner via Lazarus wrote:
On Thu, 18 May 2017 13:46:07 +0200
Joe via Lazarus <[email protected]> wrote:
[...]
> Either move the Windows unit in front of the SysUtils unit, or use
> SysUtils.GetEnvironmentVariable
Yes, both solutions work; thank you, Martin and Mattias. Are they
documented anywhere?
The rule is simple:
If an identifier is searched via the uses section, and it does not
start with a unitname, the interfaces of the units of the uses section
are searched from right to the left.
Michael, where are the uses section resolve rules explained?
I would expect the documentation of the uses section somewhere
here:
https://www.freepascal.org/docs-html/current/ref/refse106.html#x216-23800016.2
Close,
https://www.freepascal.org/docs-html/current/ref/refse105.html#x215-23700016.1
Btw, the docs about Dotted units
https://www.freepascal.org/docs-html/current/ref/refse107.html
states:
"When resolving symbols, unit scopes always take precedence over symbols
inside units."
IMO this is misleading. For example:
uses foo;
type
TMy = class
foo: TMy;
procedure DoSome;
end;
procedure TMy.DoSome;
begin
foo:=nil; // nearest symbol wins
foo.foo:=nil; // symbol inside unit wins
end;
The rule is more like this:
If the first symbol of a dotted identifier is an unit in the uses
section, the longest match wins.
Yes, it is somewhat like black magic :)
I will adapt it.
Michael.
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus-ide.org/listinfo/lazarus