it-at-m / Wahllokalsystem

system that supports elections in the city of munich
https://opensource.muenchen.de/
MIT License
5 stars 0 forks source link

Entfernung von unnötigen Leerzeilen zu Beginn einer Methode #403

Open MrSebastian opened 3 weeks ago

MrSebastian commented 3 weeks ago

RegEx zum Auffinden:

public (?!(record)).*\(.*\).*\{

ja die Leerzeilen im Regex sind wichtig

Mit dem RegEx können die Methoden gefunden werden die die mit einer Leerzeile beginnen.

Wir sollte keine Leerzeile zum Beginn der Methode haben. Leerzeilen gehören zwischen Methoden oder in Methoden zu Trennung von logischen Blöcken, Kommentare nach Statemens, Definition lokaler Variablen von ersten Statement.

Todo

MrSebastian commented 3 weeks ago

Kann man dies eventuell mit unseren Lintingtools abdecken?

dragonfly28 commented 1 week ago

Ich habe eine noch generischere regexp gefunden die auch private Methoden abdeckt: \(.*\)\s*\{\s*\n\s*\n

Erfolgreicher Versuch im checkstyle.xml mit:

`

    <property name="format" value="\(.*\)\s*\{\s*\n\s*\n"/>
</module>`

@MrSebastian Macht es Sinn, das in jedem Projekt zum checkstyle.xml hinzuzufügen? Das Zusammenspiel spotless/checkstyle/IntelliJ ist mir noch nicht ganz klar

MrSebastian commented 4 days ago

Wir werden es wohl in jedes File im Projekt einbauen müssen da jeder Services ein eigenes Maven-Projekt ist. Bei einem Multi-Modul-Projekt dürfte es an zentraler Stelle ausreichen.

MrSebastian commented 3 days ago

Der RegeEx funktioniert leider nicht in folgenden Fällen

Mehrzeilige Signatur

Codebeispiel ```java public record UrnenwahlvorbereitungDTO(@NotNull String wahlbezirkID, @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long anzahlWahlkabinen, @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long anzahlWahltische, @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long anzahlNebenraeume, @NotNull @Size(min = 1) List urnenAnzahl) { public UrnenwahlvorbereitungDTO(final String wahlbezirkID, final long anzahlWahlkabinen, final long anzahlWahltische, final long anzahlNebenraeume, final List urnenAnzahl) { this.wahlbezirkID = wahlbezirkID; this.anzahlWahlkabinen = anzahlWahlkabinen; this.anzahlWahltische = anzahlWahltische; this.anzahlNebenraeume = anzahlNebenraeume; this.urnenAnzahl = Objects.requireNonNullElseGet(urnenAnzahl, ArrayList::new); } } ``` *Die Leerzeile vor `this.wahlbezirkID = wahlbezirkID;` wird nicht detektiert.

Leerzeile zu Beginn einer Methode die eine Exception wirft

Codebeispiel ```java public class ServiceIDFormatter { private final String serviceName; public ServiceIDFormatter(@Value("${service.info.oid}") final String serviceName) { this.serviceName = serviceName; } public String getId() throws RuntimeException { return serviceName; } } ``` *Die Leerzeile zu Beginn der Method `getId` wird nicht gefunden solange es ein `throw ...` gibt
dragonfly28 commented 1 day ago

Das Verhalten bestimmter RegExp-Ausdrücke im Suchfeld von IntelliJ, bei der Verwendung in checkstyle.xml und in einem Web-Tester wie https://regex101.com/ ist unterschiedlich und nicht nachvollziehbar. Es handelt sich um ein reines Trial&Error-Spiel.

So funktioniert folgende RegExp z.B. mit dem WebTester für obige Code-Beispiele:

(public|private|protected) (?!(record)).*\((.|\n)*\).*\{\n\n

Aber leider nicht in der IntelliJ-Suche und über Checkstyle.

Mein Vorschlag wäre:

(public|private|protected) (?!(record)).*\(.*\).*\{