Imports aufräumen

Habe gerade ein Programm, geschrieben in Haxe, nach Java konvertiert. Das Problem ist aber, dass der Haxe Compiler die importierten Package-Namen überall in der Klasse verteilt hat, statt sie an den Anfang der Klasse zu schreiben. Irgendetwas ist halt immer mit diesen Sprachkonvertern :rolleyes:

Das sieht dann ungefähr so aus:

public BodyCallback() {
        super(haxe.lang.EmptyObject.EMPTY);
        nape.callbacks.BodyCallback.__hx_ctor_nape_callbacks_BodyCallback(this);
}```

Gibt es da irgendwie eine Möglichkeit die ganzen automatisch Dateien aufzuräumen? In IntelliJ wird mit "Optimize Imports" rein gar nichts gemacht.
Hat da jemand eine Idee?

*** Edit ***

Okay über Regex scheint es mehr oder weniger zu klappen.
Über den folgenden Befehl kann ich alle spezifischen package Angaben entfernen

(haxe|nape|zpp_nape|Array).[a-z.]*



Wenn man in IntelliJ unter den Einstellungen den Haken bei "Add unambiguous imports on the fly" setzt, dann importiert er automatisch die Klassen. Wie immer alles komplizierter gemacht als es sein muss.

Das einzige Problem was ich jetzt habe, ist dass der Regex Ausdruck auch die Package Deklaration am Anfang der Klasse entfernt.

kannst du die Einrückung nutzen, die wohl zumindest bei allen Variablendeklarationen vorhanden ist, bei ‚package …‘ aber hoffentlich nicht?

" (anfang)\\.([a-z]+\\.)*" (zwei Leerzeichen am Anfang)

falls auch in Konstruktor-Aufrufen mit new, oder Klammer oder Komma davor (Parameter), oder <,
dann dafür noch paar entsprechende RegEx extra laufen lassen,
Achtung: das new nicht entfernen, sondern wieder hinschreiben :wink:

bzw. zumindest in Java-Replace:


    public static void main(String[] args)  {
        String st = "package test.abc.ef; 
" 
                    + "  test.abc.de.Helper g = null;
"
                    + "  test.abc.de.Helper h = new test.abc.de.Helper(test.abc.de.Helper.k);
"
                    + "  List<test.abc.de.Helper> l = new ArrayList<>(); ";
        System.out.println(st);
        System.out.println("--------");
        st = st.replaceAll("(  |new |\\<|\\(|, )test\\.([a-z]+\\.)*", "$1");
        System.out.println(st);
    }
}

praktisch und arg notwendig, alle packages durchgängig klein geschrieben zu haben, auch kein CamelCase in der Mitte…

Danke, darauf wäre ich jetzt nicht gekommen, dabei ist das so offensichtlich :smiley:

IntelliJ unterstützt sogar negative lookbehind, damit funktioniert dann sogar sowas bei dem man Zeilen die „package“ enthalten (oder bereits Importe („import“) haben) ignoriert.
(?<!package |import )(haxe|nape|zpp_nape|Array|java).[a-z.]*
Beide Ansätze kommen auf das gleiche heraus :slight_smile:

IntelliJ ist gerade fertig geworden… 648.000 gefundene Matches. Na das hätte per Hand ja ewig gedauert.