vscode-java icon indicating copy to clipboard operation
vscode-java copied to clipboard

Organize imports removes valid imports in Java files with compile errors

Open fvclaus opened this issue 3 years ago • 5 comments

Organize imports will remove imports when the references are not valid Java code anymore. This might remove "valid" imports that just happen to be unused at that moment, because there is a compile error before the reference. The references cannot be easily restored once the compile errors are fixed, e.g. manually created static imports. This is problematic in long files with many imports and "editor.codeActionsOnSave" : ["source.organizeImports", ...]. A typo in the "wrong" place can easily remove all your imports.

Environment
  • Operating System: Ubuntu 20.04.3 LTS
  • JDK version: 11.0.6+10
  • Visual Studio Code version: 1.63.2
  • Java extension version: 1.2.0
Steps To Reproduce
  1. Introduce an import
  2. Create a compile error that will invalidate the reference

java_compile_error_organize_import

Current Result

All "unused" imports are removed.

Expected Result

Don't remove imports when the Java file has compile errors.

fvclaus avatar Jan 20 '22 17:01 fvclaus

good issue

mozhuanzuojing avatar Jan 20 '22 23:01 mozhuanzuojing

If this is the same bug as https://github.com/eclipse/eclipse.jdt.ls/issues/1203 , it was fixed about 2 weeks ago upstream, so we should be able to just copy over the changes into our own corresponding QuickAssistProcessor class in JDT-LS.

rgrunber avatar Jan 29 '22 04:01 rgrunber

The above bug has been fixed in https://github.com/eclipse/eclipse.jdt.ls/pull/2003. You can also see the upstream fix at https://bugs.eclipse.org/bugs/show_bug.cgi?id=542653 . Marking this as closed as this should be part of our next release.

rgrunber avatar Feb 08 '22 21:02 rgrunber

@rgrunber has this really been fixed? My 1.8.0 vscode-java still removes all imports if a file as a syntax error.

fvclaus avatar Jul 22 '22 14:07 fvclaus

You're right. I'm still able to reproduce. I haven't investigated, but I would guess some kind of reference check is done against the static import, and if a syntax error happens in such a way as to make the AST unrecoverable, the reference is not discovered, and the import gets flagged for removal.

The modification of { for ; at the method declaration might be particular bad as it may destroy the entire block from being recovered.

rgrunber avatar Jul 22 '22 18:07 rgrunber

Yup same issue, organise imports removes static imports from files and won't add them back again

RobMaskell avatar Nov 08 '22 19:11 RobMaskell

I don't think the fix for #2861 fixes this issue. Messing with the block definitely affects detecting the references.

rgrunber avatar Jan 14 '23 04:01 rgrunber

I don't think the fix for https://github.com/redhat-developer/vscode-java/issues/2861 fixes this issue. Messing with the block definitely affects detecting the references.

You are right. This issue can be reproduced in Eclipse and IntelliJ IDEA

Yup same issue, organise imports removes static imports from files and won't add them back again

You can add your favorite imports to java.completion.favoriteStaticMembers. See https://github.com/redhat-developer/vscode-java/blob/master/package.json#L527.

snjeza avatar Jan 14 '23 22:01 snjeza