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
|