def _ImportFrom(self, t): if t.level > 0: self._unsupported_syntax(t) self.fill('use ') self.write(t.module) self.write(', only : ') interleave(lambda: self.write(', '), self.dispatch, t.names)
def _Import(self, t): names = [ name for name in t.names if name.name not in ('numpy', 'static_typing', 'typing') ] if not names: return self.fill('use ') # print([typed_astunparse.unparse(_) for _ in names]) interleave(lambda: self.write(', '), self.dispatch, names)
def _ImportFrom(self, t): if t.level > 0: self._unsupported_syntax(t) self.fill('use ') if has_annotation(t, 'nature'): self.write(', ') self.write(get_annotation(t, 'nature')) self.write(' ::') self.write(' ') self.write(t.module) self.write(', only : ') interleave(lambda: self.write(', '), self.dispatch, t.names)
def _Subscript(self, t): val = t.value unparsed_val = horast.unparse(val).strip() if unparsed_val in PYTHON_FORTRAN_INTRINSICS: new_val = PYTHON_FORTRAN_INTRINSICS[unparsed_val] if isinstance(new_val, collections.abc.Callable): self.dispatch(new_val(t)) return t = copy.copy(t) t.value = typed_ast3.Name(id=new_val) if isinstance(val, typed_ast3.Attribute) and isinstance(val.value, typed_ast3.Name) \ and val.value.id == 'Fortran': attr = val.attr if attr == 'file_handles': self.dispatch(t.slice) elif attr == 'TypeByNamePrefix': base_type, letter_ranges = t.slice.value.elts assert isinstance(letter_ranges, typed_ast3.Tuple), type(letter_ranges) # _LOG.warning('%s', type(letter_ranges)) # assert False, (type(letter_ranges), letter_ranges) self.dispatch_var_type(base_type) self.write(' (') interleave(lambda: self.write(', '), lambda _: _.s[1:-1], letter_ranges.elts) self.write(')') else: raise NotImplementedError( 'Fortran.{}[] cannot be handled yet.'.format(attr)) return self.dispatch(t.value) self.write("(") self.dispatch(t.slice) # if isinstance(t.slice, typed_ast3.Index): # elif isinstance(t.slice, typed_ast3.Slice): # raise NotImplementedError('not yet implemented: {}'.format(typed_astunparse.dump(t))) # elif isinstance(t.slice, typed_ast3.ExtSlice): # raise NotImplementedError('not yet implemented: {}'.format(typed_astunparse.dump(t))) # else: # raise ValueError() self.write(")")
def _Assign(self, t): metadata = getattr(t, 'fortran_metadata', {}) if get_annotation(t, 'is_nullification'): self.fill('nullify(') interleave(lambda: self.write(', '), self.dispatch, t.targets) self.write(')') return if metadata.get('is_allocation', False): self.fill('allocate(') for i, target in enumerate(t.targets): if i > 0: self.write(', ') self.dispatch(target) self.write('(') self.dispatch(t.value.args[0]) self.write(')') self.write(')') return if metadata.get('is_pointer_assignment', False): self.fill() assert len(t.targets) == 1 self.dispatch(t.targets[0]) self.write(" => ") self.dispatch(t.value) return self.fill() if t.type_comment: self.dispatch_var_type(t.resolved_type_comment) self._write_assignment_metadata(metadata, first=t.type_comment is None) if t.type_comment or metadata: self.write(' :: ') assert len(t.targets) == 1 self.dispatch(t.targets[0]) if t.value: self.write(" = ") self.dispatch(t.value)
def _ExtSlice(self, t): interleave(lambda: self.write(', '), self.dispatch, t.dims)
def _Tuple(self, t): interleave(lambda: self.write(', '), self.dispatch, t.elts)
def _List(self, t): self.write('(/ ') interleave(lambda: self.write(", "), self.dispatch, t.elts) self.write(' /)')
def _JoinedStr(self, t): self.write('format(') interleave(lambda: self.write(', '), self.dispatch, t.values) self.write(')')
def _Delete(self, t): self.fill('deallocate (') interleave(lambda: self.write(', '), self.dispatch, t.targets) self.write(')')
def _BoolOp(self, t): self.write("(") s = " %s " % self.boolops[t.op.__class__.__name__] interleave(lambda: self.write(s), self.dispatch, t.values) self.write(")")