Wiki
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

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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