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

# はじめに
ここでは主にIBM Z Open Editor Extensionで提供されるソース編集の基本的な機能を試してみたいと思います。
IBM Z Open Editorが対応している言語は、COBOL, PL/I, ASM, JCL です。また、CICSやDb2にも対応しているのでEXEC CICSやEXEC SQLを含むソースも扱えます。

## 関連記事
[VSCodeを使用したメインフレーム・アプリケーション開発 - (1)概要](https://qiita.com/tomotagwork/items/085b91098fce3aabaeaf)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (2)z/OS基本操作](https://qiita.com/tomotagwork/items/9496dbc121cc5bf17b29)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (3)ソース編集](https://qiita.com/tomotagwork/items/f4008d1ead61e8a263ae)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/4bdd0b5a7284b5102d10)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (5)デバッガーの利用](https://qiita.com/tomotagwork/items/2ce806f5747bc72f9474)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (6)FTP経由での接続](https://qiita.com/tomotagwork/items/a2f82db16d18a8fd9d21)


# IBM Z Open Editor概要
IBM Z Open Editorは、エディター上でコーディングをサポートする機能を提供してくれるものです。分かりやすいものが、言語毎の構文を解釈して色分けしたりリアルタイムでの構文チェックしたりする機能です。
VSCodeはPC上で稼働するエディターですが、前の記事で紹介したようにZowe Explorerを使用するとz/OS上のリソースも直接扱うことができます(内部的にはローカルに転送してきてそれを編集することになりますが)。また、ローカル上のソースの編集も同様に行えますのでgitHubなどのソース・コードを管理するリポジトリからローカルにソースをcloneしてそれを編集する、といった利用方法も可能です。
以下、z/OS上のリソースを扱う場合とローカルのリソースを扱う場合についてそれぞれ記載します。

参考: [IBM Z Open Editor Documentation](https://ibm.github.io/zopeneditor-about/Docs/introduction.html)


# z/OS上のリソースを扱う場合の設定

VSCodeでは各種設定はメニューから ファイル - ユーザー設定 - 設定 を選択して表示される設定画面から行えます。各Extension用の設定もここから実施できます。IBM Z Open Editorの設定としては、ユーザー単位(User Preference)、ワークスペース単位(Workspace Preference)でそれぞれ設定できるので適宜選択して設定してください。

## デフォルト接続プロファイルの設定
参考: [MVS property groups using Zowe CLI Profiles](https://ibm.github.io/zopeneditor-about/Docs/setting_propertygroup.html#mvs-property-groups-using-zowe-cli-profiles)

z/OS上のリソースを扱う場合、前の記事で紹介したように、Zoweの画面から接続先プロファイルを選択してそこからPDSメンバーを開いて...というように明示的に接続プロファイル(接続先)を選択します。
その後ソースが開いた状態で、例えばCOBOLであればCOPYBOOKの解釈を行うのにCOPYBOOKメンバーを探索しにいきますが、この時使用される接続プロファイルをプロパティで設定しておく必要があります。
※ソース本体を開いた時のプロファイルが使われる訳ではありません(複数接続プロファイルが定義されている場合に暗黙的に使用されるプロファイルの順序は上の参考のリンク先参照)。
そのため、内部的に使用される接続プロファイルを、defaultCliProfileに設定しておきます。この例ではprof_Wazi01を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c6da692b-e646-5fb1-b51e-a6266b1089cb.png)
このプロパティは"ユーザー"単位でしか指定できません。そのため、接続先を複数切り替えてソース編集する必要がある場合は、その都度このプロパティを変更する必要があります。

## ファイルと言語の関連付け
参考: [Remote file associations](https://ibm.github.io/zopeneditor-about/Docs/setting_fileassociations.html#defining-include-file-associations)

IBM Z Open Editorでは言語としてCOBOL, PL/I, ASM, JCLをサポートしています。ローカルのファイルだと通常は拡張子を元にしてそのファイルが何の言語かを判断しますが、z/OS上のPDSメンバーには拡張子という概念が無いので、対象のメンバーが含まれるデータセット名から言語をマッピングすることができます。
データセット名と言語のマッピングは言語ごとに "設定"からZopeneditor > Datasets:xxx Datasets プロパティで指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/21e9145b-3841-71d2-c19a-a3a43b914527.png)

デフォルトで、以下の設定がされています。

- COBOL
    - .COBOL
    - .COB
    - .COBCOPY
    - .COPYBOOK
    - .COPY
- PL/I
    - .PL1
    - .PLI
    - .INC
    - .INCLUDE
- JCL
    - .JCL
- ASM
    - .ASM
    - .ASSEMBLE
    - .HLASM
    - .HLA

つまり、例えば TAGUCHI.COBOL(AAA) というメンバーがあったらそれはCOBOLのソースとみなしてSyntaxチェックを行い、TAGUCHI.JCL(AAA)というメンバーはJCLとみなしてSyntaxチェックが行われるということです。これはあくまでエディターを開いた時に自動的に判断するためのルールということで、明示的に言語を選択することも可能です。

例えば、TAGUCHI.SD.TEST以下にI01DLY01というCOBOLソースを配置したとします。このデータセット名はデフォルトのルールに含まれていないので、単なるプレーンテキストとして扱われ、Syntaxチェックは特に行われません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d8ab6baf-9fb7-e9f3-012b-6e6e1cf1958e.png)

画面右下に"プレーンテキスト"と記載されているので言語とマッピングされていないことが分かります。この"プレーンテキスト"をクリックすると"言語モードの選択"ができるので、ここからCOBOLを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/443a9573-86c1-0393-d301-efda964f399a.png)

すると、このソースはCOBOLであるとみなされてSyntaxチェックを行い、色分けされて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f872965d-24bf-d685-9d8b-c0228b858b9a.png)

データセットと言語の関連付けをしておくと、このような言語の判定を自動で行ってくれます。

## プロパティ・グループの設定
参考: [Setting property groups](https://ibm.github.io/zopeneditor-about/Docs/setting_propertygroup.html)

Property Groupsという設定でソース解釈における各種設定を行います。主にCOBOLのCOPY、PL/Iのincludeの探索先などを指定します。これはVSCodeのワークスペース単位に指定できるのでワークスペースを作成してそのワークスペースに対して設定を追加してみます。
※リモートのリソースを扱う場合ローカルの資源は使わないのでワークスペースはあんまり意味が無いのですが、設定情報を分けるという意味では有効です。

設定ウィンドウで、Zopeneditor: Propertygroups を検索すると、以下のような項目が表示されます。ワークスペースタブを選択し、"settings.jsonで編集"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b9cfa95-918c-d182-22a6-b151ad625876.png)

ワークスペース用の設定ファイルが開きますので、JSON形式で以下のような設定を行います。"zopeneditor.propertygroups"の中身を追記しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/083fad21-68c2-2098-727f-49b2d5e57887.png)

- **name**: 任意の名前(このpropertygroups内でユニークな名前)を指定します。
- **type**: mvsを指定すると以下syslibはz/OSのデータセットから探索します。この探索時、上のdefaultCliProfileで指定した接続先プロファイルが使用されます。
- **language**: 言語を指定します。
- **syslib**: COBOLのCOPYBOOK, PL/Iのincludeファイルを探索するライブラリを指定します。

CICS、および、MQをアクセスするCOBOLのソースを開発する想定で、ユーザー定義のCOPYBOOK、CICS提供のCOPYBOOK、MQ提供のCOPYBOOKが提供されるライブラリをそれぞれ指定しています。

例えば、上のSYSLIB指定に無いCOPYBOOKを指定したソースを開いた場合、以下のように波線がついて強調表示されます。COPYBOOKに含まれる変数も判断できないのでその変数を使用している部分もSyntaxチェックにひっかかってしまうことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7c083eb2-4885-477b-311d-0b2128a31c57.png)

SYSLIB以外にSyntaxチェックに影響するコンパイラ・オプションがある場合それを指定することもできます(COBOL: CURRENCY, PL/I: NOTなど)。その場合、langageで明示的に言語を指定する必要があります。
参考: [Setting compiler options](https://ibm.github.io/zopeneditor-about/Docs/setting_compiler_options.html)





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

## ファイルと言語の関連付け
参考: [Local file associations](https://ibm.github.io/zopeneditor-about/Docs/setting_fileassociations.html#local-file-associations)

### ソース本体の拡張子
ローカルのファイルの場合、基本的にファイル名の拡張子で言語を判断します。file.associationsというプロパティで、拡張子とそれに対応する言語のマッピングを行います。
デフォルトでは以下の設定がされています(大文字で指定されていますが、小文字のファイルでも認識されます)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b6ca2f2e-d374-1b0d-5723-1c44b5276009.png)

### COPYBOOK/INCLUDEファイルの拡張子
Include File Extensionsというプロパティで、COBOLソースのCOPY句で参照しているCOPYBOOKやPL/IのINCLUDE文で参照しているINCLUDEファイルの探索対象ファイルの拡張子を設定することができます。
デフォルトでは以下の設定がされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9b465387-38f6-9bd8-8f25-ef3495b8e727.png)

例えば、COBOLソースを開いた際に「COPY AAA」というステートメントがあった場合、後続のSYSLIBに指定されたディレクトリからAAA.cpyやAAA.copybookが探索されます。

## プロパティ・グループの設定
参考: [Setting property groups](https://ibm.github.io/zopeneditor-about/Docs/setting_propertygroup.html)

Property Groupsという設定でソース解釈における各種設定を行います。主にCOBOLのCOPY、PL/Iのincludeの探索先などを指定します。これはVSCodeのワークスペース単位に指定できるのでワークスペースを作成してそのワークスペースに対して設定を追加してみます。

設定ウィンドウで、Zopeneditor: Propertygroups を検索すると、以下のような項目が表示されます。ワークスペースタブを選択し、"setting.sjsonで編集"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b9cfa95-918c-d182-22a6-b151ad625876.png)

ワークスペース用の設定ファイルが開きますので、JSON形式で以下のような設定を行います。"zopeneditor.propertygroups"の中身を追記しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e07b0df2-0c04-f3b6-67fa-5e9ebe7f8bb1.png)

- **name**: 任意の名前(このpropertygroups内でユニークな名前)を指定します。
- **type**: localを指定すると以下syslibはPC上のディレクトリから探索します。
- **language**: 言語を指定します。
- **syslib**: COBOLのCOPYBOOK, PL/Iのincludeファイルを探索するディレクトリを指定します。

CICS、および、MQをアクセスするCOBOLのソースを開発する想定で、ユーザー定義のCOPYBOOK、CICS提供のCOPYBOOK、MQ提供のCOPYBOOKを格納したディレクトリをそれぞれ指定しています。



# COBOLソースを編集してみる

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

## 色分け/アウトライン表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/028ae15e-f854-b50c-3e43-fe2a6623be21.png)

## COPYBOOK参照

COPYで指定したメンバーにカーソルを合わせると、中身がポップアップで表示され確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/08baf253-34a6-7db3-229b-384c8f189779.png)

Ctrl+クリックでメンバーが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7c276ed1-4cdd-42c4-b99b-657034c3f19f.png)

## Code候補表示

COBOLのステートメントや変数名を一部入力すると、該当するコードの候補が表示されます。(表示されない場合はCtrl+スペース)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9d6d2b4a-08a0-2f4c-f95d-2a0f1ba8611c.png)

EXEC CICS などにも対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/885ba4dc-899c-5027-69fc-27a27d27e171.png)

## リアルタイム構文検査

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/81e9db89-9d47-2317-51e5-0058b9292f3d.png)

## 変数/パラグラフ名の操作

変数名やパラグラフ名を選択して右クリックし、"定義へ移動"、"参照へ移動"などを選択すると、その変数やパラグラフが定義されている箇所や参照している箇所へ移動することができます。
また、右クリック - "ピーク" - "定義をここに表示"/"参照をここに表示" を選択すると、その場所で定義/参照部分をポップアップで表示してくれます。("ピーク"というのは"覗く"という意味のPeekです)
以下、変数名から"ピーク" - "参照をここに表示" を選択した画面例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0d8ab6c3-1e12-1c12-0cf5-ca2f43a64f6f.png)


## Snippetの利用
参考:[Using code snippets](https://ibm.github.io/zopeneditor-about/Docs/snippets.html#using-code-snippets)
IBM Z Open Editorでは、よく使われる定型コードの雛形がいくつか提供されて、それをソース中に挿入することができます。
挿入したい行の1桁目にカーソルを合わせて、Ctrl + Shift + PでVSCodeのコマンドパレットを開き、Insert Snippetを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b1fcedb-9f32-5c01-0901-de7a4da840ba.png)

リストされるSnippetからここでは"COBOL CICS: Date/Time Handling"を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c1cc771a-4395-662f-f25a-edf2a387038f.png)

以下のコードが挿入されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5e819a39-1547-a2d7-b8fd-c3e70041e914.png)

# おわりに
ここまでは無償の範囲でできるので、何はともあれとりあえず使ってみるとよいと思います。細かい所は実際に使ってみないと分かりにくいので。