hakancelikdev / unimport

:rocket: The ultimate linter and formatter for removing unused import statements in your code.
https://unimport.hakancelik.dev/
MIT License
239 stars 22 forks source link

[BUG] - Remove comment and white space lines #100

Open hakancelikdev opened 4 years ago

hakancelikdev commented 4 years ago

Code

# Python imports
import os

from typing import Union

# Local imports
from .pgen2 import token
from .pgen2 import driver

from .pgen2.grammar import Grammar
os, Union, driver, Grammar

Expected situation

 import os

 from typing import Union

# Local imports
-from .pgen2 import token
 from .pgen2 import driver

 from .pgen2.grammar import Grammar

os, Union, driver, Grammar

Actual situation

 import os

 from typing import Union
-
-# Local imports
-from .pgen2 import token
 from .pgen2 import driver

 from .pgen2.grammar import Grammar
os, Union, driver, Grammar
hadialqattan commented 4 years ago

I did some code debugging, I ended with a bug on LibCST.RemoveFromParent() function!

from typing import Union

import libcst as cst

class RemoveUnusedImportTransformer(cst.CSTTransformer):
    def leave_ImportFrom(
        self, original_node: cst.ImportFrom, updated_node: cst.ImportFrom
    ) -> Union[cst.RemovalSentinel, cst.ImportFrom]:
        if updated_node.names[0].name.value == "token":  # Hard coded name.
            return cst.RemoveFromParent()  # Here we have a bug!
        return updated_node

def refactor_string(source: str) -> str:
    transformer = RemoveUnusedImportTransformer()
    cst_tree = cst.parse_module(source)
    return cst_tree.visit(transformer).code

if __name__ == "__main__":
    refactored_code = refactor_string(
        """# Python imports
import os

from typing import Union

# Local imports
from .pgen2 import token
from .pgen2 import driver

from .pgen2.grammar import Grammar

os, Union, driver, Grammar"""
    )
    print(refactored_code)

Output:

# Python imports
import os

from typing import Union
from .pgen2 import driver

from .pgen2.grammar import Grammar

os, Union, driver, Grammar
hadialqattan commented 4 years ago

If that's the case, I'm gonna open an issue on the LibCST repo.

hakancelikdev commented 4 years ago

If that's the case, I'm gonna open an issue on the LibCST repo.

Yes I think the issue need to open.

hadialqattan commented 4 years ago

Please take a look at Instagram/LibCST#390

hadialqattan commented 4 years ago

I think we should implement a method that preserves node comment/empty-line from removal!