Wiki

Ticket #258: typeAlias-chk-implements.patch

File typeAlias-chk-implements.patch, 4.4 KB (added by hopscc, 8 years ago)
  • Source/Types.cobra

     
    873873        if _superType is nil 
    874874            _superType = .compiler.objectType 
    875875        if .compiler  # will be nil during unit tests 
    876             _box = Class(Token.empty, Token.empty, '[.getType.name]_[.serialNum]', List<of IType>(), List<of String>(), AttributeList(), ClrTypeProxy(Object), List<of ITypeProxy>(), List<of ITypeProxy>(), nil) 
     876            # Tmp hack below, this would be better done by reading interfaces off nativeType and copying  
     877            #  them onto this aliasType 
     878            icomp = .compiler.libraryType('System.IComparable') 
     879            iconv = .compiler.libraryType('System.IConvertible') 
     880            # TODO ifmt = .compiler.libraryType('System.IFormattable') # ints/single/float/Decimal only 
     881            # TODO IComparable<type>, IEquatable<type> 
     882            interfaces = [icomp to ITypeProxy, iconv]   
     883            _box = Class(Token.empty, Token.empty, '[.getType.name]_[.serialNum]', List<of IType>(), List<of String>(), AttributeList(), ClrTypeProxy(Object), interfaces, List<of ITypeProxy>(), nil) 
    877884            _box.bindInh 
    878885     
    879886    def _bindInt 
     
    892899            # the next statement can be problematic in that you have to add new DecimalTools methods in Snapshot just so the compiler can see them 
    893900            # ultimately, extensions of primitive types should be supported 
    894901            _installNativeMethodsFrom('CobraLangInternal', ClrNativeType(Cobra.Lang.DecimalTools.getType), meths) 
    895  
     902            #TODO _installNativeInterfacesFrom('System', _nativeType to !) 
    896903            _box.bindInt 
    897904            if false 
    898905                # print out the methods 
     
    985992    def isAssignableTo(type as IType) as bool 
    986993        r = base.isAssignableTo(type) 
    987994        if not r, r = _systemAliasType == type 
     995        if not r and _box, r =  _box.isAssignableTo(type) 
    988996        return r 
    989997 
    990998    def isComparableTo(t as IType) as bool 
  • Tests/130-interfaces/800-primitive-typeAlias-implements.cobra

     
     1# int primitive aliasType not cogniscent of interfaces of Int* 
     2# Also missing on other aliasTypes but this only exercises 
     3# IComparable, IConvertible 
     4# full set of interfaces on aliases to check is 
     5#  int{8,16,32,64} IComparable, IConvertible, IFormattable   IComparable<int>, IEquatable<int>,  
     6#   single         IComparable, IConvertible, IFormattable   IComparable<float>, IEquatable<float>,  
     7#   double         IComparable, IConvertible, IFormattable   IComparable<double>, IEquatable<double>  
     8#   decimal        IComparable, IConvertible, IFormattable   IComparable<decimal>, IEquatable<decimal>  
     9 
     10#   bool  IComparable, IConvertible,                 IComparable<bool>, IEquatable<bool>,  
     11#   char  IComparable, IConvertible,                 IComparable<bool>, IEquatable<bool>,  
     12 
     13class IntNotIComp 
     14    def main 
     15         
     16        # int (int32) 
     17        i as int = 47 
     18        i1 as int = 46 
     19        .checkIComparable(i, i1) 
     20        .checkIConvertible(i, i1) 
     21        #b = .checkICompGt(i, i1) # was compile error here 
     22        #assert b 
     23        #print b 
     24     
     25        # bool 
     26        b = true 
     27        b1 = false 
     28        .checkIComparable(b, b1) 
     29        .checkIConvertible(b, b1) 
     30     
     31        # char 
     32        c = c'0' 
     33        c1 = c'1' 
     34        .checkIComparable(c, c1) 
     35        .checkIConvertible(c, c1) 
     36         
     37        # float/single 
     38        s  = 10f 
     39        s1 = 11f 
     40        .checkIComparable(s, s1) 
     41        .checkIConvertible(s, s1) 
     42         
     43        # float64/double 
     44        d  as float64 = 10f64 
     45        d1 as float64 = 11f64 
     46        .checkIComparable(d, d1) 
     47        .checkIConvertible(d, d1) 
     48     
     49        # Decimal 
     50        dc  as decimal = 99.1 
     51        dc1 as decimal = 99.9 
     52        .checkIComparable(dc, dc1) 
     53        .checkIConvertible(dc, dc1) 
     54     
     55         
     56    def checkICompGt(i as IComparable, i1 as IComparable) as bool 
     57        if i.compareTo(i1) >0, return true 
     58        return false 
     59         
     60    def checkIComparable(i as IComparable, i1 as IComparable) 
     61        pass 
     62         
     63    def checkIConvertible(i as IConvertible, i1 as IConvertible) 
     64        pass 
     65     
     66    #NYI     
     67    def checkIFormattable(f as IFormattable, f1 as IFormattable) 
     68        pass 
     69         
     70class GenChk<of T> 
     71    shared 
     72        def checkIComparableG(i as IComparable<of T>, i1 as IComparable<of T>) 
     73            pass 
     74         
     75        def checkIEquatableG(e as IEquatable<of T>, e1 as IEquatable<of T>) 
     76            pass 
     77    # use as GenChk<of int>.checkIComparableG(i, i1) 
     78    # use as GenChk<of bool>.checkIComparableG(b, b1) 
     79    #...