def normalize_requires(filename, **kwargs): """Return the contents of filename, with all [Require]s split out and ordered at the top.""" if filename[-2:] != '.v': filename += '.v' kwargs = fill_kwargs(kwargs) lib = lib_of_filename(filename, libnames=tuple(kwargs['libnames'])) all_imports = run_recursively_get_imports(lib, **kwargs) v_name = filename_of_lib(lib, ext='.v', **kwargs) contents = get_file(v_name, **kwargs) contents = strip_requires(contents) contents = ''.join('Require %s.\n' % i for i in all_imports[:-1]) + '\n' + contents.strip() + '\n' return contents
def normalize_requires(filename, **kwargs): """Return the contents of filename, with all [Require]s split out and ordered at the top. Preserve any leading whitespace/comments. """ if filename[-2:] != '.v': filename += '.v' kwargs = fill_kwargs(kwargs) lib = lib_of_filename(filename, **kwargs) all_imports = run_recursively_get_imports(lib, **kwargs) v_name = filename_of_lib(lib, ext='.v', **kwargs) contents = get_file(v_name, **kwargs) header, contents = split_leading_comments_and_whitespace(contents) contents = strip_requires(contents) contents = ''.join('Require %s.\n' % i for i in all_imports[:-1]) + '\n' + contents.strip() + '\n' return header + contents
for dirname in env['ocaml_dirnames']: env['coqc_args'] = tuple(list(env['coqc_args']) + ['-I', dirname]) env['coqc_args'] = deduplicate_trailing_dir_bindings(env['coqc_args'], coqc_help=coqc_help, coq_accepts_top=get_coq_accepts_top(env['coqc'])) try: if env['verbose'] >= 1: env['log']('Listing identifiers...') unknown = [] closed_idents = [] open_idents = [] errors = [] ignore_header = ('Welcome to Coq', '[Loading ML file') error_header = ('Toplevel input, characters',) for filename in sorted(env['_CoqProject_v_files']): if env['verbose'] >= 2: env['log']('Qualifying identifiers in %s...' % filename) if env['verbose'] == 1: env['log']('Printing assumptions in %s...' % filename) libname = lib_of_filename(filename, **env) require_statement = 'Require %s.\n' % libname search_code = r"""%s Set Search Output Name Only. SearchPattern _ inside %s.""" % (require_statement, libname) output, cmds, retcode = get_coq_output(env['coqc'], env['coqc_args'], search_code, 0, is_coqtop=env['coqc_is_coqtop'], verbose_base=3, **env) identifiers = sorted(fix_identifiers(set(i.strip() for i in output.split('\n') if i.strip()), libname)) print_assumptions_code = require_statement + '\n'.join('Locate %s.\nPrint Assumptions %s.' % (i, i) for i in identifiers) if env['verbose'] >= 2: env['log']('Printing assumptions...') output, cmds, retcode = get_coq_output(env['coqtop'], env['coqc_args'], print_assumptions_code, 0, is_coqtop=True, pass_on_stdin=True, verbose_base=3, **env) i = 0 statements = output.split('\nCoq <') while i < len(statements): if i+1 < len(statements) and ' Closed under the global context ' in statements[i+1].replace('\n', ' '): last, ctype = get_constant_name_from_locate(statements[i]) closed_idents.append((last, ctype))
def include_imports(filename, as_modules=True, verbose=DEFAULT_VERBOSITY, fast=False, log=DEFAULT_LOG, libnames=DEFAULT_LIBNAMES, coqc='coqc', absolutize=ALL_ABSOLUTIZE_TUPLE, coq_makefile='coq_makefile', **kwargs): """Return the contents of filename, with any top-level imports inlined. If as_modules == True, then the imports will be wrapped in modules. This method requires access to the coqdep program if fast == False. Without it, it will fall back to manual parsing of the imports, which may change behavior. >>> import tempfile, os >>> f = tempfile.NamedTemporaryFile(dir='.', suffix='.v', delete=False) >>> g = tempfile.NamedTemporaryFile(dir='.', suffix='.v', delete=False) >>> g_name = os.path.relpath(g.name, '.')[:-2] >>> f.write(" Require Import %s Coq.Init.Logic Arith.\n Require Export \tPArith\t Coq.Init.Logic.\n Require Bool.\n Import Bool. (* asdf *)\n Require Import QArith\n ZArith\n Setoid.\nRequire Import %s.\n Require\n Import\n%s\n\n\t.\t(*foo*)\n\nInductive t := a | b.\n\n(*asdf*)" % (g_name, g_name, g_name)) >>> g.write(r"Require Export Ascii String.\n\nInductive q := c | d.") >>> f.close() >>> g.close() >>> print(include_imports(f.name, as_modules=False, verbose=False)) Require Import Coq.Arith.Arith Coq.Bool.Bool Coq.Init.Logic Coq.PArith.PArith Coq.QArith.QArith Coq.Setoids.Setoid Coq.ZArith.ZArith Coq.Strings.Ascii Coq.Strings.String. Inductive q := c | d. (* asdf *) Inductive t := a | b. (*asdf*) >>> print(include_imports(f.name, as_modules=False, fast=True, verbose=False)) Require Import Arith Bool Coq.Init.Logic PArith QArith Setoid ZArith Ascii String. Inductive q := c | d. (* asdf *) Inductive t := a | b. (*asdf*) >>> exts = ('.v', '.v.d', '.glob', '.vo', '.o', '.cmi', '.cmxs', '.native', '.cmx') >>> names = [f.name[:-2] + ext for ext in exts] + [g.name[:-2] + ext for ext in exts] >>> names = [i for i in names if os.path.exists(i)] >>> for name in names: os.remove(name) """ if 'make_coqc' in kwargs.keys(): coqc = kwargs['make_coqc'] if filename[-2:] != '.v': filename += '.v' lib = lib_of_filename(filename, libnames=tuple(libnames)) all_imports = recursively_get_imports(lib, verbose=verbose, fast=fast, log=log, libnames=tuple(libnames), coqc=coqc, coq_makefile=coq_makefile, **kwargs) remaining_imports = [] rtn = '' imports_done = [] for import_name in all_imports: try: if as_modules: rtn += contents_as_module_without_require(import_name, imports_done, verbose=verbose, log=log, libnames=tuple(libnames), absolutize=absolutize) + '\n' else: rtn += contents_without_imports(import_name, verbose=verbose, log=log, libnames=tuple(libnames), absolutize=tuple()) + '\n' imports_done.append(import_name) except IOError: remaining_imports.append(import_name) if len(remaining_imports) > 0: if verbose: log('remaining imports:') log(remaining_imports) if as_modules: pattern = 'Require %s.\n%s' else: pattern = 'Require Import %s.\n%s' for imp in reversed(remaining_imports): rtn = pattern % (imp, rtn) return rtn
def recursively_get_requires_from_file(filename, **kwargs): if filename[-2:] != '.v': filename += '.v' kwargs = fill_kwargs(kwargs) lib = lib_of_filename(filename, libnames=tuple(kwargs['libnames'])) return tuple(run_recursively_get_imports(lib, **kwargs)[:-1])
def include_imports(filename, as_modules=True, verbose=DEFAULT_VERBOSITY, fast=False, log=DEFAULT_LOG, coqc='coqc', absolutize=ALL_ABSOLUTIZE_TUPLE, coq_makefile='coq_makefile', **kwargs): """Return the contents of filename, with any top-level imports inlined. If as_modules == True, then the imports will be wrapped in modules. This method requires access to the coqdep program if fast == False. Without it, it will fall back to manual parsing of the imports, which may change behavior. >>> import tempfile, os >>> f = tempfile.NamedTemporaryFile(dir='.', suffix='.v', delete=False) >>> g = tempfile.NamedTemporaryFile(dir='.', suffix='.v', delete=False) >>> g_name = os.path.relpath(g.name, '.')[:-2] >>> f.write(" Require Import %s Coq.Init.Logic Arith.\n Require Export \tPArith\t Coq.Init.Logic.\n Require Bool.\n Import Bool. (* asdf *)\n Require Import QArith\n ZArith\n Setoid.\nRequire Import %s.\n Require\n Import\n%s\n\n\t.\t(*foo*)\n\nInductive t := a | b.\n\n(*asdf*)" % (g_name, g_name, g_name)) >>> g.write(r"Require Export Ascii String.\n\nInductive q := c | d.") >>> f.close() >>> g.close() >>> print(include_imports(f.name, as_modules=False, verbose=False)) Require Import Coq.Arith.Arith Coq.Bool.Bool Coq.Init.Logic Coq.PArith.PArith Coq.QArith.QArith Coq.Setoids.Setoid Coq.ZArith.ZArith Coq.Strings.Ascii Coq.Strings.String. Inductive q := c | d. (* asdf *) Inductive t := a | b. (*asdf*) >>> print(include_imports(f.name, as_modules=False, fast=True, verbose=False)) Require Import Arith Bool Coq.Init.Logic PArith QArith Setoid ZArith Ascii String. Inductive q := c | d. (* asdf *) Inductive t := a | b. (*asdf*) >>> exts = ('.v', '.v.d', '.glob', '.vo', '.o', '.cmi', '.cmxs', '.native', '.cmx') >>> names = [f.name[:-2] + ext for ext in exts] + [g.name[:-2] + ext for ext in exts] >>> names = [i for i in names if os.path.exists(i)] >>> for name in names: os.remove(name) """ if 'make_coqc' in kwargs.keys(): coqc = kwargs['make_coqc'] if filename[-2:] != '.v': filename += '.v' lib = lib_of_filename(filename, **kwargs) all_imports = recursively_get_imports(lib, verbose=verbose, fast=fast, log=log, coqc=coqc, coq_makefile=coq_makefile, **kwargs) remaining_imports = [] rtn = '' imports_done = [] for import_name in all_imports: try: if as_modules: rtn += contents_as_module_without_require( import_name, imports_done, verbose=verbose, log=log, absolutize=absolutize, **kwargs) + '\n' else: rtn += contents_without_imports(import_name, verbose=verbose, log=log, absolutize=tuple(), **kwargs) + '\n' imports_done.append(import_name) except IOError: remaining_imports.append(import_name) if len(remaining_imports) > 0: if verbose: log('remaining imports:') log(remaining_imports) if as_modules: pattern = 'Require %s.\n%s' else: pattern = 'Require Import %s.\n%s' for imp in reversed(remaining_imports): rtn = pattern % (imp, rtn) return rtn
def recursively_get_requires_from_file(filename, **kwargs): if filename[-2:] != '.v': filename += '.v' kwargs = fill_kwargs(kwargs) lib = lib_of_filename(filename, **kwargs) return tuple(run_recursively_get_imports(lib, **kwargs)[:-1])
for dirname, libname in env['non_recursive_libnames']: env['coqc_args'] = tuple(list(env['coqc_args']) + ['-Q', dirname, libname]) env['coqc_args'] = deduplicate_trailing_dir_bindings(env['coqc_args'], coqc_help=coqc_help, coq_accepts_top=get_coq_accepts_top(env['coqc'])) try: if env['verbose'] >= 1: env['log']('Listing identifiers...') unknown = [] closed_idents = [] open_idents = [] errors = [] ignore_header = ('Welcome to Coq', '[Loading ML file') error_header = ('Toplevel input, characters',) for filename in sorted(env['_CoqProject_v_files']): if env['verbose'] >= 2: env['log']('Qualifying identifiers in %s...' % filename) if env['verbose'] == 1: env['log']('Printing assumptions in %s...' % filename) libname = lib_of_filename(filename, **env) require_statement = 'Require %s.\n' % libname search_code = r"""%s Set Search Output Name Only. SearchPattern _ inside %s.""" % (require_statement, libname) output, cmds, retcode = get_coq_output(env['coqc'], env['coqc_args'], search_code, 0, is_coqtop=env['coqc_is_coqtop'], verbose_base=3, **env) identifiers = sorted(fix_identifiers(set(i.strip() for i in output.split('\n') if i.strip()), libname)) print_assumptions_code = require_statement + '\n'.join('Locate %s.\nPrint Assumptions %s.' % (i, i) for i in identifiers) if env['verbose'] >= 2: env['log']('Printing assumptions...') output, cmds, retcode = get_coq_output(env['coqtop'], env['coqc_args'], print_assumptions_code, 0, is_coqtop=True, pass_on_stdin=True, verbose_base=3, **env) i = 0 statements = output.split('\nCoq <') while i < len(statements): if i+1 < len(statements) and ' Closed under the global context ' in statements[i+1].replace('\n', ' '): last, ctype = get_constant_name_from_locate(statements[i]) closed_idents.append((last, ctype))