Wiki

Ticket #336: chk-args-vs-param.patch

File chk-args-vs-param.patch, 4.6 KB (added by hopscc, 11 years ago)
  • Source/Expr.cobra

     
    20432043 
    20442044        numPropertyInits = _verifyAndBindArgs(expr) 
    20452045        _checkTypes(expr) 
    2046         _type ?= _hoistType(expr)  # if _type not set in _checkTypes 
     2046        _type ?= _hoistType(expr) # if _type not set in _checkTypes 
    20472047 
    2048         # to-do: try and checkout initializer call 
    2049  
    2050         if _hasKeywordArg and numPropertyInits > 0 and not .isForAttribute and not .hasError                 
     2048        #try and checkout initializer call 
     2049        if .args.count-numPropertyInits>0 and expr inherits IdentifierExpr and expr.definition inherits ClassOrStruct and not .hasError 
     2050            # we skip checks on 0 arg calls here for a more detailed message later from _paramsCountMsg 
     2051            _checkInitializer(expr, numPropertyInits) 
     2052             
     2053        if _hasKeywordArg and numPropertyInits >0 and not .isForAttribute and not .hasError              
    20512054            _makeHelperMethod 
    20522055 
    20532056    def _verifyAndBindArgs(expr as Expr) as int  
     
    21102113                    initCall = initdefn 
    21112114                # to-do: verify args and params match exactly re count, assignability 
    21122115                # maybe adjust inheritance tree to use code from CallExpr... 
    2113                 /#  
     2116                /# 
    21142117                params = initCall.params 
    21152118                print params 
    21162119                if initCall inherits BoxMember # .no-warnings. 
     
    21232126                                 
    21242127                _checkVisibility(definition, expr) 
    21252128                #/ 
     2129            else 
     2130                throw FallThroughException(initdefn) 
    21262131        return initCall          
    21272132     
    21282133    def _argsToCallArgs as List<of Expr> 
     
    21922197 
    21932198        return type 
    21942199             
     2200    def _checkInitializer(expr as Expr, numPropertyInits as int) 
     2201        assert expr inherits IdentifierExpr and expr.definition inherits ClassOrStruct 
     2202        # skip passthrough in arg 
     2203        if .args.count == 1 and .args[0].type == .typeProvider.passThroughType  
     2204            return 
     2205        initCall = _bestInitializer 
     2206        if not initCall 
     2207            return 
     2208        # skip paramlist vari Type   
     2209        if initCall.hasParams and initCall.params.count == 1 and initCall.params[0].type inherits VariType 
     2210            return 
     2211        # augment to check vari arg type same as vari param type 
     2212        nDefaultedParams = 0 
     2213        if initCall.hasParams 
     2214            for p in initCall.params, if p.isOptional, nDefaultedParams += 1 
     2215        pCount = initCall.params.count 
     2216        argCount = .args.count - numPropertyInits 
     2217        if not (argCount >= pCount - nDefaultedParams and argCount <= pCount) 
     2218            wherePos ='(declared at [initCall.token.fileName]:[initCall.token.lineNum])' 
     2219            dfltParams = if(nDefaultedParams, ' (with up to [nDefaultedParams] defaulted)', '') 
     2220            paramStr = '[pCount] parameter' + if(pCount==1, '', 's')     
     2221            sugg = 'Best choice has [paramStr][dfltParams] [wherePos].' 
     2222            args = if(numPropertyInits == 0, .args, _argsToCallArgs) 
     2223            decl = _paramsVsArgsString(initCall.name, initCall.params, args) 
     2224            paramStr = '[argCount] parameter' + if(argCount==1, '', 's')     
     2225            .throwError('No initializer in [expr.type.englishName] "[expr.toCobraSource]" with [paramStr]. [sugg][decl]') 
     2226 
    21952227    def _makeHelperMethod 
    21962228        """ 
    21972229        Add a private helper method to the current box to support extended initializer. 
  • Tests/120-classes/400-methods/600-named-params/850-bad-init.cobra

     
    1 # Change this later when add Initializer checks 
     1# Changed for cobra compiler Initializer checks 
    22 
    33class BadI 
    44 
    55    def main is shared 
    6         x = BadI('default', 0, 10)  # .error. not contain an initializer that takes 
     6        x = BadI('default', 0, 10)  # .error. No initializer in class "BadI" with 3 parameters 
    77            # ... 3 arguments   - .NET 
    88            # ... "3" arguments - Mono 
    99        CobraCore.noOp(x) 
     
    1111    var x = '' 
    1212    var a = 0 
    1313     
    14     cue init(sName as String, age as int)  # .warning. previous error 
     14    cue init(sName as String, age as int)  # (from csc) . warning. previous error 
    1515        base.init 
    1616        .x = sName 
    1717        .a = age 
  • Tests/120-classes/328-construct-inheritance-error.cobra

     
    66 
    77class B inherits A 
    88 
    9     cue init   # .warning. previous error 
     9    cue init    # (from csc) . warning. previous error 
    1010        base.init(0) 
    1111 
    1212 
     
    1414 
    1515    def main 
    1616        B() 
    17         B(5)  # .error. argument 
     17        B(5)  # .error. no initializer