summaryrefslogtreecommitdiff
path: root/test/lisp/progmodes/cperl-mode-resources/proto-and-attrs.pl
blob: 7138bf631dff7ec205c5646dd759f2c6fac73292 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# The next two lines are required as of 2022, but obsolescent
# as soon as signatures leave their "experimental" state
use feature 'signatures';
no warnings 'experimental::signatures';

# Tests for subroutine prototypes, signatures and the like

# Prototypes have syntactical properties different from "normal" Perl:
# Perl has a variable $), so ($)) is not an unbalanced parenthesis.
# On the other hand, in a prototype ($) is _not_ an open paren
# followed by the variable $), so the parens are balanced.  Prototypes
# are somewhat frowned upon most of the times, but they are required
# for some Perl magic

# FIXME: 2022-02-02 CPerl mode does not handle subroutine signatures.
# In simple cases it mistakes them as prototypes, when attributes are
# present, it doesn't handle them at all.  Variables in signatures
# SHOULD be fontified like variable declarations.

# Part 1: Named subroutines
# A prototype and a trivial subroutine attribute
{
    no feature 'signatures'; # that's a prototype, not a signature
    sub sub_1 ($) :lvalue { local $); }
}

# A prototype as an attribute (how it should be written these days)
sub sub_2 :prototype($) { ...; }

# A signature (these will soon-ish leave the experimental state)
sub sub_3 ($foo,$bar) { ...; }

# Attribute plus signature FIXME: Not yet supported
sub bad_sub_4 :prototype($$$) ($foo,$bar,$baz) { ...; }

# Part 2: Same constructs for anonymous subs
# A prototype and a trivial subroutine attribute
{
    no feature 'signatures'; # that's a prototype, not a signature
    my $subref_1 = sub ($) :lvalue { local $); };
}

# A prototype as an attribute (how it should be written these days)
my $subref_2 = sub :prototype($) { ...; };

# A signature (these will soon-ish leave the experimental state)
my $subref_3 = sub ($foo,$bar) { ...; };

# Attribute plus signature
my $subref_4 = sub :prototype($$$) ($foo,$bar,$baz) { ...; };