Fix #438 Create Java .class files for javac in a temporary directory
This commit is contained in:
		
							parent
							
								
									7a8dbe1139
								
							
						
					
					
						commit
						7c736579b7
					
				@ -9,8 +9,12 @@ function! ale_linters#java#javac#GetCommand(buffer) abort
 | 
			
		||||
    \   ?  '-cp ' . g:ale_java_javac_classpath
 | 
			
		||||
    \   : ''
 | 
			
		||||
 | 
			
		||||
    " Create .class files in a temporary directory, which we will delete later.
 | 
			
		||||
    let l:class_file_directory = ale#engine#CreateDirectory(a:buffer)
 | 
			
		||||
 | 
			
		||||
    return 'javac -Xlint '
 | 
			
		||||
    \ . l:cp_option
 | 
			
		||||
    \ . ' -d ' . fnameescape(l:class_file_directory)
 | 
			
		||||
    \ . ' ' . g:ale_java_javac_options
 | 
			
		||||
    \ . ' %t'
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
@ -152,6 +152,17 @@ function! ale#engine#ManageDirectory(buffer, directory) abort
 | 
			
		||||
    call add(g:ale_buffer_info[a:buffer].temporary_directory_list, a:directory)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
" Create a new temporary directory and manage it in one go.
 | 
			
		||||
function! ale#engine#CreateDirectory(buffer) abort
 | 
			
		||||
    let l:temporary_directory = tempname()
 | 
			
		||||
    " Create the temporary directory for the file, unreadable by 'other'
 | 
			
		||||
    " users.
 | 
			
		||||
    call mkdir(l:temporary_directory, '', 0750)
 | 
			
		||||
    call ale#engine#ManageDirectory(a:buffer, l:temporary_directory)
 | 
			
		||||
 | 
			
		||||
    return l:temporary_directory
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! ale#engine#RemoveManagedFiles(buffer) abort
 | 
			
		||||
    if !has_key(g:ale_buffer_info, a:buffer)
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								doc/ale.txt
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								doc/ale.txt
									
									
									
									
									
								
							@ -637,6 +637,16 @@ ale#Queue(delay, [linting_flag])                                  *ale#Queue()*
 | 
			
		||||
  run. Linters with `lint_file` set to `1` are not run by default.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ale#engine#CreateDirectory(buffer)               *ale#engine#CreateDirectory()*
 | 
			
		||||
 | 
			
		||||
  Create a new temporary directory with a unique name, and manage that
 | 
			
		||||
  directory with |ale#engine#ManageDirectory()|, so it will be removed as
 | 
			
		||||
  soon as possible.
 | 
			
		||||
 | 
			
		||||
  It is advised to only call this function from a callback function for
 | 
			
		||||
  returning a linter command to run.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ale#engine#EscapeCommandPart(command_part)     *ale#engine#EscapeCommandPart()*
 | 
			
		||||
 | 
			
		||||
  Given a |String|, return a |String| with all `%` characters replaced with
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								test/command_callback/test_javac_command_callback.vader
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								test/command_callback/test_javac_command_callback.vader
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
			
		||||
Before:
 | 
			
		||||
  runtime ale_linters/java/javac.vim
 | 
			
		||||
  call ale#engine#InitBufferInfo(bufnr(''))
 | 
			
		||||
 | 
			
		||||
After:
 | 
			
		||||
  call ale#linter#Reset()
 | 
			
		||||
  " We need to clean up the buffer to remove the temporary directories created
 | 
			
		||||
  " for the command.
 | 
			
		||||
  call ale#cleanup#Buffer(bufnr(''))
 | 
			
		||||
  let g:ale_java_javac_options = ''
 | 
			
		||||
  let g:ale_java_javac_classpath = ''
 | 
			
		||||
 | 
			
		||||
Execute(The javac callback should return the correct default value):
 | 
			
		||||
  let b:command = ale_linters#java#javac#GetCommand(bufnr(''))
 | 
			
		||||
 | 
			
		||||
  Assert match(b:command, '\v^javac +-Xlint +-d +/tmp/[0-9a-zA-Z/]+ +\%t$') >= 0,
 | 
			
		||||
  \ 'Invalid command string: ' . b:command
 | 
			
		||||
 | 
			
		||||
Execute(The javac callback should use g:ale_java_javac_classpath correctly):
 | 
			
		||||
  let g:ale_java_javac_classpath = 'foo.jar'
 | 
			
		||||
 | 
			
		||||
  let b:command = ale_linters#java#javac#GetCommand(bufnr(''))
 | 
			
		||||
 | 
			
		||||
  Assert match(b:command, '\v^javac +-Xlint -cp foo\.jar +-d +/tmp/[0-9a-zA-Z/]+ +\%t$') >= 0,
 | 
			
		||||
  \ 'Invalid command string: ' . b:command
 | 
			
		||||
 | 
			
		||||
Execute(The javac callback should use g:ale_java_javac_options correctly):
 | 
			
		||||
  let g:ale_java_javac_options = '--anything --else'
 | 
			
		||||
 | 
			
		||||
  let b:command = ale_linters#java#javac#GetCommand(bufnr(''))
 | 
			
		||||
 | 
			
		||||
  Assert match(b:command, '\v^javac +-Xlint +-d +/tmp/[0-9a-zA-Z/]+ --anything --else +\%t$') >= 0,
 | 
			
		||||
  \ 'Invalid command string: ' . b:command
 | 
			
		||||
@ -81,3 +81,23 @@ Execute(ALE should delete managed files when the buffer is removed):
 | 
			
		||||
  Assert !filereadable(g:filename), 'The tempoary file was not deleted'
 | 
			
		||||
  Assert !isdirectory(g:directory), 'The tempoary directory was not deleted'
 | 
			
		||||
  Assert isdirectory(g:preserved_directory), 'The tempoary directory was not kept'
 | 
			
		||||
 | 
			
		||||
Execute(ALE should create and delete directories for ale#engine#CreateDirectory()):
 | 
			
		||||
  call ale#engine#InitBufferInfo(bufnr('%'))
 | 
			
		||||
 | 
			
		||||
  let b:dir = ale#engine#CreateDirectory(bufnr('%'))
 | 
			
		||||
  let b:dir2 = ale#engine#CreateDirectory(bufnr('%'))
 | 
			
		||||
 | 
			
		||||
  Assert isdirectory(b:dir), 'The directory was not created'
 | 
			
		||||
 | 
			
		||||
  " We should get the correct file permissions.
 | 
			
		||||
  " We want to ensure that the directory is not readable by 'other'
 | 
			
		||||
  AssertEqual 'rwxr-x---', getfperm(b:dir)
 | 
			
		||||
 | 
			
		||||
  " The two directories shouldn't be the same.
 | 
			
		||||
  AssertNotEqual b:dir2, b:dir
 | 
			
		||||
 | 
			
		||||
  call ale#cleanup#Buffer(bufnr('%'))
 | 
			
		||||
 | 
			
		||||
  Assert !isdirectory(b:dir), 'The directory was not deleted'
 | 
			
		||||
  Assert !isdirectory(b:dir2), 'The second directory was not deleted'
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user