File: select.py

package info (click to toggle)
fortran-language-server 3.2.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,268 kB
  • sloc: python: 9,688; f90: 1,195; fortran: 30; makefile: 28; ansic: 20
file content (74 lines) | stat: -rw-r--r-- 2,399 bytes parent folder | download
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
66
67
68
69
70
71
72
73
74
from __future__ import annotations

from typing import TYPE_CHECKING

from fortls.constants import SELECT_TYPE_ID

from .block import Block
from .variable import Variable

if TYPE_CHECKING:
    from .ast import FortranAST


class Select(Block):
    def __init__(
        self,
        file_ast: FortranAST,
        line_number: int,
        name: str,
        select_info,
    ):
        super().__init__(file_ast, line_number, name)
        self.select_type = select_info.type
        self.binding_name = None
        self.bound_var = None
        self.binding_type = None
        if self.select_type == 2:
            binding_split = select_info.binding.split("=>")
            if len(binding_split) == 1:
                self.bound_var = binding_split[0].strip()
            elif len(binding_split) == 2:
                self.binding_name = binding_split[0].strip()
                self.bound_var = binding_split[1].strip()
        elif self.select_type == 3:
            self.binding_type = select_info.binding
        # Close previous "TYPE IS" region if open
        if (
            (file_ast.current_scope is not None)
            and (file_ast.current_scope.get_type() == SELECT_TYPE_ID)
            and file_ast.current_scope.is_type_region()
        ):
            file_ast.end_scope(line_number)

    def get_type(self, no_link=False):
        return SELECT_TYPE_ID

    def get_desc(self):
        return "SELECT"

    def is_type_binding(self):
        return self.select_type == 2

    def is_type_region(self):
        return self.select_type in [3, 4]

    def create_binding_variable(self, file_ast, line_number, var_desc, case_type):
        if self.parent.get_type() != SELECT_TYPE_ID:
            return None
        binding_name = None
        bound_var = None
        if (self.parent is not None) and self.parent.is_type_binding():
            binding_name = self.parent.binding_name
            bound_var = self.parent.bound_var
        # Check for default case
        if (binding_name is not None) and (case_type != 4):
            bound_var = None
        # Create variable
        if binding_name is not None:
            return Variable(
                file_ast, line_number, binding_name, var_desc, [], link_obj=bound_var
            )
        elif bound_var is not None:
            return Variable(file_ast, line_number, bound_var, var_desc, [])
        return None