@@ -493,6 +493,9 @@ sub dtparse
493
493
}
494
494
}
495
495
496
+ # Check the fragment order
497
+ ordercheck($dt , {}) if ($dt -> {' plugin' });
498
+
496
499
# Check the overrides
497
500
my $overrides = get_node($dt , ' /__overrides__' );
498
501
foreach my $param (@{$overrides -> [1]})
@@ -978,6 +981,43 @@ sub ovapply
978
981
}
979
982
}
980
983
984
+ sub ordercheck
985
+ {
986
+ my ($ov , $applied ) = @_ ;
987
+
988
+ # Try to apply fragments that target other fragments within the overlay
989
+ foreach my $fragment (get_fragments($ov ))
990
+ {
991
+ my $overlay = get_child($fragment , ' __overlay__' );
992
+ next if (!$overlay );
993
+ my $target_node ;
994
+ my $target = get_prop($fragment , ' target' );
995
+ if ($target )
996
+ {
997
+ my $label = get_label_ref($target -> [1]);
998
+ die " * Invalid target reference\n " if ($label !~ / ^&(.*)/ );
999
+ $target_node = $ov -> {' labels' }-> {$1 };
1000
+ if ($target_node )
1001
+ {
1002
+ my $target_fragment = fragment_of($target_node );
1003
+ die " * $fragment ->[0] should precede " . ($target_fragment ? $target_fragment -> [0] : " fragment@?" ) . " \n "
1004
+ if ($applied -> {$target_node });
1005
+ set_applied($overlay , $applied );
1006
+ }
1007
+ }
1008
+ }
1009
+ }
1010
+
1011
+ sub set_applied
1012
+ {
1013
+ my ($node , $applied ) = @_ ;
1014
+ $applied -> {$node } = 1;
1015
+ foreach my $subnode (get_children($node ))
1016
+ {
1017
+ set_applied($subnode , $applied );
1018
+ }
1019
+ }
1020
+
981
1021
sub parse_node
982
1022
{
983
1023
my ($state , $parent , $depth , $node , @newlabels ) = @_ ;
@@ -1178,6 +1218,14 @@ sub resolve_alias
1178
1218
}
1179
1219
}
1180
1220
1221
+ sub fragment_of
1222
+ {
1223
+ my ($node ) = @_ ;
1224
+ return undef if (!$node );
1225
+ return $node if ($node -> [0] =~ / ^fragment@/ );
1226
+ return fragment_of($node -> [4]);
1227
+ }
1228
+
1181
1229
sub dump_node
1182
1230
{
1183
1231
my ($node , $depth ) = @_ ;
0 commit comments