Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[dotnet] Implement compilation of .flat on PAST nodes, so we can now …
…support flattened args.
  • Loading branch information
jnthn committed Nov 21, 2010
1 parent 63f91ae commit 3a28d12
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions dotnet/compiler/PAST2DNSTCompiler.pm
Expand Up @@ -852,6 +852,8 @@ sub form_capture(@args, $inv?) {
my $pos_part := DNST::ArrayLiteral.new( :type('RakudoObject') );
my $named_part := DNST::DictionaryLiteral.new(
:key_type('string'), :value_type('RakudoObject') );
my $flatten_flags := DNST::ArrayLiteral.new( :type('int') );
my $has_flats := 0;

# If it's a method call, we'll have an invocant to emit.
if $inv ~~ DNST::Node {
Expand All @@ -861,17 +863,31 @@ sub form_capture(@args, $inv?) {
# Go over the args.
for @args {
if $_ ~~ PAST::Node && $_.named {
$named_part.push(DNST::Literal.new( :value($_.named), :escape(1) ));
$named_part.push(dnst_for($_));
if $_.flat {
$pos_part.push(dnst_for($_));
$flatten_flags.push('CaptureHelper.FLATTEN_NAMED');
$has_flats := 1;
}
else {
$named_part.push(DNST::Literal.new( :value($_.named), :escape(1) ));
$named_part.push(dnst_for($_));
}
}
elsif $_ ~~ PAST::Node && $_.flat {
$pos_part.push(dnst_for($_));
$flatten_flags.push('CaptureHelper.FLATTEN_POS');
$has_flats := 1;
}
else {
$pos_part.push(dnst_for($_));
$flatten_flags.push('CaptureHelper.FLATTEN_NONE');
}
}

# Push the various parts as needed.
$capture.push($pos_part);
if +@($named_part) { $capture.push($named_part); }
if +@($named_part) || $has_flats { $capture.push($named_part); }
if $has_flats { $capture.push($flatten_flags); }

$capture;
}
Expand Down

0 comments on commit 3a28d12

Please sign in to comment.