0

言語サーバーを作成していますが、現在、静的/プリロード済みの完了アイテムのリストがあります。この言語サーバーは、.scriptファイルで有効になります。同じディレクトリには.mapというファイルがあります(任意の拡張子、私はJSソースマップファイルを参照していません)。マップファイルは、(エンティティごとに)クラス名と名前のリストを含む単なるテキスト文書です。一般的なエントリは次のようになります。現在のファイルと同じディレクトリにある別のファイルを読み取る(VSコード)

// entity 237 
{ 
"classname" "func_static" 
"name" "func_static_237" 
"origin" "200 179.5 -181" 
"rotation" "0 -1 0 1 0 0 0 0 1" 
} 

私は(名前が完了項目のラベルであること、およびクラス名は、詳細である)補完リストにそれぞれの名前/クラス名のペアを追加しようとしています。ここで私がこれまで行ってきたことは次のとおりです:

残念ながら「classname」は1つしかないので、私は両方の行にマッチする正規表現を使用することにしました。次に、2つのキャプチャグループを使用して(名前用とクラス名用の2つ)、両方をアレイにプッシュします。次に、配列の各ペアを反復処理して、完了リストに追加します。

私はマップファイルから対応するスクリプトファイルに変数をプリロードしています(両方とも同じファイル名を持ち、同じディレクトリにあります)。

コードは次のようになります。

'use strict'; 

import * as path from 'path'; 
import * as vscode from 'vscode'; 
import * as fs from 'fs'; 

export function activate(context: vscode.ExtensionContext) { 

    ... 

    // each pair will go into this 
    var objArray = new Array; 

    function readTextFile() { 
     // load the map file 
     var text = fs.readFileSync(context.asAbsolutePath(path.join('donkey.map'))); 
     // match classname and name 
     var regex = /\"classname\"\s\"(\w+)\"(?:\r\n|[\r\n])\"name\"\s\"(\w+)\"/g 
     getMatches(text.toString(), regex); 
    } 

    function getMatches(string: string, regex: RegExp) { 
     var match; 
     while (match = regex.exec(string)){ 
      // capture group 1 = classname 
      // capture group 2 = name 
      // pushing name first because it's more important 
      objArray.push([match[2], match[1]]); 
     } 
    } 

    var loop1 = function (i: number) { 
     // create a new completion item 
     vscode.languages.registerCompletionItemProvider('quadscript', { 
      provideCompletionItems: function() { 
       var compItem = new vscode.CompletionItem(objArray[i][0], vscode.CompletionItemKind.Variable); 
       compItem.insertText = ("$" + objArray[i][0]); 
       compItem.detail = (objArray[i][1]); 
       return [ 
        compItem 
       ]; 
      } 
     }); 
    } 

    for (var i = 0; i < objArray.length; i++) { 
     loop1(i); 
    } 

    readTextFile(); 
} 

私は拡張開発ホストでの拡張をデバッグする場合、デバッグコンソールがこれを示しています

C:\プログラムファイル\マイクロソフトVSコード\ Code.exe --debugBrkPluginHost = 37535 --debugId = cfbf2c6d-c313-46fa-8c44-4e64f44eb97f --extensionDevelopmentPath = C:\ Users \ユーザーthefyrewire \ドキュメント\ VSCode \ quadscript

funcと入力すると、ファイルから正常に読み取られたことを示す期待通りに表示されます(c:\Users\thefyrewire\Documents\VSCode\quadscript\donkey.mapにあり、デバッグコンソールに表示されるextensionDevelopmentPathに対応)。

completion items successfully read from another file

私は次のc:\Users\thefyrewire\Documents\testに行って、ここdonkey.scriptdonkey.mapファイルを移動し、次いで包装や拡張機能をインストール。私がスクリプトファイルに入って完了リストを表示したとき、func_static項目はそこにはありませんでした。これは、拡張子がどこにインストールされているのかを私がファイルを移動したときに現在存在しない.vscode\extensions\<extension>\donkey.mapに読み込もうとしているからです。

私はマップファイルを読んでいた場所からパスを変更しようとしました。絶対パスをテストとして使用しました。

var text = fs.readFileSync("file:///C:/Users/thefyrewire/Documents/test/donkey.map"); 

デバッグする場合、私は、この返されます:

はENOENT:そのようなファイルやディレクトリはありません、開いた「C:\プログラムファイル\マイクロソフトVSコード\ファイル:\のC:\ Users \ユーザーthefyrewire \ Documents \ test \ donkey.map 'と入力します。

var text = fs.readFileSync("./donkey.map"); 

戻り値:

ENOENT:いいえそのようなファイルやディレクトリ、オープン「C:\プログラムファイル\マイクロソフトVS 閉じる はそうのような相対パスを使用して

を警告しますコード\ donkey.map ' 閉じる は、私が他の複数のFSの方法を試してみました

警告し、唯一のC:\Program Files\Microsoft VS Codeから読み始めるように見えます。

最後に私の質問:私の拡張機能が読み込まれるスクリプトファイルと同じディレクトリから動的に読み込むためには、どうすればよいですか?どんなアドバイスも大歓迎です、ありがとう!

編集:これは不明です。 'スクリプトファイル'によって、私はJSスクリプトファイルを意味するのではなく、カスタム言語(したがって言語サーバー)の一部です。

+1

を使用することができます。いつ.mapファイルを読む必要がありますか?補完項目を準備する前に読み込む必要がある場合は、まず 'TextDocumentPositionParams.textDocument'を使用してJSファイルパスを見つけてから、.mapファイルパスを計算する必要があります。とにかく、問題を小さなステップに分け、一つずつ征服してください。 –

答えて

0

あなたはほとんどの既存の言語のサーバーの実装は、別のプロセスを使用して、あなたが、activate` `でLSP・サーバ・コードを持って見ることが奇妙である__dirname

var fs = require('fs') 
var path = require('path') 

var text = fs.readFileSync(path.join(__dirname, donkey.map)); 
+0

ありがとうございます、私はこれを試したときに、jsファイルが実行された場所(拡張フォルダの中)と同じディレクトリにあるファイルを最初に試したときと同じように開こうとしました。私は、スクリプトファイルの現在のディレクトリを検出する方法を見つけようとしています(ユーザーが開くことができるため、異なるファイル間で変更されます) – thefyrewire

関連する問題