[nem-bug] [Nemerle 0000698]: [0.9.3] Extension methods not visible on nested types

feedback at nemerle.org feedback at nemerle.org
Mon Aug 14 21:57:48 CEST 2006


The following issue has been CLOSED
======================================================================
<http://nemerle.org/bugs/view.php?id=698> 
======================================================================
Reported By:                Snaury
Assigned To:                
======================================================================
Project:                    Nemerle
Issue ID:                   698
Category:                   Compiler
Reproducibility:            always
Severity:                   minor
Priority:                   normal
Status:                     closed
Resolution:                 open
Fixed in Version:           
======================================================================
Date Submitted:             06-30-2006 20:04 CEST
Last Modified:              08-14-2006 21:57 CEST
======================================================================
Summary:                    [0.9.3] Extension methods not visible on nested
types
Description: 
Example code:

#pragma indent

public module Outer
  public module Inner
    public test(this o : object) : void
      System.Console.WriteLine("test calle on object: {0}", o.ToString())

using Outer.Inner

public module Program
  public Main() : void
    def o = System.Object()
    o.test() // error: there is no member named `test' in System.Object
with type ?
======================================================================

----------------------------------------------------------------------
 Snaury - 06-30-06 20:10 
----------------------------------------------------------------------
Ah, sorry, the correct code is this:

#pragma indent

public module Outer
  public module Inner
    public test(this o : object) : void
      System.Console.WriteLine("test calle on object: {0}", o.ToString())

    public test2(o : object) : void
      o.test() // *** error here ***

using Outer

public module Program
  public test3(this o : object) : void
    o.test() // no error

  public Main() : void
    def o = System.Object()
    o.test() // no error
    o.test3() // no error

----------------------------------------------------------------------
 nazgul - 06-30-06 20:14 
----------------------------------------------------------------------
This is because in Outer, Inner is not 'opened'. If you declare using
Outer.Inner;  at the top of the file, it should work.

----------------------------------------------------------------------
 Snaury - 06-30-06 20:21 
----------------------------------------------------------------------
Hmm, then it seems more like in Inner Outer is not opened (which is
strange, I can call static methods from Outer, why not extensions? see my
comment where I posted corrected code so that test becomes visible in
Program.Main, but is not visible in Inner itself). Anyway, using Outer at
the top of the file works, thanks for the reply!

----------------------------------------------------------------------
 Snaury - 06-30-06 20:30 
----------------------------------------------------------------------
This code shows it even better:

#pragma indent

// when using commented here...
using Outer

public module Outer
  public test_from_outer(this o : object) : void
    System.Console.WriteLine("test_from_outer called on object: {0}",
o.ToString())

  public test(o : object) : void
    o.test_from_outer()

  public module Inner
    public test_from_inner(this o : object) : void
      System.Console.WriteLine("test_from_inner called on object: {0}",
o.ToString())

    public test(o : object) : void
      o.test_from_outer()
      o.test_from_inner() // ***

// ...and uncommented here, will give error in line marked with ***
// using Outer

public module Program
  public test_from_program(this o : object) : void
    o.test_from_outer()
    o.test_from_inner()

  public Main() : void
    def o = System.Object()
    o.test_from_program()

To me it seems kind of confusing, because I assume that contents of Outer
is already visible to Inner. But anyway, if that's by design, then I guess
it's ok, just a little confusing...

----------------------------------------------------------------------
 Snaury - 06-30-06 20:36 
----------------------------------------------------------------------
Ouch, after re-reading the docs I finally understood why it's like that.
It's because extension methods are only searched in namespaces we declared
with using. So I'm sorry, it's really not a bug. x_x

----------------------------------------------------------------------
 Snaury - 08-14-06 21:57 
----------------------------------------------------------------------
not a bug

Issue History
Date Modified  Username       Field                    Change              
======================================================================
06-30-06 20:04 Snaury         New Issue                                    
06-30-06 20:10 Snaury         Note Added: 0001325                          
06-30-06 20:14 nazgul         Note Added: 0001326                          
06-30-06 20:21 Snaury         Note Added: 0001327                          
06-30-06 20:30 Snaury         Note Added: 0001328                          
06-30-06 20:36 Snaury         Note Added: 0001329                          
08-14-06 21:57 Snaury         Status                   new => closed       
08-14-06 21:57 Snaury         Note Added: 0001419                          
======================================================================




More information about the bugs mailing list