Skip to content

Commit 7fbfe8e

Browse files
authored
Merge pull request #133 from gnikit/feature/clean-up-vars
Feature/clean-up-vars
2 parents 573dc60 + 14b5724 commit 7fbfe8e

File tree

3 files changed

+25
-30
lines changed

3 files changed

+25
-30
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
### Changed
1313

14+
- Renamed variables to simplify parser
15+
([#131](https://github.com/gnikit/fortls/pull/131))
1416
- Redesigned parsing functions for short-hand declarations of array dimensions,
1517
character length and parsing of kind
1618
([#130](https://github.com/gnikit/fortls/pull/130))

fortls/parse_fortran.py

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -706,9 +706,7 @@ def read_vis_stmnt(line: str) -> tuple[Literal["vis"], VisInfo] | None:
706706
]
707707

708708

709-
def find_external_type(
710-
file_ast: FortranAST, desc_string: str, name_stripped: str
711-
) -> bool:
709+
def find_external_type(file_ast: FortranAST, desc_string: str, name: str) -> bool:
712710
"""Encountered a variable with EXTERNAL as its type
713711
Try and find an already defined variable with a
714712
NORMAL Fortran Type"""
@@ -717,7 +715,7 @@ def find_external_type(
717715
counter = 0
718716
# Definition without EXTERNAL has already been parsed
719717
for v in file_ast.variable_list:
720-
if name_stripped == v.name:
718+
if name == v.name:
721719
# If variable is already in external objs it has
722720
# been parsed correctly so exit
723721
if v in file_ast.external_objs:
@@ -733,17 +731,15 @@ def find_external_type(
733731
return False
734732

735733

736-
def find_external_attr(
737-
file_ast: FortranAST, name_stripped: str, new_var: Variable
738-
) -> bool:
734+
def find_external_attr(file_ast: FortranAST, name: str, new_var: Variable) -> bool:
739735
"""Check if this NORMAL Fortran variable is in the external_objs with only
740736
``EXTERNAL`` as its type. Used to detect seperated ``EXTERNAL`` declarations.
741737
742738
Parameters
743739
----------
744740
file_ast : fortran_ast
745741
AST file
746-
name_stripped : str
742+
name : str
747743
Variable name, stripped
748744
new_var : fortran_var
749745
Fortran variable to check against
@@ -756,7 +752,7 @@ def find_external_attr(
756752
"""
757753
counter = 0
758754
for v in file_ast.external_objs:
759-
if v.name != name_stripped:
755+
if v.name != name:
760756
continue
761757
if v.desc.upper() != "EXTERNAL":
762758
continue
@@ -779,7 +775,7 @@ def find_external_attr(
779775
def find_external(
780776
file_ast: FortranAST,
781777
desc_string: str,
782-
name_stripped: str,
778+
name: str,
783779
new_var: Variable,
784780
) -> bool:
785781
"""Find a procedure, function, subroutine, etc. that has been defined as
@@ -808,7 +804,7 @@ def find_external(
808804
AST
809805
desc_string : str
810806
Variable type e.g. ``REAL``, ``INTEGER``, ``EXTERNAL``
811-
name_stripped : str
807+
name : str
812808
Variable name
813809
new_var : fortran_var
814810
The line variable that we are attempting to match with an ``EXTERNAL``
@@ -820,10 +816,10 @@ def find_external(
820816
True if the variable is ``EXTERNAL`` and we manage to link it to the
821817
rest of its components, else False
822818
"""
823-
if find_external_type(file_ast, desc_string, name_stripped):
819+
if find_external_type(file_ast, desc_string, name):
824820
return True
825821
elif desc_string.upper() != "EXTERNAL":
826-
if find_external_attr(file_ast, name_stripped, new_var):
822+
if find_external_attr(file_ast, name, new_var):
827823
return True
828824
return False
829825

@@ -1355,53 +1351,49 @@ def parse(
13551351
if obj_type == "var":
13561352
if obj_info.var_names is None:
13571353
continue
1358-
desc_string = obj_info.var_type
13591354
link_name: str = None
13601355
procedure_def = False
1361-
if desc_string[:3] == "PRO":
1356+
if obj_info.var_type[:3] == "PRO":
13621357
if file_ast.current_scope.get_type() == INTERFACE_TYPE_ID:
13631358
for var_name in obj_info.var_names:
13641359
file_ast.add_int_member(var_name)
13651360
log.debug("%s !!! INTERFACE-PRO - Ln:%d", line.strip(), line_no)
13661361
continue
13671362
procedure_def = True
1368-
link_name = get_paren_substring(desc_string)
1363+
link_name = get_paren_substring(obj_info.var_type)
13691364
for var_name in obj_info.var_names:
1370-
desc = desc_string
1365+
desc = obj_info.var_type
13711366
link_name: str = None
13721367
if var_name.find("=>") > -1:
13731368
name_split = var_name.split("=>")
1374-
# TODO: rename name_raw to name
1375-
# TODO: rename name_stripped to name
1376-
# TODO: rename desc_string to desc
1377-
name_raw = name_split[0]
1369+
name = name_split[0]
13781370
link_name = name_split[1].split("(")[0].strip()
13791371
if link_name.lower() == "null":
13801372
link_name = None
13811373
else:
1382-
name_raw = var_name.split("=")[0]
1374+
name = var_name.split("=")[0]
13831375
# Add dimension if specified
13841376
# TODO: turn into function and add support for co-arrays i.e. [*]
13851377
# Copy global keywords to the individual variable
13861378
var_keywords: list[str] = obj_info.keywords[:]
13871379
# The name starts with (
1388-
if name_raw.find("(") == 0:
1380+
if name.find("(") == 0:
13891381
continue
1390-
name_raw, dims = self.parse_imp_dim(name_raw)
1391-
name_raw, char_len = self.parse_imp_char(name_raw)
1382+
name, dims = self.parse_imp_dim(name)
1383+
name, char_len = self.parse_imp_char(name)
13921384
if dims:
13931385
var_keywords.append(dims)
13941386
if char_len:
13951387
desc += char_len
13961388

1397-
name_stripped = name_raw.strip()
1389+
name = name.strip()
13981390
keywords, keyword_info = map_keywords(var_keywords)
13991391

14001392
if procedure_def:
14011393
new_var = Method(
14021394
file_ast,
14031395
line_no,
1404-
name_stripped,
1396+
name,
14051397
desc,
14061398
keywords,
14071399
keyword_info=keyword_info,
@@ -1411,7 +1403,7 @@ def parse(
14111403
new_var = Variable(
14121404
file_ast,
14131405
line_no,
1414-
name_stripped,
1406+
name,
14151407
desc,
14161408
keywords,
14171409
keyword_info=keyword_info,
@@ -1421,14 +1413,14 @@ def parse(
14211413
# If the object is fortran_var and a parameter include
14221414
# the value in hover
14231415
if new_var.is_parameter():
1424-
_, col = find_word_in_line(line, name_stripped)
1416+
_, col = find_word_in_line(line, name)
14251417
match = FRegex.PARAMETER_VAL.match(line[col:])
14261418
if match:
14271419
var = match.group(1).strip()
14281420
new_var.set_parameter_val(var)
14291421

14301422
# Check if the "variable" is external and if so cycle
1431-
if find_external(file_ast, desc, name_stripped, new_var):
1423+
if find_external(file_ast, desc, name, new_var):
14321424
continue
14331425

14341426
# if not merge_external:

test/test_source/parse/test_incomplete_dims.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ program test_incomplete_dims
55
implicit none
66
integer :: dim_val(1, 2
77
character :: char_val*(10
8+
integer :: (
89
end program test_incomplete_dims

0 commit comments

Comments
 (0)