diff options
| -rw-r--r-- | portToNewSyntax/merge.dcl | 3 | ||||
| -rw-r--r-- | portToNewSyntax/merge.icl | 186 | 
2 files changed, 189 insertions, 0 deletions
| diff --git a/portToNewSyntax/merge.dcl b/portToNewSyntax/merge.dcl new file mode 100644 index 0000000..bfd69a3 --- /dev/null +++ b/portToNewSyntax/merge.dcl @@ -0,0 +1,3 @@ +definition module merge + +mergeFiles ::  !*File !*File !*File -> (!.File,!.File,!.File) diff --git a/portToNewSyntax/merge.icl b/portToNewSyntax/merge.icl new file mode 100644 index 0000000..a0d97e9 --- /dev/null +++ b/portToNewSyntax/merge.icl @@ -0,0 +1,186 @@ +implementation module merge + +import StdEnv, RWSDebug, StdArrayExtensions + +from syntax import Optional, Yes, No +import utilities, portToNewSyntax + +mergeFiles ::  !*File !*File !*File -> (!.File,!.File,!.File) +mergeFiles old inferred new +	# (lines_within_comment, old) +			= lines_in_comment old +	= merge_files lines_within_comment 0 old inferred new + +merge_files ::  ![Int] !Int !*File !*File !*File -> (!.File,!.File,!.File) +merge_files lines_within_comment line_nr old inferred new +	# (end, old) = fend old +	| end +		# (inferred, new) +				= copy_rest inferred new +		= (old, inferred, new) +	# (line, old) = my_freadline old +	  line_l = [ ch \\ ch<-:line ] +	| not (begins_with_from line_l) || isMember line_nr lines_within_comment +		= merge_files lines_within_comment (line_nr+1) old inferred (fwrites line new) +	# new = fwrites ("//1.3\n"+++(complete_line line)) new +	  (new_line_nr, module_names, old, new) +	  		= copy_original_from_statements line_nr line_l [] old new +  // insert inferred part +  	  new = fwrites ("//3.1\n/*2.0\n") new +	  (inferred, new) +	  		= foldSt insert_inferred_from_stmnt module_names (inferred, new) +	= merge_files lines_within_comment new_line_nr old inferred (fwrites "0.2*/\n" new) + +copy_original_from_statements line_nr line_l mod_names_accu old new +	# (left_space, module_name) = get_ls_and_mn line_l +	  (line_nr, opt_next_from_statement, old, new) = layout_skip line_nr left_space old new +	= case opt_next_from_statement of +		No +			-> (line_nr, reverse [module_name:mod_names_accu], old, new) +		Yes line_l` +			-> copy_original_from_statements line_nr line_l` [module_name:mod_names_accu] +					old new + +insert_inferred_from_stmnt module_name (inferred, new) +	# (first_line_of_import, inferred) = my_freadline inferred +	  new = foldSt fwrites ["from ", module_name, " ", first_line_of_import] new +  	= copy_rest_of_import inferred new +	 +begins_with_from line_l +	# without_spaces = dropWhile isSpace line_l +	= case without_spaces of +		['from'] -> True +		['from',ch:_] -> not (isAlphanum ch || isMember ch ['`_'])  +		_ -> False + +get_ls_and_mn line_l +	# (spaces, rest1) = span isSpace line_l +	  without_from = drop 4 rest1 +	  (_, rest2) = span isSpace without_from +	  module_name = takeWhile (not o isSpace) rest2 +	= (space_count spaces 0, toString module_name) + +space_count [] _ +	= 0 +space_count [' ':spaces] modTabWidth +	= 1+(space_count spaces ((modTabWidth+1) mod modTabWidth)) +space_count ['\t':spaces] modTabWidth +	= (cTabWidth-modTabWidth)+(space_count spaces 0) +space_count ['\n':_] _ +	= 0 + +layout_skip :: !Int !Int !*File !*File -> (!Int, !Optional [Char], !.File, !.File) +layout_skip line_nr left_space old new +	# (end, old) = fend old +	| end +		= (line_nr, No, old, new) +	# (cur_pos, old) = fposition old +	  (line, old) = my_freadline old +	  line_l = [ ch \\ ch<-:line ] +	  spaces = takeWhile isSpace line_l +	| space_count spaces 0<=left_space +		| begins_with_from line_l +			= (line_nr+1, Yes line_l, old, fwrites (complete_line line) new)  +		= (line_nr+1, No, snd (fseek old cur_pos FSeekSet), new) +	= layout_skip (line_nr+1) left_space old (fwrites (complete_line line) new) + +copy_rest_of_import :: !*File !*File -> (!.File, !.File) +copy_rest_of_import inferred new +	# (end, inferred) = fend inferred +	| end +		= (inferred ,new) +	# (cur_pos, inferred) = fposition inferred +	  (line, inferred) = my_freadline inferred +	| line % (0,5)=="import" +		= (snd (fseek inferred cur_pos FSeekSet), new) +	= copy_rest_of_import inferred (fwrites line new) + +complete_line line +	| line.[size line-1]<>'\n' +		= line+++"\n" +	= line	 + +copy_rest inferred new +	# (end, inferred) = fend inferred +	| end +		= (inferred, new) +	# (line, inferred) +			= my_freadline inferred +	= copy_rest inferred (fwrites line new) + +lines_in_comment file +	# (cur_pos, file) +			= fposition file +	  (rev_lines_within_comment, file) +	  		= get_lic 0 [] file +	= (reverse rev_lines_within_comment, snd (fseek file cur_pos FSeekSet)) +  where +	get_lic :: !Int ![Int] !*File -> (![Int], !*File) +	get_lic line_nr line_nr_accu file +		# (end, file) +				= fend file +		| end +			= (line_nr_accu, file) +		# (line, file) +				= my_freadline file +		  line_l +		  		= [ch \\ ch<-:line] +		# (bwc, rest) +				= begins_with_comment line_l +		| bwc +			= consider_comment 1 rest line_nr line_nr_accu file +		= get_lic (line_nr+1) line_nr_accu file + +	begins_with_comment ['//1.3':rest] +		= (True, rest) +	begins_with_comment line_l +	  	 # without_spaces +	  	  		= dropWhile isSpace line_l +		= case without_spaces of +			['/*':rest] +				-> (True, rest) +			_ +				-> (False, []) + +	consider_comment nesting_level ['*/':rest] line_nr line_nr_accu file +		| nesting_level==1 +			= get_lic line_nr line_nr_accu file +		= consider_comment (nesting_level-1) rest line_nr line_nr_accu file +	consider_comment nesting_level ['/*':rest] line_nr line_nr_accu file +		= consider_comment (nesting_level+1) rest line_nr line_nr_accu file +	consider_comment nesting_level [_:rest] line_nr line_nr_accu file +		= consider_comment nesting_level rest line_nr line_nr_accu file +	consider_comment nesting_level [] line_nr line_nr_accu file +		# (end, file) +				= fend file +		| end +			= ([], file) +		# (line, file) +				= my_freadline file +		  line_l +		  		= [ch \\ ch<-:line] +		= case line_l of +			['//3.1':rest] +				| nesting_level==1 +					-> get_lic (line_nr+1) [line_nr+1:line_nr_accu] file +				-> consider_comment (nesting_level-1) rest (line_nr+1) [line_nr+1:line_nr_accu] file +			_ +				-> consider_comment nesting_level line_l (line_nr+1) [line_nr+1:line_nr_accu] file + +my_freadline :: !*File -> (!String, !*File) +my_freadline file +	#! (line, file) = freadline file +	   last_char_ix = size line - 1 +	   last_printable_char_ix = findrArrElt isntNewlineOnAnyPlatform line last_char_ix +	| last_printable_char_ix==(-1) +		= ("\n", file) +	| last_printable_char_ix==last_char_ix +		= (line, file) +	| last_printable_char_ix==last_char_ix-1 && line.[last_char_ix]=='\n' +		= (line, file) +	= ({line & [last_printable_char_ix+1] = '\n' } %(0, last_printable_char_ix+1), file) + +isntNewlineOnAnyPlatform '\xA' = False +isntNewlineOnAnyPlatform '\xD' = False +isntNewlineOnAnyPlatform _ = True + | 
