2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Für Fragen rund um die Ide und zum Debugger
Antworten
MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von MmVisual »

Hallo,

Mir ist noch ein Bug aufgefallen, ich meine der ist schon länger in der IDE drin.

Folgender Ablauf:
Man hat irgend ein Projekt in der hat man in einer lokalen Funktion eine Variable "n1" im VAR Block.
Nun übersetzt man, OK, Warnings weil die Variable in dem Demo noch benutzt wird.
Dann möchte ich ein Popup Menü drauf haben und in dem ein "-" als Trenner.
Lazarus benamt diesen Trenner automatisch als "N1".
Wenn man jetzt übersetzt knallt es - der FPC hat ein Problem mit einer gleichnamigen lokalen Variable einer Funktion. Eigentlich sollte der FPC nur eine Warnung ausgeben, denn die lokale Variable hat eigentlich Vorrang.
Doch nun will ich das Popup Menü "N1" umbenennen in "mn_N1", dann benennt Lazarus auch die Variable in der lokalen Funktion um, damit kann man sich so ziemlich viel kaputt machen, da ein "n1" durchaus in vielen Funktionen gebraucht wird. Auch nach dem Umbenennen des Menüs gibt es daher immer noch den Übersetzungsfehler.

Anbei ein kleiner Film wie das aussieht:
2021-11-16 20-42-46.zip
(1.43 MiB) 78-mal heruntergeladen
Bugreport schreiben?

VG Markus
Zuletzt geändert von MmVisual am Mi 17. Nov 2021, 07:55, insgesamt 2-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2.2.0-RC2: Automatische Umbenennung im Code

Beitrag von wp_xyz »

MmVisual hat geschrieben:
Di 16. Nov 2021, 20:54
Bugreport schreiben?
Ja, bitte.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: 2.2.0-RC2: Automatische Umbenennung im Code

Beitrag von fliegermichl »

Boa das ist bös. Ja bitte unbedingt Bugreport.

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: 2.2.0-RC2: Automatische Umbenennung im Code

Beitrag von MmVisual »

Bugreport: https://gitlab.com/freepascal.org/lazar ... sues/39471

Vorgehensweise um so ein Fehler manuell zu beheben:
Das Menü TMenuItem.Name wieder zurück umbenennen in "n1", damit werden alle lokale Variablen ebenfalls wieder zurück umbenannt.
Lazarus schließen
Die *.lfm Datei öffnen, das MenüItem darin suchen und den Name umbenennen
Die *.pas Datei öffnen, das MenüItem darin in der Typdeklaration suchen und ebenfalls den Name umbenennen
Nun kann wieder ganz normal mit Lazarus weiter gearbeitet werden.
Am Besten erst einmal übersetzen um zu sehen dass es wirklich geklappt hat.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von six1 »

Ja... in diese Falle bin ich auch schon gerannt und habe es, wie von MmVisual beschrieben, gelöst.
Gruß, Michael

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von wp_xyz »

Habe dasselbe nun mit einem anderen Control durchgespielt: Setze ein TEdit aufs Formular --> es entsteht eine formularweit gültige Variable Form1. In OnCreate-Handler des Formular deklariere ich eine lokale Variable Edit1. Wenn ich das TEdit im Objektinspektor umbenenne wird auch - wie geschildert - die lokale Variable umbenannt. Hmm... Aber eigentlich ist das ein konstruiertes Beispiel: Niemand wird bei FPC eine lokale Variable genauso nennen wie eine klassenweite Komponente, denn der Compiler wird das vor allem im Mode ObjFPC nicht akzeptieren - zum Glück ist FPD da viel pingeliger als Delphi.

Ich denke das Haupt-Problem liegt darin, dass die IDE einen MenuItem zu N1, N2, N3 etc umbenennt, wenn die Caption zu '-' gesetzt wird. Warum ist das nötig? Wieder so ein Delphi-Erbe... Denn der vorher vergebene Name, MenuItem1, MenuItem2 etc ist doch völlig ok, und die Wahrscheinlichkeit für eine Kollision mit einer lokalen Variablen mit demselben Namen ist minimal.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von fliegermichl »

Also laut der Sprachdefinition darf man gleichlautende lokale Variablennamen verwenden.
Wenn es einfach nur globale Variablen sind, meckert der Compiler auch nicht.
Nur wenn es sich um Felder der TForm Klasse handelt.
Das ist irgendwie inkonsistent.

Code: Alles auswählen

type
 TForm1 = class ( TForm )
 public
  bla : string;
  procedure FormCreate(Sender : TObject);
 end;
 
procedure TForm1.FormCreate(Sender : TObject);
var bla : integer; // <- Fehlermeldung duplicate Identifier
begin
end;
Wohingegen folgender Code ohne Mecker übersetzt wird.

Code: Alles auswählen

type
 TForm1 = class ( TForm )
 public
  procedure FormCreate(Sender : TObject);
 end;

var bla : string;
 
procedure TForm1.FormCreate(Sender : TObject);
var bla : integer; 
begin
end;
Innerhalb von TForm1.FormCreate gilt die lokale Variable ansonsten die globale.
Solche Dinge sind sicher unschöner Programmierstil.

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von MmVisual »

Solche Dinge sind sicher unschöner Programmierstil.
So sollte niemand programmieren, jedoch würde es vollkommen ausreichend sein wenn der Compiler eine Warning ausgibt, dass hier ein möglicher Programmierfehler entstanden ist.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von MmVisual »

Das kann man übersetzen:

Code: Alles auswählen

Type
  TForm1 = Class(TForm)
    Procedure FormCreate(Sender: TObject);
  private
  public
    bla: String
  End;  

Procedure TForm1.FormCreate(Sender: TObject);
  Procedure InternFct();
  var bla : integer;
  Begin
  End;
Begin
end;  
Die Variable innerhalb einer Funktion die innerhalb einer Funktion angelegt ist, da meckert der FPC nicht.
Das Umbenennen ist in diesem Fall dennoch ein Problem.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2.2.0-RC2: Automatische Umbenennung im Code [Bugreport]

Beitrag von wp_xyz »

MmVisual hat geschrieben:
Mi 17. Nov 2021, 15:10
Das Umbenennen ist in diesem Fall dennoch ein Problem.
Wie denn? Mit "Search & Replace" im Editor? Das darf man nicht tun, das geht auf jeden Fall schief. Wenn ich das globale "bla" rechts anklicke und mit "Refactoring" > "Rename identifier" umbenenne, bleibt da lokale "bla" dagegen unverändert.

Antworten