Wiki

Changeset 1853

Show
Ignore:
Timestamp:
12/30/08 09:14:09 (3 years ago)
Author:
Chuck.Esterbrook
Message:

Added extensions on generic types like List<of T> and IDictionary<of K, V>.
ticket:1

Location:
cobra/trunk
Files:
9 added
3 modified

Legend:

Unmodified
Added
Removed
  • cobra/trunk/Developer/IntermediateReleaseNotes.text

    r1848 r1853  
    7777    r = Rectangle(p1=Point(x=0, y=1), p2=Point(x=2, y=3)) 
    7878    c = Customer('Acme, Inc.', region=Regions.South) 
     79 
     80* Added extensions on generic types like List<of T> and IDictionary<of K, V>.  ticket:1 
    7981 
    8082* Added partial classes, a la C# and VB. This enables class (and struct and interface) declarations to be split across files. This can be useful for organizing generated code or even manually written code based on purpose. ticket:10 
  • cobra/trunk/Source/BackEndClr/SharpGenerator.cobra

    r1849 r1853  
    973973        return sharp 
    974974 
     975    def extendedMethodGenericParams(genericParams as IList<of IType>) as IList<of IType> 
     976        """ 
     977        This is a hook for Extension and Method which have to deal with extensions on generic classes. 
     978        """ 
     979        ensure 
     980            old genericParams == genericParams 
     981            result.count >= genericParams.count 
     982        body 
     983            return genericParams 
     984 
    975985    def writeSharpDef(sw as SharpWriter) 
    976986        base.writeSharpDef(sw) 
     
    12751285    is partial 
    12761286 
     1287    get _computeSharpRef as String is override 
     1288        sharp = .sharpName 
     1289        if .parentNameSpace and not .parentNameSpace.isRoot 
     1290            sharp = .parentNameSpace.sharpQualifier + sharp 
     1291        else if .parentBox 
     1292            sharp = .parentBox.sharpRef + '.' + sharp 
     1293        return sharp 
     1294 
    12771295    get sharpInit as String is override 
    12781296        return _extendedBox.sharpInit 
     
    12851303 
    12861304    var _backEndName as String? 
    1287      
     1305 
    12881306    get sharpName as String is override 
    12891307        if not _backEndName 
     
    12931311    get sharpThis as String is override 
    12941312        return '_lh_this' 
     1313 
     1314    def extendedMethodGenericParams(genericParams as IList<of IType>) as IList<of IType> is override 
     1315        if .isGeneric 
     1316            # the generated static C# method will need the generic params of the extension on it 
     1317            # since C# itself doesn't have "extension types", only extension methods 
     1318            r = List<of IType>(.genericParams) 
     1319            r.addRange(genericParams) 
     1320            return r 
     1321        else 
     1322            return base.extendedMethodGenericParams(genericParams) 
    12951323 
    12961324    def writeSharpDefName(sw as SharpWriter) is override 
     
    17801808 
    17811809    get sharpGenericParams as String is override 
    1782         if _genericParams.count 
     1810        params = .parentBox.extendedMethodGenericParams(_genericParams) 
     1811        if params.count 
    17831812            sb = StringBuilder() 
    17841813            sb.append('<') 
    17851814            sep = '' 
    1786             for param in _genericParams 
     1815            for param in params 
    17871816                sb.append(sep) 
    17881817                sb.append(param.sharpName) 
  • cobra/trunk/Source/Boxes.cobra

    r1852 r1853  
    4646        _attribs = attribs 
    4747        _genericParams = paramList 
    48         for i = 0 .. _genericParams.count 
     48        for i in _genericParams.count 
    4949            p = _genericParams[i] 
    50             if p inherits GenericParam 
    51                 p.index = i 
     50            if p inherits GenericParam, p.index = i 
    5251        _extensions = List<of Extension>() 
    5352        _baseInterfaceProxies = baseInterfaceNodes 
     
    128127 
    129128    get extensions from var 
     129 
     130    get allExtensions as Extension* 
     131        """ Return all extensions including inheritance through all base classes and interfaces. """ 
     132        require .didBindInh and .didBindInt 
     133        for ext in .extensions, yield ext 
     134        if _baseClass, for ext in _baseClass.allExtensions, yield ext 
     135        for bi in _baseInterfaces, for ext in bi.allExtensions, yield ext 
    130136 
    131137    get hasExtensions as bool 
     
    819825            t._nativeType = nil  # The constructed type is really sourced from the generic def. Don't foster confusion with a reference to the original generic def's clr type (if there is one). 
    820826            t.cloneCollections 
     827 
    821828            # set the contructed type args immediately or its ancestors will get the original generic args during _bindInt: 
    822829            for i in typeArgs.count 
    823830                t._genericParams[i] = typeArgs[i] 
    824831            assert t._constructedTypes is nil or t._constructedTypes.count == 0 
     832 
    825833            if .didBindInt 
    826834                t._completeConstruction(typeArgs) 
     
    828836                t._needsConstruction(typeArgs) 
    829837            assert t._constructedTypes is nil or t._constructedTypes.count == 0 
     838 
    830839            return t 
    831840 
     
    871880            gpToType = TypeUtil.dictionaryOf(_genericDef.genericParams, typeArgs) 
    872881 
    873             _baseClass = _baseClass.secondaryConstructedTypeFor(this, gpToType) to Class 
     882            if _baseClass, _baseClass = _baseClass.secondaryConstructedTypeFor(this, gpToType) to Class 
    874883 
    875884            assert _baseInterfaceProxies.count == 0 or _baseInterfaceProxies.count == _baseInterfaces.count 
    876             for i = 0 .. _baseInterfaces.count 
     885            for i in _baseInterfaces.count 
    877886                _baseInterfaces[i] = _baseInterfaces[i].secondaryConstructedTypeFor(this, gpToType) to Interface 
    878887 
     
    912921                    _declsByName[decl.name] = decl 
    913922                    _declsByNameCI[decl.name.toLower] = decl 
     923            for i in _extensions.count 
     924                ext = _extensions[i] = _extensions[i].constructedTypeFor(typeArgs) to Extension 
     925                ext.completeMemberConstructionIfNeeded 
    914926            # TODO: can this next statement can be axed since there is a separate "bind inheritance" phase? 
    915927            _finishOverloads 
     
    945957        _baseInterfaces = List<of Interface>(_baseInterfaces) 
    946958        # _overloads = List<of MemberOverload>(_overloads)  # these will be recreated 
     959        _extensions = List<of Extension>(_extensions) 
    947960 
    948961    def typeForGenericParam(gp as GenericParam) as IType # TODO: is this needed for NilableType? 
     
    14491462    """ 
    14501463 
    1451     var _extendedBoxProxy as ITypeProxy 
     1464    var _extendedBoxProxy as ITypeProxy? 
    14521465    var _extendedBox as Box? 
    14531466 
     
    14871500        if box.isDescendantOf(_extendedBox to !) 
    14881501            return .declForName(name) 
     1502        else if box.genericDef and (box.genericDef.isDescendantOf(_extendedBox to !) _ 
     1503                                        or (_extendedBox.genericDef and box.isDescendantOf(_extendedBox.genericDef.constructedTypeFor(box.genericParams)))) 
     1504            for ext in box.allExtensions 
     1505                if ext.genericDef is this 
     1506                    return ext.declForName(name) 
     1507            throw FallThroughException() 
    14891508        else 
    14901509            return nil 
     
    15061525 
    15071526        if _extendedBox is nil 
     1527            if _extendedBoxProxy inherits GenericTypeIdentifier 
     1528                # this will error on the generic params unless we set them up to be found 
     1529                for tn in _extendedBoxProxy.typeNodes 
     1530                    if tn inherits TypeIdentifier 
     1531                        _genericParams.add(GenericParam(tn.name)) 
     1532                    else 
     1533                        .throwError('Invalid generic param "[tn]".') 
     1534 
    15081535            realType = _extendedBoxProxy.realType 
    15091536            if realType inherits Box 
     
    15111538            else 
    15121539                .throwError('Cannot extend a [realType.name]. You can extend classes, structs and interfaces.') 
     1540                 
    15131541        _name = '[_extendedBox.name].extension.[.serialNum]' 
    15141542 
     
    15191547         
    15201548        # connect up 
    1521         _extendedBox.extensions.add(this) 
     1549        if _extendedBox.genericDef 
     1550            _genericParams = List<of IType>(_extendedBox.genericParams) 
     1551            _extendedBox.genericDef.extensions.add(this) 
     1552        else 
     1553            _extendedBox.extensions.add(this) 
    15221554     
    15231555    def _bindInt 
     
    15481580                        else 
    15491581                            throw FallThroughException([this, decl]) 
    1550                         decl.overloadGroup = nil  # Could be in a group from the extension itself. And .addMember below don't like that. 
     1582                        decl.overloadGroup = nil  # Could be in a group from the extension itself. And .addMember below doesn't like that. 
    15511583                        overload.addMember(decl) 
    15521584                        if newOverload, newOverload.bindInt  # an overload that never .bindInt will get cranky later