MCPcopy Create free account
hub / github.com/Glyphack/enderpy / parse_parameters

Method parse_parameters

parser/src/parser/parser.rs:3154–3237  ·  view source on GitHub ↗
(&mut self, is_lambda: bool)

Source from the content-addressed store, hash-verified

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() {

Callers 2

parse_expressionMethod · 0.80

Calls 5

start_nodeMethod · 0.80
atMethod · 0.80
parse_parameterMethod · 0.80
eatMethod · 0.80
finish_nodeMethod · 0.80

Tested by

no test coverage detected