On Sun, Dec 9, 2018 at 12:59 PM Juha Manninen via lazarus
<lazarus@lists.lazarus-ide.org> wrote:
>
> On Sun, Dec 9, 2018 at 2:06 PM Marcos Douglas B. Santos via lazarus
> <lazarus@lists.lazarus-ide.org> wrote:
> > Instead, can I add it on Search Path but using a macro or custom
> > definition, to get the path accordingly to Build Mode choose?
>
> Why?
> The "Other unit files (-Fu)" setting is part of Build Modes. You can
> set a different path for each Build Mode.

Indeed. I've answered quickly without thinking properly. Sorry.

However, this do not solve "my problem", which is not use Search Paths.
Why? I'll try to explain:
When I realized that I can use paths in uses clauses I thought that I
could use `alias for units`, which is better than "namespaces", IMHO.

So, using my example before, I could do that:
uses
  `MyMsg in 'msg/msg.pas'`;

I just choose a new name for the file `msg.pas`, which is `MyMsg`.
It compiles. I can use it as a prefix, eg., `MyMsg.AFunction()`, and
it is great.
But if you put the `msg` folder in Search Path, the compiler will use
the same file name as the unit, ie, the identifier will be the same:
Msg.
Then I thought: If I "register" the name what I want for `msg.pas` on
project (lpr), the compiler will use it in all code. However, as I've
explained before, it doesn't work on IDE, having some issues on
CodeTools.
Then I thought: I could use the path on each uses clause, no problem.
If I need to change some path, I could just do a replace in all files
- no big deal. But, I discovered that I cannot use different `alias`
pointing to the same file, because there are some issues about classes
and interfaces.
For example:
unit A;
uses msg1 in 'msg/msg.pas'
-----
unit B;
uses msg2 in 'msg/msg.pas'

As I understood, when the compiler knows about `msg.pas`, it will use
the first identifier that appeared, which is `msg1`. And that is a
problem. Why?
Consider that:

unit strings;
type
  TStr = type string;
end;
---
unit b;
uses str in 'abc.strings.pas';
type
  IBar = interface
    procedure Exec(const s: TStr);
  end;
end;
---
unit c;
uses abcstr in 'abc.strings.pas';
type
  TBar = interface
    procedure Exec(const s: TStr);
  end;
end;

So, units B and C uses A, which has a `TStr` type declared.
The problem here is that `IBar` is using `TStr` as `str.TStr`
implicit; on C unit, `TBar` is using `TStr` as `abcstr.TStr`, and I
have a compiler error.
As I understand, the compiler uses units as prefix for types.

Finally, it turn back us for the original issue: if I can "register"
just one `alias` for an unit on the project (lpr), I could use it on
all code of my project, in theory.
And why this is "important"?
If I have an unit like "Some.Long.Name.Unit", I will could use it like:
  foo in 'path/Some.Long.Name.Unit.pas';

And I've discovered another issue on IDE:
If I use like above `foo in 'path/Some.Long.Name.Unit.pas';`, IDE will
save on XML project files the unit as `Some.Long.Name.Unit`, when it
should be `foo` as the name of the unit.

best regards,
Marcos Douglas
-- 
_______________________________________________
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to