ReSharper 2020.3의 새로운 기능

ReSharper 2020.3은 C# 9 기능과의 호환성, 인레이 힌트의 새로운 관점, Avalonia 지원, 통합 Dynamic Program Analysis 및 일상적인 개발에 도움을 주는 일련의 세부적 업데이트를 제공합니다.

다운로드

30일 무료 평가 이용 가능

C# 지원

Source Generators(소스 생성기)는 C# 컴파일러의 기능 중 가장 많이 언급되는 기능입니다. 컴파일 과정에서 바로 새 코드를 작성하고 이를 즉시 사용할 수 있는 이 기능은 매우 흥미로우며 다양한 상황에서 유용하게 쓰일 수 있습니다.

그렇다면 ReSharper는 어떤 지원을 제공할까요? Rider의 가장 우수한 기능을 살려 리팩터링 중 생성된 파일을 고려하고, 코드 에디터 기능을 제공하며 생성된 코드를 탐색하는 데 도움을 줄 수 있습니다.

이제 부분적 메서드에서 out 매개변수, void가 아닌 반환 유형 및 모든 접근성 유형이 허용되므로 Source Generators(소스 생성기)와 함께 더욱 유용하게 활용할 수 있습니다. Source Generators(소스 생성기)는 부분 메서드의 정의적 선언을 사용하여 생성된 코드 동작을 사용자 지정할 수 있습니다.

다른 멋진 기능으로는 init 전용 프로퍼티가 있습니다. 이 프로퍼티는 객체 초기화 중에만 설정 가능합니다. 드디어 프로퍼티를 가변 상태로 노출하지 않고도 객체 이니셜라이저를 사용할 수 있습니다!

ReSharper는 init 전용 프로퍼티를 인식하고, 코드를 완성할 때, 코드를 생성하는 완성 기능을 수행할 때, 프로퍼티가 변경되었는지 여부를 분석할 때, 생각이 바뀌면 변경할 수 있도록 빠른 수정을 제공할 때 이를 고려합니다.

init을 적용하기 위한 최적의 위치는 새로운 record 유형입니다. 이 유형은 불변 상태를 얻는 데 유용한 값 의미가 포함된 참조 유형이지만 이제 전체 객체에 적용될 수 있습니다. ReSharper는 선호하는 선언 스타일 선택을 위한 빠른 수정부터 기본 코드 완성 기능까지 지원하며 해당 언어 기능을 개선하고 있습니다.

위치 지정 레코드에는 컴파일러에서 생성된 Deconstruct() 메서드가 포함됩니다. ReSharper는 이러한 객체의 모든 구조 분해 기능을 지원합니다. 변수 삽입 시 표시되는 팝업창에 주목하세요. 단일 변수 또는 구조 분해 선언 중 선택할 수 있는 옵션을 제공합니다. 함수가 레코드 객체 속성에 액세스할 때 동일한 선택 옵션이 제공됩니다.

조금 더 세부적인 기능을 살펴보겠습니다. 이제 지역 함수에 속성이 포함될 수 있습니다(매개변수 및 유형 매개변수도 마찬가지입니다). ReSharper의 빠른 수정에서 이 기능을 지원하며 ! 또는 ?를 눌러 각각 [NotNull] 또는 [CanBeNull]로 메서드 어노테이션을 추가하는 멋진 기능도 있습니다.

또 다른 유용한 C# 9 추가 기능 중 하나는 최상위 프로그램을 작성하는 것입니다. 이제 프로그램 클래스와 씨름할 필요가 없습니다. using 지시문 바로 뒤에 진입점 코드를 작성할 수 있습니다. 최상위 구문 작업 시에도 사용 가능한 일부 지원이 있습니다. 최상위 구문 관련 규칙은 두 가지입니다. 최상위 구문은 모든 유형 또는 네임스페이스 앞에 위치해야 하며, 프로젝트의 단일 파일에만 최상위 코드가 포함될 수 있습니다. 코드 재배열 및 복사 붙여넣기 작업 시 두 가지 규칙 모두 쉽게 위배됩니다. ReSharper는 빠른 수정을 제공하므로 최상위 코드를 상위 또는 기타 파일로 이동하여 문제를 해결할 수 있습니다.

최상위 코드 역시 코드라는 점을 고려할 때 리팩터링도 지원됩니다. 바로 Extract local variable(지역 변수 추출) 및 Extract method(메서드 추출) 리팩터링입니다.

C# 9에서 대상 유형의 새 표현식을 활용하면 사용 위치 컨텍스트에서 추론될 경우 new라는 키워드 뒤의 유형을 생략할 수 있습니다. ReSharper는 이 기능에 대한 완벽한 지원을 제공하며, 생성자의 Find Usages(사용 위치 검색) 및 선호하는 구문 스타일 구성 등의 기능이 이에 포함됩니다. 선호하는 구문 스타일 구성 기능을 통해 생성된 유형이 명백할 경우 new() 구문을 사용할 수 있으며, 다른 경우에는 명시적 유형 지정을 적용할 수 있습니다.

또한 코드의 모든 new() 구문을 통제할 수 없는 경우엔 ReSharper의 새로운 유형 이름 힌트가 유용합니다.

반환 유형 공변성을 활용하면 기본 클래스 메서드에서처럼 멤버 재정의 시 동일한 유형을 반환하지 않아도 됩니다. 이제 더욱 특정한 유형을 반환하는 해결 방법을 구현할 필요는 없습니다.

신규 언어 버전에서 패턴 일치는 지속적으로 발전하고 있습니다. 이제 일치하는 표현식으로 관계형 패턴(<, > 등) 및 논리적 패턴(not, or, and)을 사용할 수 있으므로 기존 switch 구문의 많은 중복 문제가 제거됩니다. ReSharper는 패턴을 분석하고 원하는 스타일로 다시 작성하는 데 도움을 줍니다.

마지막으로 람다 메서드의 매개변수 무시 기능이 도입되었을 때에는 빠른 수정을 추가하면 좋을 것이라 생각했습니다.

언어의 주요한 개선 사항은 여기까지입니다. ReSharper 2020.3 버전에서는 언어에 대한 여러 개선 사항도 추가되었습니다. 대상 유형 조건식, 정적 람다, foreach의 확장 GetEnumerator 메서드, 함수 포인터 유형 및 네이티브 정수 유형 등이 있습니다.

인레이 힌트

인레이 힌트는 강력한 기능이지만 가능한 한 환경을 깔끔하고 정돈된 상태로 유지해야 합니다. 두 가지 장점을 모두 활용하기 위해 인레이 힌트의 "Push-to-Hint" 메커니즘이 새롭게 도입되었습니다.

Push-to-Hint 가시성 모드에서는 힌트가 기본적으로 표시되지 않습니다. Ctrl를 길게 누르거나(놓으면 곧바로 숨겨짐) Ctrl를 두 번 누르면(이 경우 Ctrl를 다시 두 번 누를 때까지 계속 표시됨) 표시됩니다.

매우 세분화된 설정을 제공하므로 ReSharper에서 항상 활성화해야 할 힌트, 푸시 중 표시해야 할 힌트, 별로 중요하지 않은 힌트를 지정할 수 있습니다. 각 힌트 유형에 ‘Visibility(가시성)’ 설정을 사용하세요.

또 다른 개선 사항은 묵시적 유형의 형 변환 힌트입니다. 이러한 형 변환은 데이터 손실 또는 성능 저하를 초래할 수 있으므로 이제 ReSharper는 묵시적 형 변환이 발생하는 위치를 표시합니다.

유형 변환 힌트를 Ctrl+클릭하면 묵시적 변환 구현으로 이동합니다.

이전 버전에서 이미 사용할 수 있었던 XAML용 인레이 힌트에도 이제 모양을 구성할 수 있는 일반적인 컨텍스트 메뉴가 있습니다.

서식 지정 도구

서식 지정 엔진에 보다 세분화된 설정을 계속 추가하고 있습니다. 이번 릴리스에 추가된 기능은 다음과 같습니다.

프로퍼티 패턴 정렬 설정을 통해 ReSharper에서 간편한 패턴은 한 줄에 배치하도록 지시하고 긴 패턴의 줄 바꿈 방식을 지정할 수 있습니다. 또한 프로퍼티 패턴을 열로 정렬하는 설정도 있습니다.

이제 프로퍼티 또는 이벤트 접근자 주변에 빈 줄을 추가할 수 있습니다.

Visual Basic의 경우 단항 연산자 +/- 뒤에 공백을 추가하는 옵션이 제공됩니다.

.editorconfig 지원 업데이트도 몇 가지 있습니다. ReSharper에서 이제 Roslyn 프로퍼티 file_header_templates, dotnet_sort_system_directives_firstdotnet_separate_import_directive_groups를 지원합니다.

.editorconfig로 내보내기에 새로운 “Spaces around ‘=’” 매개변수도 있습니다. 기존 파일에서 이 값은 자동으로 탐지되며 새 파일에서도 수동 설정이 가능합니다. 기본값은 ‘true’로 설정됩니다.

Dynamic Program Analysis

ReSharper에 Dynamic Program Analysis(DPA)를 추가하여 메모리의 크고 작은 객체 힙에 대한 클로저와 할당을 탐지함으로써 보다 쉽게 분석하고 개선된 코드를 작성하도록 했습니다.

가장 좋은 점은 일반적인 코딩, 실행 및 디버깅 루틴 외에는 아무것도 할 필요가 없다는 것입니다. DPA는 백그라운드에서 진행되며 프로젝트가 시작될 때마다 보고서가 함께 준비됩니다. 오른쪽 하단 구석에 있는 아이콘만 확인하면 됩니다.

DPA에 대한 자세한 내용은 이 블로그 게시물을 확인하세요.

구조 제거

구조 탐색 기능에는 이미 익숙할 것으로 생각합니다. 이를 통해 해당 구조, 키워드, 블록, 메서드 등에 따라 코드 조각을 선택할 수 있습니다.

Extend(선택 범위 확장) 또는 Shrink Selection(선택 범위 축소) 액션을 사용할 때는 놓치기 쉬운 쉼표, 점 또는 대괄호를 선택하는 또 다른 단계가 필요합니다. 블록을 삭제하면 코드 오류가 발생합니다. 이 경우 ReSharper는 약간의 정리 작업을 수행합니다. 구조적으로 선택된 항목이 있는 경우 백스페이스 또는 Delete를 누르면 ReSharper가 구조적으로 이 항목의 삭제를 시도합니다.

명령줄 도구

대규모 코드 기반에서 작업하는 경우, 솔루션 전체 작업을 실행할 때마다 오랜 시간이 걸립니다. 몇 개의 파일을 변경한 후 전체 솔루션의 서식이 다시 지정될 때까지 기다려야 했던 경험이 있지 않았나요? 이제 솔루션 파일을 가리키지 않고 CleanupCode 콘솔 도구를 실행할 수 있습니다. 파일 또는 폴더 세트만 지정하면 됩니다. 명령줄은 cleanupcode.exe [폴더 경로] [파일 경로] [다른 파일 경로]와 같습니다.

이 도구는 코드 형식만 지정하며 이 모드에서 정리는 사용할 수 없습니다.

한동안 콘솔 도구에서 빠져있었던 또 한 가지는 플러그인에 대한 지원이었습니다. 이제 다시 돌아왔습니다! 현재는 Windows에서만 사용할 수 있습니다. 이를 사용하려면 플러그인의 ID를 알아야 합니다. JetBrains Marketplace로 이동하여 플러그인 페이지를 열고 "Versions(버전)" 탭으로 이동한 다음 아무 버전이나 클릭하면 플러그인 ID가 표시됩니다. 그런 다음 InspectCode 또는 CleanupCode를 시작할 때 플러그인 ID와 함께 -x=[ID] 키를 사용하면 콘솔 도구가 자동으로 플러그인을 다운로드하여 활성화합니다(cleanupcode.exe -x=[ID] [솔루션 파일 경로]).

플러그인은 도구 버전과 호환되어야 합니다. Also, plugins are not yet supported if you’re using the .NET Core global tools mechanism to install ReSharper’s command line tools.

탐색

텍스트를 검색할 때 어려움을 겪은 적이 있나요? 혹시 코드의 문자열이나 주석을 찾을 때 그렇지 않았나요? 혹은 텍스트의 오타로 인해 실제로 아무것도 찾을 수 없었던 적은 없나요?

이제 Find Text(텍스트 검색) 기능이 정확한 검색 외에 퍼지 검색을 수행하여 있을지 모르는 오타와 누락된 단어도 고려합니다. 결과는 퍼지 섹션의 일반 하위 문자열 검색 결과 아래에 표시됩니다. 힌트: 코드에서 특정 서식의 문자열 빌드를 찾는 경우에 매우 유용할 수 있습니다.

Avalonia 지원

코드 분석

WPF와 유사한 모든 프레임워크와 마찬가지로 코드 분석은 “Possible ‘System.NullReferenceException’”“Class/Property {...} is obsolete: Use {...}”를 포함한 .axaml 파일과 C# 코드 비하인드에 대한 적절한 빠른 수정을 사용하여 다양한 일반적인 코드 검사를 지원합니다.

일반적인 WPF 검사 외에도 “Path to resource is case-sensitive(리소스 경로에 대소문자 구분 필요)” 또는 “ColumnDefinitions tag can be convert to attribute(ColumnDefinitions 태그는 속성으로 변환 가능)” 검사 등의 수많은 Avalonia 전용 검사가 있습니다. 예시 중 두 번째 검사인 “ColumnDefinitions tag can be convert to attribute(ColumnDefinitions 태그는 속성으로 변환 가능)”의 경우 ColumnDefinitions="*,Auto,*" 속성의 컨텍스트 액션을 통해 해당 태그를 <Grid.ColumnDefinitions> 태그로 다시 변환할 수 있습니다.

Avalonia 바인딩의 “$self", “$parent”, “^”“#” 구문에 대한 적절한 지원과 $parent[] 배열의 색인에 대한 적절한 유효성 검사가 추가되었습니다.

CompiledBindingx:CompileBindings 확장을 위한 확장된 지원도 있습니다. ReSharper는 여기에 DataType이 필요하다는 사실을 알고 코드의 바인딩에 이를 지정하라는 메시지를 표시합니다.

“Create from usage(사용 위치에서 생성)” 빠른 수정은 모든 종류의 Avalonia 프로퍼티에 사용할 수 있습니다.

Avalonia XAML 지원에는 CSS와 유사한 스타일링 시스템에 대한 이해가 포함됩니다.

인레이 힌트는 현재 보고 있는 코드를 더 잘 이해하는 데 유용합니다.

코드 완성

모든 XAML 키워드, 모든 종류의 마크업 확장, x:Name, Style 프로퍼티, StyleInclude에 대한 Source 프로퍼티 등에 코드 완성과 매개변수 정보를 이용할 수 있습니다.

탐색

컴파일된 바인딩 데이터 유형, 바인딩된 프로퍼티, Avalonia 제어 유형 및 x:Name 선언으로 쉽게 이동할 수 있습니다. ReSharper는 또한 XAML에서 스타일 setter 프로퍼티를 포함한 디컴파일된 외부 코드 및 참조된 xmlns 네임스페이스로 직접 이동할 수 있습니다.

Find Usages(사용 위치 검색)

Find Usages(사용 위치 검색) 기능을 이용하면 메서드 바인딩, x:Name 속성, Style 클래스 및 setter, 모든 종류의 프로퍼티의 사용 위치를 모두 쉽게 찾을 수 있습니다.

리팩터링

이제 Rename(이름 변경) 및 Safe Delete(안전한 삭제) 리팩터링은 Avalonia XAML 코드에서 모든 사용 위치를 인식하고 그에 따라 업데이트합니다.

계층 및 코드 구조

Avalonia XAML 코드의 계층 및 구조를 관찰할 수 있습니다.

디컴파일러 업데이트

ReSharper의 통합 디컴파일러도 더 많은 C# 기능을 지원하도록 업데이트되었습니다. IL Viewer와 소스 코드 간의 동기화 메커니즘도 개선되었습니다.

특히 최상위 구문에 대해 어셈블리 탐색기에 <Top-level Entry Point> 노드를 추가했습니다. 이 노드를 두 번 클릭하거나 컨텍스트 메뉴 탐색을 사용하여 디컴파일된 코드의 실제 최상위 구문으로 이동할 수 있습니다.

이제 비공개 소스 링크가 지원됩니다. 비공개 소스 서버에 연결해야 하는 외부 소스로 이동하면 ReSharper에서 알림을 표시하고 자격 증명을 입력할 수 있도록 합니다. 물론 Visual Studio의 설정에서 이미 지정하지 않은 경우이며, 이미 지정했다면 자동으로 적용됩니다(GitHub 및 BitBucket의 경우).

Blazor

Blazor 지원을 계속 추가하고 있습니다. 이 반복 작업의 목적은 제네릭 유형 매개변수와 사용 위치에서 해당 유형 추론을 지원하고 솔루션을 열 때 성능 저하를 없애는 것이었습니다. 수정된 이슈의 전체 목록은 공개 버그 트래커를 참조하세요.

완벽한 Unreal Engine 연계

Unreal Engine

ReSharper C++ 2020.3에서는 UnrealHeaderTool과의 완벽한 통합을 제공하므로 일반적으로 컴파일 시에만 발견되는 이슈를 포착할 수 있습니다. ReSharper C++는 백그라운드에서 UnrealHeaderTool을 실행하고 분석 결과를 에디터에서 바로 실시간으로 표시합니다.

HLSL 지원을 개선하기 위해 ReSharper C++는 셰이더 파일에 제어 흐름 분석 검사를 제공합니다. 구성 파일을 빌드하기 위한 변경 사항을 실시간으로 추적하면 ReSharper가 항상 최신 프로젝트 모델을 사용할 수 있습니다.

자세히 알아보기

더욱 향상된 C++20 지원

C++20

ReSharper C++ 2020.3은 비교 규칙에 대한 C++ 20 변경 사항을 구현합니다. 풍부한 검사 및 오류 메시지를 통해 코드가 어떻게 작동할지 정확히 이해해야 할 때 ReSharper C++를 사용할 수 있으며, 새로운 빠른 수정을 통해 비교 연산자를 쉽게 사용할 수 있습니다.

또한 ReSharper C++ 2020.3은 C++20 범위 라이브러리를 채택하는 데 도움이 되는 새로운 검사를 제공하고 Visual Studio 16.8에 도입된 C++20 코루틴의 표준 모드에 대한 지원을 추가합니다.

자세히 알아보기

타임라인 검사 dotUltimate

타임라인 검사

dotMemory는 타임라인 데이터를 사용하여 Timeline 그래프에서 바로 자동 검사를 제공합니다.

현재, 세 가지 검사를 사용할 수 있습니다.

  • 높은 가비지 수집 압력
  • Gen0의 고정된 객체
  • 빠른 큰 객체 힙 증가율

자세히 알아보기

향상된 연속 테스트 dotUltimate

향상된 연속 테스트

이제 연속 테스트 세션이 트리거될 경우 빌드해야 할 프로젝트를 세부적으로 지정할 수 있습니다. 이 기능으로 연속 테스트 세션의 속도가 개선됩니다. 이 기능은 Visual Studio와 Rider 모두에서 작동합니다.

자세히 알아보기

기타 업데이트

  • 제한되지 않은 제네릭 유형에서 null 가능 어노테이션 지원(디폴트 제약 조건 포함).
  • TypeScript 지원을 위한 적절한 업데이트를 구현했습니다. 이제 ReSharper는 null 병합과 선택적 체인을 지원합니다.
  • 순차 패턴 검사를 복잡한 패턴 일치 검사로 변환하는 데 도움을 주는 새로운 빠른 수정을 추가했습니다.
  • Change Signature(시그니처 변경) 리팩터링 내에서, 추가하는 매개변수의 기본값을 설정하는 데 사용되는 도구, 즉 'Resolve with call tree(호출 트리로 해결)'을 선택할 때 열리는 도구를 새롭게 디자인했습니다. 이제 노드를 두 번 클릭하여 코드 탐색을 사용할 수 있습니다. 값을 지정하는 코드로 바로 이동하는Create default parameter 라는 새로운 옵션이 있습니다. 마지막으로, 트리에서 선택한 여러 수정 사항에 대해 서로 다른 색상이 적용됩니다. 이것으로 더 쉽게 해결할 수 있기를 바랍니다!
다운로드

30일 무료 평가 이용 가능