Eclipseを使用したメインフレーム・アプリケーション開発 - (3)ソース編集

# はじめに
ここではソース編集に関する基本的な機能を試してみたいと思います。IDz(IBM Developer for z/OS), Wazi Developer for Eclipseで提供されているもので、この辺りは両者とも同様です。ホストとの接続はRSEによる接続を前提としています。
当記事ではWazi Developer for Eclipse(V1.1.0)を使ってみた時の内容を記載します。

## 関連記事
[Eclipseを使用したメインフレーム・アプリケーション開発 - (1)概要](https://qiita.com/tomotagwork/items/0a6b273473333f849116)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (2)z/OS基本操作](https://qiita.com/tomotagwork/items/67e7faac4ec30198f1d3)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (3)ソース編集](https://qiita.com/tomotagwork/items/2db56a0981e8dac57a20)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/da039208be2f77c21285)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (5)デバッガーの利用](https://qiita.com/tomotagwork/items/93457c9ba11870a7c357)


# z/OS上のリソースを扱う場合の設定
リモート・システム・エクスプローラー・パースペクティブ、もしくはWazi Developer for Eclipseパースペクティブで操作します。

## z/OSファイル・システム・マッピング
オープン系の環境だと通常ファイルの拡張子を見てその中身の種別を判断しますが、z/OS上のデータセットには拡張子という概念がありません。そのため、PDSデータセット名やメンバー名を元に、こういう名前のデータセットに含まれるメンバーはCOBOLソースです、とか、こういうネーミングのメンバーはJCLです、といったようなマッピング情報を持たせることで属性を判断させることができます。

z/OSファイルシステム・ビューを開くとそのマッピング情報の一覧が確認できます。デフォルトでは以下の定義がされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/534e87d1-9fde-2af5-0144-6e548468d7db.png)

例えば、マッピング基準"**COBOL"の設定を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6cb2e9a2-f946-fec4-7922-fb5bf613e4f4.png)

これは、末尾にCOBOLとついたデータセット(USER.TEST.COBOL, AAA.TCOBOLなど)に含まれるメンバーは拡張子cblが付与される、すなわちCOBOLのソースであると認識されます。必要に応じてこのようなルールを追加、削除することができます。
このマッピング情報は接続先システムごとに用意する必要があります。

また、マッピング情報が定義されていないPDSに含まれるメンバーについては、"ファイルタイプの検出"機能で自動検出させることもできます。
参考: [Detecting the MVS™ file type](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=files-detecting-mvs-file-type)

## プロパティー・グループ
COBOLやPL/Iのソースを編集する際に、COPYやINCLUDEのメンバーをどこから探索するかやコンパイル・オプションをどうするか、といったコンパイルに関するプロパティを付与することができます。これらのプロパティを保持しておくものとして"プロパティー・グループ"という設定があります。事前にプロパティー・グループを作成し、COPY探索パスなどを設定しておいて、ソースをそのプロパティー・グループに関連付けておくと、ソース編集時にCOPYメンバーの参照や構文検査などが行えるようになります。
プロパティー・グループは接続先システムごとに用意する必要があり、PDSデータセットやメンバーの単位で関連付けすることができます。

例えば、Sandbox01という接続先にプロパティー・グループを作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/790be3c1-114b-d21e-638f-96abb530aad1.png)
言語毎に各種設定が行えますが、ここではCOBOLのCOPYBOOK解決用にSYSLIBのライブラリを追加しています。(SYSLIBの箇所にブランク区切りでCOPYBOOK探索先のデータセットを指定)

TAGUCHI.SAMPLE.COBOLを右クリックして、プロパティー・グループ - プロパティー・グループの関連付けを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a7f566ae-1e29-f2df-a913-ef545fa95e5a.png)

先ほど作成したプロパティー・グループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3e33bed7-2341-81f7-3e05-c51e4c7d3748.png)

これで、PDSデータセットとプロパティー・グループが関連付けられたので、このPDS配下のメンバーを編集する際は、このプロパティー・グループの属性に従ってCOPYBOOK探索が行われることになります。

# PC上(ローカル)のリソースを扱う場合の設定

## 拡張子とエディターの関連付け
リモート・システム・ビューでは、"ローカル"以下を辿るとPC上のファイルをエクスプローラー形式で辿れますのでそこから普通にPC上のファイルを参照できます。ファイルの拡張子に応じてエディターが関連付けられていますので、例えば.cblファイルを開くとCOBOL用のエディターで編集が可能です。

ウィンドウ-設定を開き、一般-エディター-ファイルの関連付け で、拡張子とエディターの関連が確認できます。カスタマイズも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3a733db3-5c0a-514d-d599-aa4949e7620a.png)

## z/OSローカル・プロジェクト/プロパティー・グループ
ローカルのファイルでも、プロパティー・グループを作成してそれを関連付けすることができます。ただし、ローカルのファイルの場合はそのままではプロパティー・グループに関連付けすることができません。
まず、ソースが含まれるディレクトリを"z/OSローカル・プロジェクト"として認識させる必要があります。
"Wazi Developer fro Eclipse"パースペクティブに切り替えて、z/OSプロジェクトビューで、新規 - z/OSローカル・プロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2e0e8b52-7159-1365-1789-bc45f271f948.png)

プロジェクト名とソースやCOPYBOOKが含まれる親のディレクトリを選択し、z/OSプロジェクトとして認識させます。この時、事前にプロパティー・グループを作成していればここでプロジェクト単位に関連付けさせることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2bb74409-1216-a4eb-c96b-096cbde9a525.png)

これで、指定したディレクトリ以下がz/OSプロジェクト・ビューに表示され、プロパティー・グループとの関連付けが行えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/939e615a-a08c-7b90-40ed-6b0d281dea76.png)

プロパティー・グループは、ローカルの場合もプロパティー・グループ・マネージャーから行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/37945504-5f96-eafc-3825-e6eeae9c9919.png)
ローカルの場合若干設定内容が異なります。上はCOBOLのCOPYBOOk探索パスをSYSLIBに設定している例です。

これを、z/OSローカル・プロジェクトとして認識したディレクトリやファイルに関連付けしてソースを修正すれば、この設定に応じたCOPYBOOK探索などが行われます。

# COBOLソースを編集してみる
各種設定が完了すれば、ソース編集時にアシスト機能が利用できるようになります。
基本リモートのファイルでもローカルのファイルでも違いはないので、ここではリモートのCOBOLソースでエディター上での各種機能を試してみます。

## 色分け/アウトライン表示
ソース種別としてCOBOLと識別されたメンバーを開くと、COBOLエディターで自動的に構文解析が行われ、キーワードに基づいた色分け表示や、アウトライン表示が行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/eb44d788-29fa-2add-d20c-14da68831f8e.png)

## COPYBOOK参照
COPYで参照しているメンバーにマウス・カーソルを当てると、関連付けされているプロパティー・グループの設定に基づいてCOPYBOOK探索が行われ、該当するCOPYBOOKの中身がポップアップで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6183d71e-1ea8-ae7d-b55f-5259d766d82b.png)

COPYBOOK名を右クリックしてそのメンバーを別エディターで開くこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/381c7d14-32de-ba4a-89a7-bc4702b0f958.png)

## Code候補表示
COBOLのステートメントや変数名を一部入力し、Ctrl+Spaceキーを押すとステートメントの候補が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/299ece4e-133d-0b6f-f40a-3129889e226e.png)

EXEC CICS などにも対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/585885a0-4167-feea-43f2-6898e3a212a9.png)

## リアルタイム構文検査
コードを編集するとリアルタイムに構文検査が行われて問題がある個所には警告マークがつきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/99605787-bacb-64fd-f5f1-4829730fcf30.png)

警告マークにマウス・カーソルを合わせるとエラーの内容を簡易表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1d581e5c-1d53-0d2b-5e81-6f36b8c1264e.png)

## 変数名の操作
本文中の変数名にマウス・カーソルを合わせると、その変数が定義されている構造がポップアップで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f1bece6b-99fb-a20e-77ef-0ba56878669a.png)

## 階層構造の把握
PERFORMで呼ばれるラベル名を右クリックして"実行階層を開く"を選択すると、実行階層ビューが開いて、そのラベルに関する階層構造が確認できます。
以下は、指定したラベルがどこから呼ばれるかを示したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b8f4b0e3-7368-66d5-c251-64c8513f315d.png)

以下は、指定したラベルから他のルーチン呼び出しの階層構造が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/08aeff69-11a6-e668-fefc-78092e8a577e.png)

## テンプレートの利用
ウィンドウ-設定を開き、COBOL-テンプレートで、よく使うコードの雛形を用意しておいてそれを利用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b5221ab0-aa4c-b809-711f-f4f5ec832627.png)

ソース中でCtrl+Spaceキーでテンプレートの候補を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/87a01197-c64a-a682-ec5a-efa5919442de.png)

# おわりに
他にもソース編集に関する便利なサポート機能が各種提供されています。ここで取り上げた機能は基本的なものでVSCodeでも同じような機能が提供されていますが、Eclipseベースのツールはソース編集に関するサポート機能はVSCodeに比べると豊富に提供されていると思います。