MPS 2024.1의 새로운 기능

MPS 2024.1에서는 Project(프로젝트) 도구 창의 Logical View(논리적 뷰) 창에 새로운 비동기식 구현이 추가되었고, 다양한 플랫폼에 대한 Kotlin 지원이 상당히 개선되었으며, 테스트 실행이 눈에 띄게 빨라졌습니다. 또한 제너레이터 계획의 조건부 포크, TestInfo의 프로젝트 경로 지원 중단, 새로운 UI의 개선 및 수많은 플랫폼 업데이트도 확인할 수 있습니다.

아래에서 각 개선 사항을 자세히 알아보세요.

Kotlin에 대한 플랫폼 지원 개선

MPS에서 Kotlin 지원은 원래 공통 코드만 지원하도록 설계되었습니다. 하지만 MPS에서 가능한 유일한 사용 사례는 JVM으로 컴파일링하는 것이었고, 공통 코드와 JVM 코드의 구분이 불분명했습니다.

이번 릴리스에서는 Kotlin 노드에 대한 플랫폼 소스 세트 구성을 도입했습니다. 이를 통해 특정 코드 부분이 지원하는 타깃 플랫폼을 식별하고 호환되지 않는 코드의 선언을 숨길 수 있습니다.

소스 세트

일반적인 Kotlin 프로젝트에서는 소스 세트를 사용하여 다양한 플랫폼을 타깃으로 하는 코드를 분리할 수 있습니다. MPS에서는 루트 수준에서 이 기능을 도입하여 각 Kotlin 루트 노드에 대해 지원되는 플랫폼 세트를 지정할 수 있는 옵션을 제공했습니다. 이러한 소스 세트는 인텐션 액션의 도움으로 루트 노드 수준에서 구성할 수 있습니다.

실제로 이는 다음을 의미합니다.

  • 주어진 소스 세트에 있는 코드는 호환되는 플랫폼의 선언에만 액세스할 수 있습니다. 예를 들어, JVM용 코드는 JVM용 코드와 JVM을 타깃으로 하는 공통 코드에만 액세스할 수 있습니다.
  • 생성된 소스는 소스 세트별 디렉터리 아래에 구조화됩니다. 디렉터리가 지정되지 않으면 모듈의 디폴트 값에 해당하는 디폴트 소스 세트를 사용합니다.
  • 이제 expected 및 actual 선언이 지원됩니다.

기본적으로, 명시적인 플랫폼이 없는 Kotlin 코드는 JVM을 사용하여 이전 버전과의 호환성을 유지합니다.

스텁에 대한 로드 및 컴파일

새로운 멀티플랫폼 사용 사례를 지원하도록 스텁이 개선되었습니다. 이전에는 MPS가 Kotlin과 Kotlin/JVM 스텁에 대해 별도의 옵션을 제공하여 각각 공통 스텁과 JVM 스텁을 로드했습니다.

이 두 가지 옵션이 이제 Kotlin 스텁에 대한 옵션으로 통합되었으며, 이제 제공된 아티팩트가 공통 코드, JVM 코드 또는 다른 플랫폼용 코드를 노출하는지 자동으로 판별합니다.

공통 라이브러리와 플랫폼별 라이브러리 간의 선언은 불필요하므로(두 아티팩트 모두 필요한 모든 선언을 포함함) 스텁을 깔끔하게 유지하기 위해 중복을 필터링하는 새로운 메커니즘을 도입했습니다. 플랫폼별 라이브러리가 동일한 모듈 아래에 선언되면 공통 선언에 액세스할 수 있으므로 이를 다시 선언할 필요가 없습니다.

종속성 구성은 이전과 동일합니다.

  • 공통 라이브러리와 플랫폼별 라이브러리 모두 스텁으로 사용할 수 있습니다.
  • JVM 라이브러리는 공통 코드를 JVM으로 컴파일링하는 데 필요하며, Java 패싯에서 선언되어야 합니다.

예를 들어, 공통 코드를 작성하려면 스텁에 대한 공통 라이브러리와 공통 소스 세트를 사용해야 하지만, Java 패싯에서 Java 아티팩트도 선언해야 합니다.

CodeRules 타입 시스템 없이 Kotlin 가독성 개선

CodeRules 기반의 Kotlin Typesystem 플러그인을 사용할 수 없을 때, MPS의 Kotlin 코드는 많은 typesystem 및 범위 오류를 발생시켰습니다. 가독성과 테스트 용이성을 개선하기 위해, CodeRules 기반 typesystem 플러그인을 사용할 수 없을 때는 이러한 검사와 오류가 소거됩니다.

이러한 경우, Kotlin 언어의 모든 범위는 호환되는 콘셉트의 모든 노드를 포함하는 기본 범위로 대체됩니다. 이를 통해 모든 유효 노드가 범위에 있으므로, 모든 거짓 양성 오류가 제거됩니다.

Kotlin 코드를 처리하기 위한 가이드라인은 이전과 동일합니다.

  • Kotlin 코드를 작성하고 검사하려면 CodeRules를 활성화하고 Kotlin Typesystem 플러그인을 설치해야 합니다.
  • Kotlin을 읽고 생성하는 작업은 이것 없이도 안전하게 수행할 수 있습니다.

Logical View(논리적 뷰) 창을 다시 구현

Logical View(논리적 뷰) 창이 이제 비동기 아키텍처를 기반으로 하여 UI 반응을 빠르게 유지하고 IDE의 전반적인 성능을 높입니다. 이 새로운 구현으로 확장과 수정도 더욱 쉬워졌습니다. 자세한 내용은 지식 베이스에서 ProjectViewTree상에 ProjectPane 구현이라는 문서를 참조하세요.

이 새로운 구현으로 몇 가지 주목할 만한 변경이 이루어졌습니다.

  • 오류 및 경고 표시기를 더 이상 사용할 수 없습니다.
  • 계층 구조에서 발견된 오류와 경고는 모두 빨간색 밑줄로 표시됩니다.
  • Show Descriptor Models(설명자 모델 표시) 옵션은 모든 설명자 모델에 영향을 미칩니다.
  • 일부 드래그 앤 드롭 작업이 다르게 작동합니다.
  • Logical View(논리적 뷰) 창의 설정이 약간 재구성되었습니다.

자리표시자 셀

BaseLanguage에 새로운 스타일을 도입했으며, 이를 통해 누락된 값(하위 노드 또는 참조)이 있는 경우 상수 셀을 자리표시자로 사용할 수 있습니다. 예를 들어, 클래스에 생성자가 없는 경우 <no default constructor> 자리표시자 셀을 대신 표시할 수 있습니다. 이 스타일을 적용하면 상수 셀이 해당 자리표시자 셀에서 예상되는 동작을 나타냅니다. 커서는 첫 번째 위치에만 놓을 수 있으며, 값을 편집할 수 없습니다. 첨부된 변환 메뉴로 수행된 수정만 허용됩니다.

빌드 언어의 변경 사항

빌드 언어에서 모듈의 부울 doNotCompile 옵션은 다음과 같은 경우를 더 잘 구분하기 위해 Java 열거형으로 대체되었습니다.

  • 모듈에 코드가 전혀 없습니다.
  • 모듈에 코드가 포함되어 있지만, 해당 코드가 MPS가 아닌 다른 도구로 컴파일되었습니다.

두 경우 모두 true 값으로 표현되었습니다.

새로운 Java 열거형에는 세 가지 가능한 값이 있습니다.

  • compile in MPS(MPS에서 컴파일)
  • compile externally(외부에서 컴파일)
  • no code(코드 없음)

2024.1로 마이그레이션할 때 doNotCompile의 원래 false 값은 compile in MPS(MPS에서 컴파일링)로 마이그레이션되고, doNotCompiletrue 값은 compile externally(외부에서 컴파일링)로 마이그레이션됩니다.

생성 계획의 조건부 포크

실험 단계에 있는 작은 새 기능을 사용하면 포크되는 원래 계획을 실제로 수정하지 않고도 생성 계획에 대한 포크를 추가할 수 있습니다. 생성 계획은 다른 생성 계획의 포크로 표시될 수 있습니다. 표시된 계획은 포크된 생성 계획의 맨 처음에 삽입된 표준 fork 구문을 통해 명시적으로 참조된 것처럼 취급됩니다.

또한, 포크를 정의할 때 트리거 역할을 하는 문자열 수정자를 사용할 수 있습니다. 생성 타깃 패싯의 패싯 ID가 문자열 트리거와 일치하는 모듈에 의해 생성 모델이 소유되는 경우에만 포크가 발생합니다.

MPS의 JUnit5 XML 보고서

MPS의 JUnit 테스트는 이제 Vintage 및 Jupiter 형식뿐만 아니라 Open Test Reporting 형식으로도 테스트 보고서를 생성할 수 있습니다. 생성된 보고서에 Open Test 보고서를 포함할지 여부를 제어하기 위한 새로운 옵션이 빌드 언어의 테스트 옵션에 제공됩니다. 이 옵션을 true로 설정하면 junit-platform-events*-$BUILD_NAME$.xml이라는 보고서 파일이 프로젝트 디렉터리에 생성됩니다.

이 옵션을 false로 설정하면 Vintage 및 Jupiter 엔진에 대한 기존 보고서가 생성됩니다.

테스트 보고서에 JUnit5 어노테이션 @DisplayName 전파

MPS 테스트 보고서에서 이제 JUnit @DisplayName 어노테이션을 준수하고 테스트 보고서 도구 창에 표시되는 보고서에 해당 이름을 전파합니다.

테스트 런타임 개선

이전에 노드 또는 에디터 테스트를 실행할 때 MPS는 전체 테스트 모델을 일시적 모델로 복사하고 모든 테스트 케이스 노드(루트 NodeTestCase 또는 EditorTestCase부터 시작)의 추가 복사본을 만들었습니다. 대규모 테스트 모델에서 이는 성능에 큰 영향을 미치고는 합니다.또한 중복된 테스트 노드가 있는 다소 이상한 설정이 만들어졌습니다. MPS 2024.1에서는 테스트가 포함된 모델이 더 이상 복사되지 않습니다. 대신 NodeTestCase 또는 EditorTestCaseTestNode라는 하위 요소만 해당 환경 노드(그 참조의 타깃)와 함께 복사됩니다.

TestInfo의 프로젝트 경로가 더 이상 필요하지 않습니다.

MPS 프로젝트를 열어야 하는 테스트에 더 이상 TestInfo 선언이 필요하지 않습니다. 이는 JUnit 테스트를 실행하는 모든 접근 방식에 적용됩니다.

  • 진행 중이든 진행 중이 아니든 IDE에서 테스트가 실행되는 경우 현재 열려 있는 프로젝트가 사용됩니다.
  • 테스트가 <launchtests> 작업으로 실행되는 경우, project path를 작업의 추가 프로젝트 경로 옵션으로 지정할 수 있습니다. 지정하지 않으면 현재 프로젝트의 홈 디렉터리에 해당하는 ${basedir}가 사용됩니다.
  • 위의 두 방식을 모두 사용할 수 없는 특수한 경우에는 -Dmps.test.project.path 시스템 프로퍼티를 통해 프로젝트 위치를 지정할 수 있습니다.

기존 TestInfo 선언은 계속 지원되며 유지됩니다.

모듈 클래스 로드의 완전한 재정비

클래스 로드를 모델 액세스 및 ReloadableSModule의 사용 중단과 분리하려는 노력의 일환으로, 모듈에서 클래스 로드가 작동하는 방식을 변경했습니다. 최종 사용자에게 눈에 띄는 변화가 생기지 않도록 노력했지만, 업데이트로 인해 이전에 없었던 클래스 로드 문제가 발생할 수 있습니다.

이번 재정비의 일환으로, MPS는 이제 모듈 파일에 분산된 정보를 기반으로 시작 시 종속성을 계산하지 않고도 배포된 모듈에 대해 module.xml에 선언된 종속성을 따릅니다. 설계 단계에서 종속성은 모델 변환 과정 중 수집된 정보로부터 파생되며, 여기서 다시 계산되지 않습니다. .mpl 또는 .msd 파일에서 모듈 종속성을 분석하는 기존 로직은 새로운 메서드가 실패할 경우에 대비해 계속해서 유지됩니다.

이러한 변경은 Java 모듈 패싯과 전반적인 모듈 패싯을 개선하려는 지속적인 노력의 일환입니다.

주석 처리된 노드를 범위에서 제외(2022.3.2에서도 사용 가능)

디폴트 범위 계산에 의존하는 경우, 주석 처리된 잠재적 타깃 노드가 이제 자동으로 범위에서 제외됩니다.

기타

  • BaseLanguage에 긴 16진수 리터럴이 도입되었습니다.
  • 프로젝트에 마이그레이션이 필요하고 모듈과 모델 버전이 호환되지 않는 경우(예를 들어, 모듈에서 모델에 언급된 버전과 다른 언어 버전이 언급된 경우), 호환되지 않는 모든 모듈을 표시하는 액션이 포함된 팝업 알림 창이 나타납니다. 병합된 상태가 올바른 언어 및 모듈 버전을 반영하도록 할 수 있으므로 이는 마이그레이션된 코드를 병합할 때 도움이 됩니다.
  • Logical View(논리적 뷰) 창에서 devkit 아래의 모듈은 모듈 참조 노드로 표시됩니다. 이는 언어 모듈 아래의 런타임 모듈이 표시되는 방식과 유사합니다.

다양한 버그 수정

  • 이전과 마찬가지로 이 빌드에서도 상당히 많은 버그가 수정되었습니다. 해결된 문제의 전체 목록은 여기에서 확인할 수 있습니다.

플랫폼 업데이트

새 UI에 새롭게 도입된 터미널

베타

MPS 2024.1은 시각적 및 기능적으로 모두 향상되어 명령줄 작업의 효율을 높이는 새롭게 정비된 터미널을 선보입니다. 이번 업데이트에서는 블록 간 원활한 탐색, 명령어 완성, 명령어 기록에 대한 간편한 액세스 등의 확장된 기능 모음과 함께 명령어가 별개의 블록으로 분리되는 등 익숙한 도구가 새로운 모습으로 제공됩니다. 자세한 내용은 이 블로그 게시물에서 알아보세요.

전체 IDE 축소 옵션

이제 IDE 배율을 90%, 80% 혹은 70%로 축소할 수 있어 IDE 요소의 크기를 유연하게 키우거나 줄일 수 있습니다.

Gradle 버전 지원 업데이트

이 버전부터 MPS는 Gradle 4.5 이하 버전을 사용하는 프로젝트를 더 이상 지원하지 않으며, 지원되지 않는 Gradle 버전이 있는 프로젝트에 대해 Gradle 동기화를 수행하지 않습니다.

다수의 VCS 기능

Log(로그) 탭에서 검토 브랜치의 변경 사항을 표시하는 옵션

MPS 2024.1은 브랜치 관련 변경 사항에 초점을 둔 뷰를 제공하여 코드 검토 워크플로의 능률을 높입니다. GitHub, GitLab 및 Space의 경우 이제 Git 도구 창 내의 별도 Log(로그) 탭에서 특정 브랜치의 변경 사항을 확인할 수 있습니다. Pull Requests(풀 리퀘스트) 도구 창에서 브랜치 이름을 클릭하고 메뉴에서 Show in Git Log(Git 로그에 표시)를 선택하면 됩니다.

코드 검토 코멘트에 대한 감정 이모티콘 지원

MPS 2024.1에서는 이미 선택할 수 있는 이모티콘 모음과 함께 GitHub 풀 리퀘스트 및 GitLab 병합 요청에 대한 검토 코멘트에 감정 이모티콘을 사용할 수 있습니다.

푸시 알림에서 풀 리퀘스트/병합 요청 생성

이제 IDE는 변경 사항을 버전 관리 시스템에 성공적으로 푸시한 후, 하나의 알림에서 사용자에게 푸시에 성공했음을 알리고 풀 리퀘스트/병합 요청을 생성하기 위한 액션을 제안합니다.

보류 중인 GitHub 업데이트에 대한 시각적 표시기

코드 검토 워크플로 내에서 보류 중인 업데이트를 알려주는 시각적 표시기를 도입했습니다. 주의가 필요한 변경 사항이 있는 경우, 도구 창 아이콘에 점이 표시됩니다. 또한 보이지 않는 풀 리퀘스트는 파란색 점으로 표시되어 코드 검토 과정에서 업데이트를 누락하는 실수를 방지해 줍니다.

저장소에 대용량 파일 커밋 방지

대용량 파일로 인해 버전 관리 시스템이 이를 거부하는 것을 방지하기 위해 이러한 파일을 커밋하지 못하게 하고 제한 사항을 알리는 커밋 전 검사가 IDE에 포함되었습니다.

Git 도구 창의 History(기록) 탭에 적용된 브랜치 필터

Git 도구 창에서 Show all branches(모든 브랜치 표시) 버튼이 브랜치 필터로 대체되어, 지정된 브랜치 내의 파일에 대한 변경 사항을 검토할 수 있습니다. 또한 더 편리한 사용을 위해 툴바의 방향을 수평으로 배치했습니다.

Branches(브랜치) 팝업의 검색 개선

이제 Branches(브랜치) 팝업에서 액션과 저장소별로 검색 결과를 필터링하여 버전 관리 시스템 내에서 더 빠르고 정확하게 탐색할 수 있습니다.

Allow unrelated histories(관련되지 않은 기록 허용) 병합 옵션

Merge into(병합 대상) 대화상자의 드롭다운 메뉴에 Allow unrelated histories(관련되지 않은 기록 허용) 옵션이 생겼습니다. 이 옵션을 선택하면 공통된 기록이 없더라도 두 개의 브랜치를 병합할 수 있습니다.

비교에서 폴더 및 파일을 제외하는 옵션

이제 Diff 뷰어에서 관련 변경 사항에만 집중하기 위해 비교 중에 무시할 폴더와 파일을 지정할 수 있습니다. 비교 결과에 표시하지 않으려는 파일이나 폴더를 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 Exclude from results(결과에서 제외)를 선택하면 됩니다.

마이그레이션 가이드

주요 릴리스가 나올 때마다 JetBrains는 이전 버전의 MPS에서 마이그레이션하기 위한 지침을 준비하여 모든 부분이 원활하게 작동하도록 합니다. 업데이트된 마이그레이션 가이드에서 자세히 살펴보세요.