[nem-bug] [Nemerle 0001014]: InheritConstructors macro
feedback at nemerle.org
feedback at nemerle.org
Sun May 13 16:21:40 CEST 2007
A NOTE has been added to this issue.
======================================================================
<http://nemerle.org/bugs/view.php?id=1014>
======================================================================
Reported By: VladD2
Assigned To: nazgul
======================================================================
Project: Nemerle
Issue ID: 1014
Category: The Macro Library
Reproducibility: always
Severity: feature
Priority: normal
Status: feedback
======================================================================
Date Submitted: 05-12-2007 17:23 CEST
Last Modified: 05-13-2007 16:21 CEST
======================================================================
Summary: InheritConstructors macro
Description:
If you inherit one class from another, some time, you should copy all it
constructors. Will be nice create macro which do it automatically.
For example. Instead of:
public class IntelliSenseModeTyper : Typer
{
public this (m : MethodBuilder) { base (m) }
public this (parent : Typer, fn : Typedtree.Fun_header) { base (parent,
fn) }
public this (
tb : TypeBuilder,
tenv : TyVarEnv,
fn : Typedtree.Fun_header,
env : GlobalEnv)
{
base (tb, tenv, fn, env)
}
protected override RunDelayedTypings () : void { ... }
protected override RunSecondPass (_meth : MethodBuilder) : void { ... }
}
we could write:
[InheritConstructors]
public class IntelliSenseModeTyper : Typer
{
protected override RunDelayedTypings () : void { ... }
protected override RunSecondPass (_meth : MethodBuilder) : void { ... }
}
This macro should be not copy ctor if in new class already defined ctor
with same signature.
======================================================================
----------------------------------------------------------------------
nazgul - 05-12-07 18:09
----------------------------------------------------------------------
You can use [Record] macro for this purpose. In classes with some fields it
requires additonal work to choose which fields should be also included, but
to have just your specification you could do:
[Record (Include = [])]
class A : B {
priv_field : int;
}
----------------------------------------------------------------------
VladD2 - 05-12-07 18:20
----------------------------------------------------------------------
It's not intuitive :(.
Maybe move this functionality into separate macro?
----------------------------------------------------------------------
VladD2 - 05-12-07 18:24
----------------------------------------------------------------------
Hm...
I tring iit on IntelliSenseModeTyper:
[Record (Include = [])]
public class IntelliSenseModeTyper : Typer
{
/*public this (m : MethodBuilder) { base (m) }
public this (tb : TypeBuilder, tenv : TyVarEnv, mb : MethodBuilder,
env : GlobalEnv)
{ base(tb, tenv, mb, env) }
public this (parent : Typer, fn : TT.Fun_header) { base(parent, fn) }
*/
and take this error message:
Factories.n(8,4,8,59): error : `override' specified on method
Nemerle.Completion2.Factories.IntelliSenseModeCompilerComponentsFactory.CreateTyper()
: Nemerle.Compiler.Typer,
but there is no method with this signature in parent to override
----------------------------------------------------------------------
nazgul - 05-12-07 18:31
----------------------------------------------------------------------
Oh, now I remember why those constructors are written by hand - the Factory
macro does not see those creted by Record.
----------------------------------------------------------------------
VladD2 - 05-12-07 19:09
----------------------------------------------------------------------
And what about my proposal? :)
----------------------------------------------------------------------
nazgul - 05-12-07 19:18
----------------------------------------------------------------------
Yes, I think this would be very useful - I think that Record and
InheritConstructors macros could use exactly the same implementation -
Inherit would be just simpler, since it does not consider any fields.
----------------------------------------------------------------------
VladD2 - 05-12-07 23:29
----------------------------------------------------------------------
You can do this? :)
----------------------------------------------------------------------
nazgul - 05-13-07 11:50
----------------------------------------------------------------------
Fixed on trunk (r7675)
----------------------------------------------------------------------
VladD2 - 05-13-07 15:44
----------------------------------------------------------------------
InheritConstructors don't work with AbstractFactory mcro.
Kamil, try test the InheritConstructors on the class IntelliSenseModeTyper
from VS Integration.
http://nemerle.org/svn/vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CompilerConcreteDefinitions/IntelliSenseModeTyper.n
It lead to error:
Factories.n(8,4,8,59): error : `override' specified on method
Nemerle.Completion2.Factories.IntelliSenseModeCompilerComponentsFactory.CreateTyper()
: Nemerle.Compiler.Typer, but there is no method with this signature in
parent to override
----------------------------------------------------------------------
nazgul - 05-13-07 15:47
----------------------------------------------------------------------
Yes, this is the problem of AbstractFactory macro and cannot be done
easily. This can be fixed only after implementing macro dependencies
(http://nemerle.org/bugs/view.php?id=199)
----------------------------------------------------------------------
VladD2 - 05-13-07 16:15
----------------------------------------------------------------------
Can we run macro manualy (from another macro)?
----------------------------------------------------------------------
nazgul - 05-13-07 16:21
----------------------------------------------------------------------
Not directly... but it could be possible. You would need to access
attribute_macros_queue : Nemerle.Collections.Heap
[AttributeMacroExpansion]
from hierachy/TypesManager.n, search for macro defined on given class,
with given name / stage and order its expansion. This would be an unpretty
hack, but it could work (also the macro would then need to be removed from
the queue).
Issue History
Date Modified Username Field Change
======================================================================
05-12-07 17:23 VladD2 New Issue
05-12-07 18:09 nazgul Note Added: 0001879
05-12-07 18:19 VladD2 Note Added: 0001880
05-12-07 18:20 VladD2 Note Edited: 0001880
05-12-07 18:24 VladD2 Note Added: 0001881
05-12-07 18:31 nazgul Note Added: 0001882
05-12-07 19:09 VladD2 Note Added: 0001883
05-12-07 19:18 nazgul Note Added: 0001884
05-12-07 23:29 VladD2 Note Added: 0001885
05-13-07 11:50 nazgul Status new => resolved
05-13-07 11:50 nazgul Resolution open => fixed
05-13-07 11:50 nazgul Assigned To => nazgul
05-13-07 11:50 nazgul Note Added: 0001886
05-13-07 11:50 nazgul Description Updated
05-13-07 15:44 VladD2 Status resolved => feedback
05-13-07 15:44 VladD2 Resolution fixed => reopened
05-13-07 15:44 VladD2 Note Added: 0001888
05-13-07 15:44 VladD2 Description Updated
05-13-07 15:47 nazgul Note Added: 0001889
05-13-07 16:15 VladD2 Note Added: 0001890
05-13-07 16:21 nazgul Note Added: 0001891
======================================================================
More information about the bugs
mailing list