(&mut self, is_lambda: bool)
| 3152 | } |
| 3153 | |
| 3154 | fn parse_parameters(&mut self, is_lambda: bool) -> Result<Arguments, ParsingError> { |
| 3155 | let node = self.start_node(); |
| 3156 | let mut seen_vararg = false; |
| 3157 | let mut seen_kwarg = false; |
| 3158 | let mut must_have_default = false; |
| 3159 | |
| 3160 | let mut posonlyargs = vec![]; |
| 3161 | let mut args = vec![]; |
| 3162 | let mut vararg = None; |
| 3163 | let mut kwarg = None; |
| 3164 | let mut kwonlyargs = vec![]; |
| 3165 | let mut kw_defaults = vec![]; |
| 3166 | let mut defaults = vec![]; |
| 3167 | |
| 3168 | loop { |
| 3169 | if self.at(Kind::Identifier) { |
| 3170 | let (param, default) = self.parse_parameter(is_lambda)?; |
| 3171 | if seen_vararg { |
| 3172 | kwonlyargs.push(param); |
| 3173 | } else if seen_kwarg { |
| 3174 | panic!("positional argument follows keyword argument"); |
| 3175 | } else { |
| 3176 | args.push(param); |
| 3177 | } |
| 3178 | |
| 3179 | // TODO: refactor this |
| 3180 | if seen_vararg { |
| 3181 | kw_defaults.push(default); |
| 3182 | } else if let Some(default_value) = default { |
| 3183 | must_have_default = true; |
| 3184 | defaults.push(default_value); |
| 3185 | } else if must_have_default { |
| 3186 | panic!("non-default argument follows default argument"); |
| 3187 | } |
| 3188 | // If a parameter has a default value, all following parameters up |
| 3189 | // until the “*” must also have a default value — this |
| 3190 | // is a syntactic restriction that is not expressed by the grammar. |
| 3191 | } else if self.eat(Kind::Mul) { |
| 3192 | seen_vararg = true; |
| 3193 | // after seeing vararg the must_have_default is reset |
| 3194 | // until we see a default value again |
| 3195 | must_have_default = false; |
| 3196 | // In this case this is not a vararg but only marks the end of positional |
| 3197 | // arguments e.g. def foo(a, b, *, c, d) |
| 3198 | if self.eat(Kind::Comma) { |
| 3199 | continue; |
| 3200 | } |
| 3201 | let (param, default) = self.parse_parameter(is_lambda)?; |
| 3202 | // default is not allowed for vararg |
| 3203 | if default.is_some() { |
| 3204 | panic!("var-positional argument cannot have default value"); |
| 3205 | } |
| 3206 | vararg = Some(param); |
| 3207 | } else if self.eat(Kind::Pow) { |
| 3208 | seen_kwarg = true; |
| 3209 | let (param, default) = self.parse_parameter(is_lambda)?; |
| 3210 | // default is not allowed for kwarg |
| 3211 | if default.is_some() { |
no test coverage detected