Changeset 1853
- Timestamp:
- 12/30/08 09:14:09 (3 years ago)
- Location:
- cobra/trunk
- Files:
-
- 9 added
- 3 modified
-
Developer/IntermediateReleaseNotes.text (modified) (1 diff)
-
Source/BackEndClr/SharpGenerator.cobra (modified) (5 diffs)
-
Source/Boxes.cobra (modified) (13 diffs)
-
Tests/420-extensions/400-extend-generics (added)
-
Tests/420-extensions/400-extend-generics/100-extend-list-of.cobra (added)
-
Tests/420-extensions/400-extend-generics/110-extend-ilist-of.cobra (added)
-
Tests/420-extensions/400-extend-generics/120-extend-list-of-same-generic-arg-name.cobra (added)
-
Tests/420-extensions/400-extend-generics/200-extend-dictionary-of.cobra (added)
-
Tests/420-extensions/400-extend-generics/210-extend-idictionary-of.cobra (added)
-
Tests/420-extensions/400-extend-generics/300-extend-nonlib-generic.cobra (added)
-
Tests/420-extensions/400-extend-generics/310-extend-nonlib-generic-with-inheritance.cobra (added)
-
Tests/420-extensions/400-extend-generics/400-extend-nonlib-generic-error.cobra (added)
Legend:
- Unmodified
- Added
- Removed
-
cobra/trunk/Developer/IntermediateReleaseNotes.text
r1848 r1853 77 77 r = Rectangle(p1=Point(x=0, y=1), p2=Point(x=2, y=3)) 78 78 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 79 81 80 82 * 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 973 973 return sharp 974 974 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 975 985 def writeSharpDef(sw as SharpWriter) 976 986 base.writeSharpDef(sw) … … 1275 1285 is partial 1276 1286 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 1277 1295 get sharpInit as String is override 1278 1296 return _extendedBox.sharpInit … … 1285 1303 1286 1304 var _backEndName as String? 1287 1305 1288 1306 get sharpName as String is override 1289 1307 if not _backEndName … … 1293 1311 get sharpThis as String is override 1294 1312 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) 1295 1323 1296 1324 def writeSharpDefName(sw as SharpWriter) is override … … 1780 1808 1781 1809 get sharpGenericParams as String is override 1782 if _genericParams.count 1810 params = .parentBox.extendedMethodGenericParams(_genericParams) 1811 if params.count 1783 1812 sb = StringBuilder() 1784 1813 sb.append('<') 1785 1814 sep = '' 1786 for param in _genericParams1815 for param in params 1787 1816 sb.append(sep) 1788 1817 sb.append(param.sharpName) -
cobra/trunk/Source/Boxes.cobra
r1852 r1853 46 46 _attribs = attribs 47 47 _genericParams = paramList 48 for i = 0 .._genericParams.count48 for i in _genericParams.count 49 49 p = _genericParams[i] 50 if p inherits GenericParam 51 p.index = i 50 if p inherits GenericParam, p.index = i 52 51 _extensions = List<of Extension>() 53 52 _baseInterfaceProxies = baseInterfaceNodes … … 128 127 129 128 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 130 136 131 137 get hasExtensions as bool … … 819 825 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). 820 826 t.cloneCollections 827 821 828 # set the contructed type args immediately or its ancestors will get the original generic args during _bindInt: 822 829 for i in typeArgs.count 823 830 t._genericParams[i] = typeArgs[i] 824 831 assert t._constructedTypes is nil or t._constructedTypes.count == 0 832 825 833 if .didBindInt 826 834 t._completeConstruction(typeArgs) … … 828 836 t._needsConstruction(typeArgs) 829 837 assert t._constructedTypes is nil or t._constructedTypes.count == 0 838 830 839 return t 831 840 … … 871 880 gpToType = TypeUtil.dictionaryOf(_genericDef.genericParams, typeArgs) 872 881 873 _baseClass = _baseClass.secondaryConstructedTypeFor(this, gpToType) to Class882 if _baseClass, _baseClass = _baseClass.secondaryConstructedTypeFor(this, gpToType) to Class 874 883 875 884 assert _baseInterfaceProxies.count == 0 or _baseInterfaceProxies.count == _baseInterfaces.count 876 for i = 0 .._baseInterfaces.count885 for i in _baseInterfaces.count 877 886 _baseInterfaces[i] = _baseInterfaces[i].secondaryConstructedTypeFor(this, gpToType) to Interface 878 887 … … 912 921 _declsByName[decl.name] = decl 913 922 _declsByNameCI[decl.name.toLower] = decl 923 for i in _extensions.count 924 ext = _extensions[i] = _extensions[i].constructedTypeFor(typeArgs) to Extension 925 ext.completeMemberConstructionIfNeeded 914 926 # TODO: can this next statement can be axed since there is a separate "bind inheritance" phase? 915 927 _finishOverloads … … 945 957 _baseInterfaces = List<of Interface>(_baseInterfaces) 946 958 # _overloads = List<of MemberOverload>(_overloads) # these will be recreated 959 _extensions = List<of Extension>(_extensions) 947 960 948 961 def typeForGenericParam(gp as GenericParam) as IType # TODO: is this needed for NilableType? … … 1449 1462 """ 1450 1463 1451 var _extendedBoxProxy as ITypeProxy 1464 var _extendedBoxProxy as ITypeProxy? 1452 1465 var _extendedBox as Box? 1453 1466 … … 1487 1500 if box.isDescendantOf(_extendedBox to !) 1488 1501 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() 1489 1508 else 1490 1509 return nil … … 1506 1525 1507 1526 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 1508 1535 realType = _extendedBoxProxy.realType 1509 1536 if realType inherits Box … … 1511 1538 else 1512 1539 .throwError('Cannot extend a [realType.name]. You can extend classes, structs and interfaces.') 1540 1513 1541 _name = '[_extendedBox.name].extension.[.serialNum]' 1514 1542 … … 1519 1547 1520 1548 # 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) 1522 1554 1523 1555 def _bindInt … … 1548 1580 else 1549 1581 throw FallThroughException([this, decl]) 1550 decl.overloadGroup = nil # Could be in a group from the extension itself. And .addMember below do n't like that.1582 decl.overloadGroup = nil # Could be in a group from the extension itself. And .addMember below doesn't like that. 1551 1583 overload.addMember(decl) 1552 1584 if newOverload, newOverload.bindInt # an overload that never .bindInt will get cranky later



