File: Variable.pm

package info (click to toggle)
plsense 0.3.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,012 kB
  • sloc: perl: 9,767; makefile: 2
file content (65 lines) | stat: -rw-r--r-- 2,223 bytes parent folder | download | duplicates (4)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package PlSense::Plugin::CodeAssistant::Variable;

use parent qw{ PlSense::Plugin::CodeAssistant };
use strict;
use warnings;
use Class::Std;
use List::AllUtils qw{ uniq };
use PlSense::Logger;
use PlSense::Util;
{
    sub is_only_valid_context {
        my ($self, $code, $tok) = @_;

        if ( $code !~ m{ (\$|\$\#|@|%) ([^\s\$\#@%]*) \z }xms ) { return; }
        my $vartype = $1;
        my $input = $2;

        if ( $input =~ m{ -> }xms ) { return; }
        if ( $input =~ m{ [a-zA-Z0-9_][\[\{] }xms ) { return; }

        my $pretok1 = $tok && $tok->previous_sibling;
        my $pretok2 = $pretok1 && $pretok1->previous_sibling;
        if ( $pretok1 &&
             $pretok2 &&
             $pretok1->isa("PPI::Token::Whitespace") &&
             $pretok2->isa("PPI::Token::Word") &&
             ($pretok2->content eq "my" || $pretok2->content eq "our") ) {
            return;
        }

        if ( $vartype eq '$#' ) { $vartype = '@'; }
        if ( $vartype ne '$' && $vartype ne '@' && $vartype ne '%' ) { return; }

        $self->set_input($input);
        logger->info("Match context : vartype[$vartype] input[$input]");

        my $currmdl = addrfinder->get_currentmodule;
        my $currmtd = addrfinder->get_currentmethod;
        my $mtdnm = $currmtd ? $currmtd->get_name : "";
        logger->notice("Found variable of ".$currmdl->get_fullnm." $mtdnm");
        VAR:
        foreach my $var ( $currmdl->get_current_any_variables($mtdnm), builtin->get_variables ) {
            my $currtype = substr($var->get_name, 0, 1);
            my $currnm = substr($var->get_name, 1);
            if ( $vartype eq '@' || $vartype eq '%' ) {
                if ( $currtype ne $vartype ) { next VAR; }
            }
            $self->push_candidate($currnm, $var);
        }
        EXT_VAR:
        foreach my $var ( $currmdl->get_external_any_variables ) {
            my $currtype = substr($var->get_fullnm, 0, 1);
            my $currnm = substr($var->get_fullnm, 1);
            if ( $vartype eq '@' || $vartype eq '%' ) {
                if ( $currtype ne $vartype ) { next EXT_VAR; }
            }
            $self->push_candidate($currnm, $var);
        }
        return 1;
    }
}

1;

__END__