> From: Conor MacNeill [mailto:[EMAIL PROTECTED]
> 
> 
> > All the resolution of the semantics of the language is done
> > before name mangling
> 
> This is not strictly true. In C++ you decide (by using extern 
> "C") whether
> to place a symbol in the global namespace or its own (by name 
> mangling). The
> programmer needs to be aware of this. C++ also introduced the 
> namespace
> concept due to the likelihood of Class name collisions, since 
> prior to that
> Class names occupied a single global namespace.
> 

Just for closure on this comment, all the stuff with extern "C"
in C++ is not for the user programming in C++ but to allow
interoperability between C++ and C. Which is a completely different
suubject. I am the first to think that C++ became one of the worst
amalgamations on features on the planet.

And I definetly do not want ANT to go that way, that is my fear.

> > takes place. Also notice that in C++ you have "virtual" and 
> "non-virtual"
> > methods which have completely different resolution rules (Java
> > only has virtual).
> > It seems to me part of the issue is that we do not distinguish
> > between this
> > different behaviors but we still want them to have both.
> >
> 
> So, what is your proposal? How does it address my usecase? I believe a
> non-prefixed import addresses your usecase.
> 

First I do not think I have all the answers, just to keep things in perspective.
What I think I have is a set of principles that I think any viable solution
should provide. Lets see if I can put them into words: ;-|

1) I should be able to determine the correctness (loosely used here) of a 
buildfile
by looking at that buildfile (and its dependencies) in isolation. This means 
that
the fact that I am imported by someone else should not affect my correctness
(modulo overriden targets).

        Rewriting of targets, may attempt at this correctness.

How can we get something more interesting out of that principle above, I agree 
is
quite generic. Lets see...

2) It would seem we need to be able to specify whether a target can be overriden
or not. We need to be able to define if a target is: private, final, or 
overidable.
Notice that this is a property of the target and not of the way the target is 
imported.

The meanings are:
 private ==> other targets with same name on other files will not override; 
             any mention on dependencies on this file for that target will use 
this private version;
                 the target is not visible from outside the file.

 final ==> target visible from other files but not overidable, it is an error;
           any mention on dependencies on any file (without a private def) uses 
this version.

 overridable ==> target visible from other files, and overridable;
                 any mention on dependencies on any file will use top level 
available version.

this are just suggestions, other levels of protection may be possible.

On a project-fragment, any target dependency not defined in the fragment will 
be picked up from the
visible targets, following the rules above.

I would suggest an attribute like: 

        visibility="final|private|overridable"

you may decide what should be the default.

3) targets can be overriden using <target/> which replaces the target 
completely. Or using
<override-target> which allows expressing dependencies on the overriden target.
The syntax in the dependency list is to mention the name of the target itself n 
the list.

   <override-target name="compile" depends="precompile, compile, postcompile"/>

The "compile" target in the dependency list refers to the overriden target.
Notice that <override-target> requires target name to already exist and be 
overridable.

4) To support multiple inheritance, I would allow defining a name for an 
import. This name is
only visible locally and can be used to specify in a dependency list a target 
comming
from an specific import. You can refer that way to any target visible from that 
<import>
but you cannot refer to inner <imports> of those that have been overriden.
You cannot use the notation to break the visibility rules.

  <import file="xyz" name="a"/>
  <import file="qrs" name="b"/>

  <target name="compile" depends="a->precompile, b->precompile">
    ....
  </target>

If xyz uses some other import that it names q, I canot say a->q->precompile, 
because
that violates the visibility rules defined in xyz that provided its own target
a->precompile.

Ok, I will stop now, we can talk about implementation later.

Jose Alberto

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to