fparser Reference Guide  0.0.14
fparser.one.statements.Use Class Reference
Inheritance diagram for fparser.one.statements.Use:
Collaboration diagram for fparser.one.statements.Use:

Public Member Functions

def process_item (self)
 
def tofortran (self, isfix=None)
 
def analyze (self)
 
def populate_use_provides (self, all_mod_provides, use_provides, name, rename=None)
 
- Public Member Functions inherited from fparser.common.base_classes.Statement
def __init__ (self, parent, item)
 
def __repr__ (self)
 
def torepr (self, depth=-1, incrtab="")
 
def get_indent_tab (self, deindent=False, isfix=None)
 
def __str__ (self)
 
def asfix (self)
 
def format_message (self, kind, message)
 
def error (self, message)
 
def warning (self, message)
 
def info (self, message)
 
def analyze (self)
 
def get_variable (self, name)
 
def get_type (self, name)
 
def get_type_decl (self, kind)
 
def get_provides (self)
 
- Public Member Functions inherited from fparser.common.utils.classes
def __new__ (metacls, name, bases, dict)
 
- Public Member Functions inherited from fparser.common.utils.meta_classes
def __getattr__ (self, name)
 

Public Attributes

 isvalid
 
 nature
 
 isonly
 
 name
 
 items
 
- Public Attributes inherited from fparser.common.base_classes.Statement
 parent
 
 reader
 
 top
 
 item
 
 programblock
 
 isvalid
 
 ignore
 
 a
 

Static Public Attributes

 match
 
- Static Public Attributes inherited from fparser.common.base_classes.Statement
list modes = ["free", "fix", "f77", "pyf"]
 

Detailed Description

Parses USE statement.

:param class Statement: Base fparser class.
:raises AnalyzeError: If entity name is not in module.

Fortran syntax construct:

USE [ [ , <module-nature> ] :: ] <module-name> [ , <rename-list> ]
USE [ [ , <module-nature> ] :: ] <module-name> , ONLY : [ <only-list> ]
<module-nature> = INTRINSIC | NON_INTRINSIC
<rename> = <local-name> => <use-name>
           | OPERATOR ( <local-defined-operator> ) =>
                        OPERATOR ( <use-defined-operator> )
<only> = <generic-spec> | <only-use-name> | <rename>
<only-use-name> = <use-name>

Definition at line 1217 of file statements.py.

Member Function Documentation

◆ analyze()

def fparser.one.statements.Use.analyze (   self)
Returns warnings if this object is incorrect

Definition at line 1287 of file statements.py.

References fparser.common.base_classes.Variable.info(), fparser.common.base_classes.Statement.info(), fparser.one.statements.Use.isonly, fparser.one.statements.StatementWithNamelist.items, fparser.one.statements.Assign.items, fparser.one.statements.Call.items, fparser.one.statements.ComputedGoto.items, fparser.one.statements.AssignedGoto.items, fparser.one.statements.Print.items, fparser.one.statements.Read0.items, fparser.one.statements.Read1.items, fparser.one.statements.Write.items, fparser.one.statements.Allocate.items, fparser.one.statements.Deallocate.items, fparser.one.statements.ModuleProcedure.items, fparser.one.statements.Access.items, fparser.one.statements.Save.items, fparser.one.statements.Nullify.items, fparser.one.statements.Use.items, fparser.common.base_classes.Variable.name, fparser.common.readfortran.Line.name, fparser.one.block_statements.BeginSource.name, fparser.one.block_statements.Module.name, fparser.one.block_statements.PythonModule.name, fparser.one.block_statements.BlockData.name, fparser.one.block_statements.Interface.name, fparser.one.block_statements.SubProgramStatement.name, fparser.common.base_classes.BeginStatement.name, fparser.one.statements.Cycle.name, fparser.common.base_classes.EndStatement.name, fparser.one.block_statements.Select.name, fparser.one.block_statements.Where.name, fparser.one.block_statements.Forall.name, fparser.one.block_statements.IfThen.name, fparser.one.statements.Use.name, fparser.one.block_statements.Do.name, fparser.one.block_statements.Type.name, fparser.common.base_classes.Variable.parent, fparser.common.base_classes.Statement.parent, fparser.one.statements.Use.populate_use_provides(), fparser.common.base_classes.Statement.reader, fparser.common.base_classes.Statement.top, fparser.common.base_classes.Variable.warning(), and fparser.common.base_classes.Statement.warning().

1287  def analyze(self): # pylint: disable=invalid-name
1288  """Returns warnings if this object is incorrect"""
1289  use = self.parent.a.use
1290  if self.name in use:
1291  return
1292 
1293  modules = self.top.a.module
1294  if self.name not in modules:
1295  fn = self.reader.find_module_source_file(self.name)
1296  if fn is not None:
1297  from fparser.common.readfortran import FortranFileReader
1298  from fparser.one.parsefortran import FortranParser
1299 
1300  self.info("looking module information from %r" % (fn))
1301  reader = FortranFileReader(
1302  fn,
1303  include_dirs=self.reader.include_dirs,
1304  source_only=self.reader.source_only,
1305  )
1306  parser = FortranParser(reader)
1307  parser.parse()
1308  parser.block.a.module.update(modules)
1309  parser.analyze()
1310  modules.update(parser.block.a.module)
1311 
1312  if self.name not in modules:
1313  self.warning(
1314  "no information about the module %r in use statement" % (self.name)
1315  )
1316  return
1317 
1318  module = modules[self.name]
1319  use[self.name] = module
1320  use_provides = self.parent.a.use_provides
1321  renames = [split_comma(item, comma="=>") for item in self.items if "=>" in item]
1322  norenames = [item for item in self.items if "=>" not in item]
1323  all_mod_provides = dict(module.a.module_provides)
1324  all_mod_provides.update(module.a.use_provides)
1325  if self.isonly:
1326  # populate use_provides with items/renames only.
1327  for rename, orig in renames:
1328  self.populate_use_provides(all_mod_provides, use_provides, orig, rename)
1329  for name in norenames:
1330  self.populate_use_provides(all_mod_provides, use_provides, name)
1331  else:
1332  # norenames should be empty
1333  if norenames:
1334  self.warning(
1335  "'use' without 'only' clause does not rename the "
1336  "variables '%s'" % ", ".join(norenames)
1337  )
1338  # populate use_provides with renamed vars from module.
1339  for rename, orig in renames:
1340  self.populate_use_provides(all_mod_provides, use_provides, orig, rename)
1341  # get all the rest
1342  unrenamed = set(all_mod_provides) - set([b for (a, b) in renames])
1343  for name in unrenamed:
1344  self.populate_use_provides(all_mod_provides, use_provides, name)
1345  return
1346 
Here is the call graph for this function:

◆ populate_use_provides()

def fparser.one.statements.Use.populate_use_provides (   self,
  all_mod_provides,
  use_provides,
  name,
  rename = None 
)
Checks for entity name in the module

Definition at line 1347 of file statements.py.

References fparser.common.base_classes.Variable.name, fparser.common.readfortran.Line.name, fparser.one.block_statements.BeginSource.name, fparser.one.block_statements.Module.name, fparser.one.block_statements.PythonModule.name, fparser.one.block_statements.BlockData.name, fparser.one.block_statements.Interface.name, fparser.one.block_statements.SubProgramStatement.name, fparser.common.base_classes.BeginStatement.name, fparser.one.statements.Cycle.name, fparser.common.base_classes.EndStatement.name, fparser.one.block_statements.Select.name, fparser.one.block_statements.Where.name, fparser.one.block_statements.Forall.name, fparser.one.block_statements.IfThen.name, fparser.one.statements.Use.name, fparser.one.block_statements.Do.name, fparser.one.block_statements.Type.name, fparser.common.base_classes.Variable.parent, fparser.common.base_classes.Statement.parent, fparser.common.base_classes.Variable.warning(), and fparser.common.base_classes.Statement.warning().

1347  def populate_use_provides(self, all_mod_provides, use_provides, name, rename=None):
1348  """Checks for entity name in the module"""
1349  ovar = all_mod_provides.get(name, None)
1350  if ovar is None:
1351  raise AnalyzeError(
1352  "entity name '%s' is not in module '%s'" % (name, self.name)
1353  )
1354  if rename:
1355  # XXX: rename != ovar.name -- should mark this somehow?
1356  name_idx = rename
1357  else:
1358  name_idx = name
1359  if name_idx in use_provides:
1360  if ovar != use_provides[name_idx]:
1361  self.warning(
1362  "entity name '%s' is already declared in module "
1363  "'%s' while adding it to '%s', overriding."
1364  % (name, self.name, self.parent.name)
1365  )
1366  use_provides[name_idx] = ovar
1367 
1368 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_item()

def fparser.one.statements.Use.process_item (   self)
Parse the string containing the Use and store the
module name and list of attributes (if any)

Definition at line 1237 of file statements.py.

References fparser.one.statements.Use.isonly, fparser.common.base_classes.Statement.isvalid, fparser.common.base_classes.Statement.item, fparser.one.statements.StatementWithNamelist.items, fparser.one.statements.Assign.items, fparser.one.statements.Call.items, fparser.one.statements.ComputedGoto.items, fparser.one.statements.AssignedGoto.items, fparser.one.statements.Print.items, fparser.one.statements.Read0.items, fparser.one.statements.Read1.items, fparser.one.statements.Write.items, fparser.one.statements.Allocate.items, fparser.one.statements.Deallocate.items, fparser.one.statements.ModuleProcedure.items, fparser.one.statements.Access.items, fparser.one.statements.Save.items, fparser.one.statements.Nullify.items, fparser.one.statements.Use.items, fparser.common.base_classes.Variable.name, fparser.common.readfortran.Line.name, fparser.one.block_statements.BeginSource.name, fparser.one.block_statements.Module.name, fparser.one.block_statements.PythonModule.name, fparser.one.block_statements.BlockData.name, fparser.one.block_statements.Interface.name, fparser.one.block_statements.SubProgramStatement.name, fparser.common.base_classes.BeginStatement.name, fparser.one.statements.Cycle.name, fparser.common.base_classes.EndStatement.name, fparser.one.block_statements.Select.name, fparser.one.block_statements.Where.name, fparser.one.block_statements.Forall.name, fparser.one.block_statements.IfThen.name, fparser.one.statements.Use.name, fparser.one.block_statements.Do.name, fparser.one.block_statements.Type.name, and fparser.one.statements.Use.nature.

1237  def process_item(self):
1238  """Parse the string containing the Use and store the
1239  module name and list of attributes (if any)"""
1240  line = self.item.get_line()[3:].lstrip()
1241  nature = ""
1242  if line.startswith(","):
1243  i = line.find("::")
1244  nature = line[1:i].strip().upper()
1245  line = line[i + 2 :].lstrip()
1246  if line.startswith("::"):
1247  line = line[2:].lstrip()
1248  if nature and not is_name(nature):
1249  self.isvalid = False
1250  return
1251  self.nature = nature
1252  i = line.find(",")
1253  self.isonly = False
1254  if i == -1:
1255  self.name = line
1256  self.items = []
1257  else:
1258  self.name = line[:i].rstrip()
1259  line = line[i + 1 :].lstrip()
1260  if line.lower().startswith("only") and line[4:].lstrip().startswith(":"):
1261  self.isonly = True
1262  line = line[4:].lstrip()[1:].lstrip()
1263  self.items = split_comma(line, self.item)
1264  return
1265 

◆ tofortran()

def fparser.one.statements.Use.tofortran (   self,
  isfix = None 
)
Returns the Fortran representation of this object as a string

:param bool isfix: Whether or not to generated fixed-format Fortran
:return: Fortran representation of this object
:rtype: str

Definition at line 1266 of file statements.py.

References fparser.common.base_classes.Statement.get_indent_tab(), fparser.one.statements.Use.isonly, fparser.one.statements.StatementWithNamelist.items, fparser.one.statements.Assign.items, fparser.one.statements.Call.items, fparser.one.statements.ComputedGoto.items, fparser.one.statements.AssignedGoto.items, fparser.one.statements.Print.items, fparser.one.statements.Read0.items, fparser.one.statements.Read1.items, fparser.one.statements.Write.items, fparser.one.statements.Allocate.items, fparser.one.statements.Deallocate.items, fparser.one.statements.ModuleProcedure.items, fparser.one.statements.Access.items, fparser.one.statements.Save.items, fparser.one.statements.Nullify.items, fparser.one.statements.Use.items, fparser.common.base_classes.Variable.name, fparser.common.readfortran.Line.name, fparser.one.block_statements.BeginSource.name, fparser.one.block_statements.Module.name, fparser.one.block_statements.PythonModule.name, fparser.one.block_statements.BlockData.name, fparser.one.block_statements.Interface.name, fparser.one.block_statements.SubProgramStatement.name, fparser.common.base_classes.BeginStatement.name, fparser.one.statements.Cycle.name, fparser.common.base_classes.EndStatement.name, fparser.one.block_statements.Select.name, fparser.one.block_statements.Where.name, fparser.one.block_statements.Forall.name, fparser.one.block_statements.IfThen.name, fparser.one.statements.Use.name, fparser.one.block_statements.Do.name, fparser.one.block_statements.Type.name, and fparser.one.statements.Use.nature.

1266  def tofortran(self, isfix=None): # pylint: disable=invalid-name
1267  """
1268  Returns the Fortran representation of this object as a string
1269 
1270  :param bool isfix: Whether or not to generated fixed-format Fortran
1271  :return: Fortran representation of this object
1272  :rtype: str
1273  """
1274  tab = self.get_indent_tab(isfix=isfix)
1275  s = "USE"
1276  if self.nature:
1277  s += ", " + self.nature + " ::"
1278  s += " " + self.name
1279  if self.isonly:
1280  s += ", ONLY:"
1281  elif self.items:
1282  s += ","
1283  if self.items:
1284  s += " " + ", ".join(self.items)
1285  return tab + s
1286 
Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following file: