Snippet generujący konstruktor z nazwą klasy C# w Visual Studio Code

Dziś w pracy mój kolega zwrócił uwagę na dość kuriozalny i wydawać by się mogło, banalny problem. Otóż posiadając wtyczkę OmniSharp (C#) w Visual Studio Code mamy dostęp do kilku snippetów ułatwiających nam pracę z kodem C#. Jednym z nich jest dobrze znane z Visual Studio generowanie konstruktora klasy. Jedyne co trzeba zrobić to w kodzie napisać ctor i nacisnąć tabulator. Wszystko super, jest jednak małe ALE. W Visual Studio taka kombinacja skutkuje wygenerowaniem semantycznie poprawnego konstruktora tj. publicznego modyfikatora dostępu (public), nazwy klasy, nawiasów i dwóch klamer. W VS Code wygląda to następująco:

 

 

Co jak co, ale w przypadku konstruktora jedyną poprawną z punktu widzenia języka nazwą jest nazwa klasy. Po co więc dodatkowo parametryzować ten snippet o parametr ClassName, który i tak zmuszony zaraz będę zmienić? Po chwili szukania w Internecie okazało się, że nawet istnieje w tej sprawie issue na GitHub. Komentarz jednego z kontrybutorów brzmi następująco:

 

„FWIW, getting this working is tricky because VS Code appears to only support inserting text with placeholders as part of snippet expansion. To retrieve the class name, we’ll need to be able to run code as the snippet expands. I’ve filed Microsoft/vscode#10561 to track that.”

 

Dodam tylko, że cały wątek wisi otwarty od sierpnia 2016. Czyżby nie dane było nam cieszyć się poprawnym snippetem?

 

Rozwiązanie problemu

Osobiście nie mogłem się nadziwić, że jest to aż taki problem. Udałem się zatem na stronę VS Code i przejrzałem umieszone tam treści. Moją uwagę przykuła sekcja Variables, która prezentowała domyślne zmienne, których możemy użyć w naszych snippetach. Jedna z nich nazywa się TM_FILENAME – jest to nazwa pliku (z rozszerzeniem), w którym aktualnie się znajdujemy. No cóż, nie jest to rozwiązanie w 100% idealne, ale patrząc z mojej perspektywy, tworząc kod zazwyczaj na jeden plik przypada jedna klasa, której nazwa jest adekwatna do nazwy pliku. Pozostało jedynie wyciąć rozszerzenie i snippet gotowy. Całkowitym przypadkiem, przykład takiej transformacji został zaprezentowany w następnej sekcji pt. Viariable transforms 😀

 


${TM_FILENAME/(.*)\\..+$/$1/}

 

Posiadając to, stworzyłem snippet:

 

{

 "Generate ctor": {
 "prefix": "ctor",
 "body": [
 "public ${TM_FILENAME/(.*)\\..+$/$1/}($2)",
 "{",
 "}"
 ],
 "description": "Generates class constructor with name of current file."
 }
}

 

Aby go aktywować przejdź do VS Code -> Preferences -> User Snippets -> csharp.json, a następnie wklej całość i zapisz. Od tej pory możesz cieszyć się nadpisanym snippetem, który powinien działać w większości przypadków:

 

 

Co jak co, ale to chyba lepsze rozwiązanie niż każdorazowe wpisywanie nazwy klasy. Daj znać co o tym sądzisz 😉 A może Ty też masz jakieś przydatne snippety, którymi mógłbyś podzielić się z innymi? Jeśli tak to zamieść je w komentarzu!