Wiki

Ticket #264: tkt264.patch

File tkt264.patch, 3.1 KB (added by hopscc, 12 years ago)
  • Source/BackEndClr/SharpGenerator.cobra

     
    36363636            if expr inherits TypeExpr 
    36373637                if expr.containedType inherits ArrayType 
    36383638                    # arrays 
    3639                     sw.write('new ') 
    3640                     sw.write((expr.containedType to ArrayType).theWrappedType.sharpRef) 
    3641                     sw.write(r'[') 
    3642                     .writeSharpArgs(sw) 
    3643                     sw.write(r']') 
     3639                    _writeNewCall(sw, nil, (expr.containedType to ArrayType).theWrappedType.sharpRef, false)  
    36443640                else 
    3645                     sw.write('new ') 
    3646                     expr.writeSharpDef(sw) 
    3647                     sw.write('(') 
    3648                     .writeSharpArgs(sw) 
    3649                     sw.write(')') 
     3641                    _writeNewCall(sw, expr, '', true)  
    36503642            else if expr inherits IdentifierExpr 
    36513643                if expr.isTypeReference 
    3652                     sw.write('new ') 
    3653                     expr.writeSharpDef(sw) 
    3654                     sw.write('(') 
    3655                     .writeSharpArgs(sw) 
    3656                     sw.write(')') 
     3644                    _writeNewCall(sw, expr, '', true)  
    36573645                else if expr.receiverType inherits GenericParam # TODO: shouldn't expr.isTypeReference above have caught this? 
    3658                     sw.write('new [expr.receiverType.sharpRef](') 
    3659                     .writeSharpArgs(sw) 
    3660                     sw.write(')') 
     3646                    _writeNewCall(sw, nil, expr.receiverType.sharpRef, true)  
    36613647                else if expr.type.nonNil.isDescendantOf(.compiler.delegateType) 
    36623648                    isMethodSig = true 
    36633649                else if expr.type.isSystemTypeClass or _type.isDynamic 
     
    36863672                    if defi.type.isDynamic 
    36873673                        what = '(System.Type)' + what 
    36883674                # TODO: could speed this up. see http://ayende.com/Blog/archive/2008/02/27/Creating-objects--Perf-implications.aspx 
    3689                 sw.write('System.Activator.CreateInstance([what]') 
     3675                sw.write('System.Activator.CreateInstance(') 
     3676                if what == r'[]'  # Indexer - something like  myList[idx]() 
     3677                    expr.writeSharpDef(sw) 
     3678                else 
     3679                    sw.write(what) 
    36903680                .writeSharpArgs(sw, ', ') 
    36913681                sw.write(')') 
    36923682            if parens, sw.write(')') 
    3693  
     3683                 
     3684    def _writeNewCall(sw as CurlyWriter, expr as Expr?, exprStr as String, isInvocation as bool) 
     3685        require expr or exprStr.length >0 
     3686        delim =  if(isInvocation, '()', r'[]') # invocation or index deref 
     3687        sw.write('new ') 
     3688        if expr, expr.writeSharpDef(sw) 
     3689        else,   sw.write(exprStr) 
     3690        sw.write(delim[0]) 
     3691        .writeSharpArgs(sw) 
     3692        sw.write(delim[1]) 
     3693                 
    36943694    def writeSharpArgs(sw as CurlyWriter) 
    36953695        .writeSharpArgs(sw, '') 
    36963696 
  • Tests/320-misc-two/855-indexed-postcall.cobra

     
     1class A 
     2    def blah 
     3        print "A!" 
     4   
     5class B 
     6    def blah 
     7        print "B!" 
     8   
     9class C 
     10    def blah 
     11        print "C!" 
     12 
     13 
     14class Program 
     15    def main 
     16        myList = [A, B, C] 
     17        for i, type in myList.numbered 
     18            # This works: 
     19            type = myList[i] 
     20            type().blah 
     21            # This failed at compile time: 
     22            myList[i]().blah 
     23 
     24        for i in 0: myList.count 
     25            myList[i]().blah