2009-04-22 05:20:38 -04:00
|
|
|
! Copyright (C) 2007, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2013-03-05 13:34:47 -05:00
|
|
|
USING: accessors arrays assocs checksums checksums.crc32
|
|
|
|
compiler.units continuations definitions io.encodings.utf8
|
2013-03-10 21:04:37 -04:00
|
|
|
io.files io.pathnames kernel namespaces sequences sets
|
2013-03-05 13:34:47 -05:00
|
|
|
source-files.errors strings words ;
|
2013-03-10 21:04:37 -04:00
|
|
|
FROM: namespaces => set ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: source-files
|
|
|
|
|
|
|
|
SYMBOL: source-files
|
|
|
|
|
2013-03-23 19:27:23 -04:00
|
|
|
TUPLE: source-file-tuple
|
2007-09-20 18:09:08 -04:00
|
|
|
path
|
2009-04-22 05:20:38 -04:00
|
|
|
top-level-form
|
2008-03-13 05:54:33 -04:00
|
|
|
checksum
|
2011-08-17 23:58:09 -04:00
|
|
|
definitions
|
|
|
|
main ;
|
2009-04-22 05:20:38 -04:00
|
|
|
|
|
|
|
: record-top-level-form ( quot file -- )
|
2010-05-05 16:52:54 -04:00
|
|
|
top-level-form<<
|
2013-03-10 12:11:18 -04:00
|
|
|
[ ] [ f notify-definition-observers ] if-bootstrapping ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-01-09 21:13:59 -05:00
|
|
|
: record-checksum ( lines source-file -- )
|
2010-05-05 16:52:54 -04:00
|
|
|
[ crc32 checksum-lines ] dip checksum<< ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
: record-definitions ( file -- )
|
2008-08-30 13:34:37 -04:00
|
|
|
new-definitions get >>definitions drop ;
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: <source-file> ( path -- source-file )
|
2013-03-23 19:27:23 -04:00
|
|
|
\ source-file-tuple new
|
2008-06-30 06:22:05 -04:00
|
|
|
swap >>path
|
|
|
|
<definitions> >>definitions ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-30 13:34:37 -04:00
|
|
|
ERROR: invalid-source-file-path path ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: source-file ( path -- source-file )
|
2008-08-30 13:34:37 -04:00
|
|
|
dup string? [ invalid-source-file-path ] unless
|
2007-09-20 18:09:08 -04:00
|
|
|
source-files get [ <source-file> ] cache ;
|
|
|
|
|
|
|
|
: reset-checksums ( -- )
|
|
|
|
source-files get [
|
2008-03-27 00:47:51 -04:00
|
|
|
swap dup exists? [
|
2008-03-04 18:51:40 -05:00
|
|
|
utf8 file-lines swap record-checksum
|
2008-03-03 17:44:24 -05:00
|
|
|
] [ 2drop ] if
|
2007-09-20 18:09:08 -04:00
|
|
|
] assoc-each ;
|
|
|
|
|
2008-08-31 08:45:33 -04:00
|
|
|
M: pathname where string>> 1 2array ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-01-09 19:13:26 -05:00
|
|
|
: forget-source ( path -- )
|
2009-04-22 05:20:38 -04:00
|
|
|
source-files get delete-at*
|
2013-03-10 21:04:37 -04:00
|
|
|
[ definitions>> [ members forget-all ] each ] [ drop ] if ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-01-09 19:13:26 -05:00
|
|
|
M: pathname forget*
|
2008-08-31 08:45:33 -04:00
|
|
|
string>> forget-source ;
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-03-11 20:51:58 -04:00
|
|
|
: rollback-source-file ( file -- )
|
2008-08-30 13:34:37 -04:00
|
|
|
[
|
2013-03-10 21:04:37 -04:00
|
|
|
new-definitions get [ union ] 2map
|
2008-08-30 13:34:37 -04:00
|
|
|
] change-definitions drop ;
|
2007-12-21 21:18:24 -05:00
|
|
|
|
|
|
|
SYMBOL: file
|
|
|
|
|
2009-04-09 05:50:38 -04:00
|
|
|
: wrap-source-file-error ( error -- * )
|
|
|
|
file get rollback-source-file
|
2008-06-25 04:25:08 -04:00
|
|
|
\ source-file-error new
|
2009-04-09 05:50:38 -04:00
|
|
|
f >>line#
|
|
|
|
file get path>> >>file
|
2009-04-15 01:27:02 -04:00
|
|
|
swap >>error rethrow ;
|
2008-06-25 04:25:08 -04:00
|
|
|
|
2007-12-21 21:18:24 -05:00
|
|
|
: with-source-file ( name quot -- )
|
|
|
|
#! Should be called from inside with-compilation-unit.
|
|
|
|
[
|
2008-06-25 04:25:08 -04:00
|
|
|
[
|
2009-04-09 05:50:38 -04:00
|
|
|
source-file
|
|
|
|
[ file set ]
|
|
|
|
[ definitions>> old-definitions set ] bi
|
|
|
|
] dip
|
|
|
|
[ wrap-source-file-error ] recover
|
2007-12-21 21:18:24 -05:00
|
|
|
] with-scope ; inline
|