diff --git a/.gitignore b/.gitignore index 7664af9..5d9128d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules/ build/ vscode-mozuku/data/ +vscode-mozuku/out/ vscode-mozuku/bin/ vscode-mozuku/metadata.json dist/ diff --git a/README.md b/README.md index d8b73d1..7e33fa6 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,13 @@ MoZuku は、MeCab・CaboCha を活用した日本語文章の解析・校正を - CaboCha (オプション : 係り受け解析 [WIP] 用) - CURL - tree-sitter CLI (ビルド時) + +## ビルドとインストール + +```sh +cmake -S mozuku-lsp -B mozuku-lsp/build -DCMAKE_BUILD_TYPE=Release +cmake --build mozuku-lsp/build +cmake --install mozuku-lsp/build --prefix ~/.local # 環境によっては sudo が必要です +``` + +`cmake --install` の出力先は GNUInstallDirs に従い、通常は `/bin/mozuku-lsp` です。VS Code 拡張と Vim/Neovim プラグインは、`PATH` と標準的なインストール先、開発中の `build/install` を自動で探索します。 diff --git a/mozuku-lsp/CMakeLists.txt b/mozuku-lsp/CMakeLists.txt index f202851..aebda49 100644 --- a/mozuku-lsp/CMakeLists.txt +++ b/mozuku-lsp/CMakeLists.txt @@ -5,6 +5,8 @@ if(POLICY CMP0177) cmake_policy(SET CMP0177 NEW) endif() +include(GNUInstallDirs) + set(CMAKE_CXX_STANDARD 17) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -178,21 +180,8 @@ message(STATUS " MeCab: ${MECAB_FOUND}") message(STATUS " CaboCha: ${CABOCHA_FOUND}") message(STATUS " CURL: ${CURL_FOUND}") -set(VSCODE_EXTENSION_DIR "${CMAKE_SOURCE_DIR}/../vscode-mozuku") - -install(TARGETS mozuku-lsp - RUNTIME DESTINATION "${VSCODE_EXTENSION_DIR}/bin" -) - install(TARGETS mozuku-lsp - RUNTIME DESTINATION bin) - - -add_custom_target(package-extension - COMMAND ${CMAKE_COMMAND} --build . --target install - COMMENT "VS Code拡張をLSPサーバーと共にパッケージ化中 (システムライブラリが必要) " - DEPENDS mozuku-lsp -) + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") -message(STATUS "VS Code拡張のパッケージ先: ${VSCODE_EXTENSION_DIR}") +message(STATUS "mozuku-lsp は 'cmake --install' で ${CMAKE_INSTALL_BINDIR} にインストールされます") message(STATUS "注意: ターゲットシステムにMeCab/CaboCha/CURLライブラリのインストールが必要です") diff --git a/mozuku-lsp/third-party/tree-sitter-cpp b/mozuku-lsp/third-party/tree-sitter-cpp index 12bd6f7..8b5b49e 160000 --- a/mozuku-lsp/third-party/tree-sitter-cpp +++ b/mozuku-lsp/third-party/tree-sitter-cpp @@ -1 +1 @@ -Subproject commit 12bd6f7e96080d2e70ec51d4068f2f66120dde35 +Subproject commit 8b5b49eb196bec7040441bee33b2c9a4838d6967 diff --git a/vim-mozuku/README.md b/vim-mozuku/README.md index d2f6af6..3449564 100644 --- a/vim-mozuku/README.md +++ b/vim-mozuku/README.md @@ -1,3 +1,3 @@ # vim-mozuku -MoZuku LSP を Vim/Neovim で使うための軽量プラグインです。`vim-mozuku/` を runtimepath に追加することで有効化できます。 +MoZuku LSP を Vim/Neovim で使うための軽量プラグインです。`vim-mozuku/` を runtimepath に追加することで有効化できます。既定では `mozuku-lsp` を `PATH`、標準的なインストール先、開発中の `build/install` から探索します。 diff --git a/vim-mozuku/autoload/mozuku.vim b/vim-mozuku/autoload/mozuku.vim index 8bc6195..a321105 100644 --- a/vim-mozuku/autoload/mozuku.vim +++ b/vim-mozuku/autoload/mozuku.vim @@ -131,9 +131,94 @@ function! s:capitalize(word) abort return toupper(strpart(a:word, 0, 1)) . strpart(a:word, 1) endfunction +function! s:path_has_sep(path) abort + return a:path =~# '[/\\]' +endfunction + +function! s:is_windows() abort + return has('win32') || has('win64') +endfunction + +function! s:exe_name(command_name) abort + if s:is_windows() && a:command_name !~? '\.exe$' + return a:command_name . '.exe' + endif + return a:command_name +endfunction + +function! s:add_unique(list, value) abort + if empty(a:value) + return + endif + if index(a:list, a:value) < 0 + call add(a:list, a:value) + endif +endfunction + +function! s:repo_root() abort + return fnamemodify(expand(':p'), ':h:h:h') +endfunction + +function! s:resolve_explicit_path(path_value) abort + if empty(a:path_value) + return '' + endif + return fnamemodify(a:path_value, ':p') +endfunction + +function! s:command_candidates(command_name) abort + let l:candidates = [] + if empty(a:command_name) + return l:candidates + endif + + let l:exe = s:exe_name(a:command_name) + + for l:name in [a:command_name, l:exe] + let l:resolved = exepath(l:name) + if !empty(l:resolved) + call s:add_unique(l:candidates, l:resolved) + endif + endfor + + if exists('$HOME') + call s:add_unique(l:candidates, expand('~/.local/bin/' . l:exe)) + call s:add_unique(l:candidates, expand('~/bin/' . l:exe)) + endif + + if has('macunix') + for l:dir in ['/usr/local/bin', '/usr/bin', '/opt/homebrew/bin', '/opt/local/bin'] + call s:add_unique(l:candidates, l:dir . '/' . l:exe) + endfor + elseif has('unix') + for l:dir in ['/usr/local/bin', '/usr/bin'] + call s:add_unique(l:candidates, l:dir . '/' . l:exe) + endfor + endif + + if s:is_windows() + for l:base in [expand('$LOCALAPPDATA'), expand('$ProgramFiles'), expand('$ProgramFiles(x86)')] + if empty(l:base) + continue + endif + for l:name in ['MoZuku', 'mozuku-lsp'] + call s:add_unique(l:candidates, l:base . '/' . l:name . '/bin/' . l:exe) + endfor + endfor + endif + + let l:repo_root = s:repo_root() + call s:add_unique(l:candidates, l:repo_root . '/build/install/bin/' . l:exe) + call s:add_unique(l:candidates, l:repo_root . '/build/' . l:exe) + call s:add_unique(l:candidates, l:repo_root . '/mozuku-lsp/build/install/bin/' . l:exe) + call s:add_unique(l:candidates, l:repo_root . '/mozuku-lsp/build/' . l:exe) + + return l:candidates +endfunction + function! mozuku#config() abort return { - \ 'server_path': g:mozuku_server_path, + \ 'server_path': mozuku#server_cmd(), \ 'init_options': mozuku#build_init_options(), \ } endfunction @@ -261,9 +346,37 @@ endfunction function! mozuku#server_cmd() abort if type(g:mozuku_server_path) == v:t_list - return g:mozuku_server_path + return copy(g:mozuku_server_path) + endif + + let l:configured = trim(g:mozuku_server_path) + if !empty(l:configured) && s:path_has_sep(l:configured) + return [s:resolve_explicit_path(l:configured)] + endif + + let l:env = exists('$MOZUKU_LSP') ? trim($MOZUKU_LSP) : '' + if !empty(l:env) && s:path_has_sep(l:env) + return [s:resolve_explicit_path(l:env)] + endif + + for l:command_name in [l:configured, l:env, 'mozuku-lsp'] + if empty(l:command_name) + continue + endif + for l:candidate in s:command_candidates(l:command_name) + if executable(l:candidate) + return [fnamemodify(l:candidate, ':p')] + endif + endfor + endfor + + if !empty(l:configured) + return [l:configured] + endif + if !empty(l:env) + return [l:env] endif - return [g:mozuku_server_path] + return ['mozuku-lsp'] endfunction function! mozuku#vim_on_comment(server, payload) abort diff --git a/vscode-mozuku/README.md b/vscode-mozuku/README.md index 347c799..f25f7bd 100644 --- a/vscode-mozuku/README.md +++ b/vscode-mozuku/README.md @@ -2,6 +2,8 @@ Visual Studio Code 拡張機能 MoZuku は、日本語テキストに対して MeCab と CaboCha を使用したセマンティック解析と診断を提供する日本語言語サーバーです。 +既定では `mozuku-lsp` コマンド、`PATH`、標準的なインストール先を探索して起動します。ローカルでビルドする場合は、`mozuku-lsp` を `cmake --install` で `bin` 配下に配置するか、`mozuku.serverPath` で明示してください。 + ## LICENSE このプロジェクトと実装は AGPL-3.0 ライセンスの下でライセンスされています。詳細については、[LICENSE](./LICENSE) ファイルを参照してください。 diff --git a/vscode-mozuku/build-lsp.js b/vscode-mozuku/build-lsp.js index 1af227b..6706a78 100755 --- a/vscode-mozuku/build-lsp.js +++ b/vscode-mozuku/build-lsp.js @@ -2,7 +2,7 @@ const fs = require("fs"); const path = require("path"); -const { execSync } = require("child_process"); +const { execFileSync } = require("child_process"); const isWindows = process.platform === "win32"; const isLinux = process.platform === "linux"; @@ -43,39 +43,36 @@ function ensureDir(dirPath) { } } -function buildMoZuKuBinary(lspSourceDir) { +function runCMake(args, cwd) { + execFileSync("cmake", args, { + stdio: "inherit", + cwd, + }); +} + +function buildMoZuKuBinary(lspSourceDir, installPrefix) { log("Building LSP server..."); try { - // Change to LSP source directory - process.chdir(lspSourceDir); - - // Configure and build - if (!fs.existsSync("build")) { + if (!fs.existsSync(path.join(lspSourceDir, "build"))) { log("Creating build directory..."); - fs.mkdirSync("build"); + fs.mkdirSync(path.join(lspSourceDir, "build"), { recursive: true }); } - // Configure CMake log("Configuring with CMake..."); - execSync("cmake -B build -DCMAKE_BUILD_TYPE=Release", { - stdio: "inherit", - cwd: lspSourceDir, - }); + runCMake(["-B", "build", "-DCMAKE_BUILD_TYPE=Release"], lspSourceDir); - // Build the project log("Building with CMake..."); - execSync("cmake --build build -j 4", { - stdio: "inherit", - cwd: lspSourceDir, - }); - - // Package extension using CMake install target - log("Packaging extension with CMake install target..."); - execSync("cmake --build build --target package-extension", { - stdio: "inherit", - cwd: lspSourceDir, - }); + runCMake( + ["--build", "build", "--config", "Release", "--parallel", "4"], + lspSourceDir, + ); + + log(`Installing with CMake into: ${installPrefix}`); + runCMake( + ["--install", "build", "--config", "Release", "--prefix", installPrefix], + lspSourceDir, + ); } catch (error) { log(`Build failed: ${error.message}`); throw error; @@ -107,6 +104,7 @@ function buildForCurrentPlatform() { const lspSourceDir = path.join(__dirname, "..", "mozuku-lsp"); const binDir = path.join(__dirname, "bin"); + const installPrefix = __dirname; // Clean previous build if (fs.existsSync(binDir)) { @@ -119,32 +117,21 @@ function buildForCurrentPlatform() { // Nixによるビルド成果物がない場合はビルドを行う if (fs.existsSync(path.join(__dirname, "..", "result", "bin"))) { - + const exeName = + currentTarget.platform === "win32" ? "mozuku-lsp.exe" : "mozuku-lsp"; + const nixExecutable = path.join(__dirname, "..", "result", "bin", exeName); + const targetExecutable = path.join(binDir, exeName); + log(`Copying Nix executable: ${nixExecutable} -> ${targetExecutable}`); + fs.copyFileSync(nixExecutable, targetExecutable); } else { - buildMoZuKuBinary(lspSourceDir) + buildMoZuKuBinary(lspSourceDir, installPrefix); } - // Copy the built executable - const exeName = currentTarget.platform === "win32" - ? "mozuku-lsp.exe" - : "mozuku-lsp"; - const builtExecutable = path.join(lspSourceDir, "build", exeName); + const exeName = + currentTarget.platform === "win32" ? "mozuku-lsp.exe" : "mozuku-lsp"; const targetExecutable = path.join(binDir, exeName); - - if (!fs.existsSync(builtExecutable)) { - // Try alternative build location - const altExecutable = path.join(lspSourceDir, exeName); - if (fs.existsSync(altExecutable)) { - log(`Copying executable from alternative location: ${altExecutable}`); - fs.copyFileSync(altExecutable, targetExecutable); - } else { - throw new Error( - `Built executable not found at: ${builtExecutable} or ${altExecutable}`, - ); - } - } else { - log(`Copying executable: ${builtExecutable} -> ${targetExecutable}`); - fs.copyFileSync(builtExecutable, targetExecutable); + if (!fs.existsSync(targetExecutable)) { + throw new Error(`Installed executable not found at: ${targetExecutable}`); } // Make executable on Unix-like systems diff --git a/vscode-mozuku/out/client.js b/vscode-mozuku/out/client.js deleted file mode 100644 index f65b5f6..0000000 --- a/vscode-mozuku/out/client.js +++ /dev/null @@ -1,385 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.startClient = startClient; -const vscode = __importStar(require("vscode")); -const fs = __importStar(require("fs")); -const path = __importStar(require("path")); -const node_1 = require("vscode-languageclient/node"); -const supportedLanguages = [ - 'japanese', - 'c', - 'cpp', - 'html', - 'python', - 'javascript', - 'javascriptreact', - 'typescript', - 'typescriptreact', - 'rust', - 'html', - 'latex', -]; -/** - * LSPクライアントを起動し、設定を初期化 - * @param ctx 拡張機能コンテキスト - * @param serverPath サーバーバイナリのパス - * @returns 起動されたLanguageClientインスタンス - */ -async function startClient(ctx, serverPath) { - // 開発モード時のみデバッグログを有効化 - const isDebug = process.env.VSCODE_DEBUG_MODE === 'true' || ctx.extensionMode === vscode.ExtensionMode.Development; - // サーバーパスを解決 - const resolved = resolveServerPath(ctx, serverPath); - console.log('[MoZuku] 最終的に解決されたサーバーパス:', resolved); - // サーバーバイナリの存在チェック - if (!fs.existsSync(resolved)) { - const msg = `MoZuku LSPサーバーが見つかりません: ${resolved}。先にLSPサーバーをビルドしてください。`; - console.error('[MoZuku]', msg); - vscode.window.showErrorMessage(msg); - throw new Error(msg); - } - // サーバー起動オプションの設定 - const serverOptions = { - run: { - command: resolved, - transport: node_1.TransportKind.stdio, - options: { env: isDebug ? { ...process.env, MOZUKU_DEBUG: '1' } : process.env } - }, - debug: { - command: resolved, - transport: node_1.TransportKind.stdio, - options: { env: { ...process.env, MOZUKU_DEBUG: '1' } } - }, - }; - // LSP初期化用の設定を取得 - const config = vscode.workspace.getConfiguration('mozuku'); - const initOptions = { - mozuku: { - mecab: { - dicdir: config.get('mecab.dicdir', ''), - charset: config.get('mecab.charset', 'UTF-8') - }, - analysis: { - enableCaboCha: config.get('analysis.enableCaboCha', true), - grammarCheck: config.get('analysis.grammarCheck', true), - minJapaneseRatio: config.get('analysis.minJapaneseRatio', 0.1), - warningMinSeverity: config.get('analysis.warningMinSeverity', 2), - warnings: { - particleDuplicate: config.get('analysis.warnings.particleDuplicate', true), - particleSequence: config.get('analysis.warnings.particleSequence', true), - particleMismatch: config.get('analysis.warnings.particleMismatch', true), - sentenceStructure: config.get('analysis.warnings.sentenceStructure', false), - styleConsistency: config.get('analysis.warnings.styleConsistency', false), - redundancy: config.get('analysis.warnings.redundancy', false) - } - } - } - }; - if (isDebug) { - console.log('[MoZuku] LSP初期化オプション:', JSON.stringify(initOptions, null, 2)); - } - // クライアントオプションの設定 - const documentSelector = [ - ...supportedLanguages.map((language) => ({ language })), - { scheme: 'file', pattern: '**/*.ja.txt' }, - { scheme: 'file', pattern: '**/*.ja.md' }, - ]; - const clientOptions = { - documentSelector, - synchronize: { - fileEvents: vscode.workspace.createFileSystemWatcher('**/*'), - }, - initializationOptions: initOptions, - middleware: {}, - }; - // Language Clientインスタンスを作成 - const client = new node_1.LanguageClient('mozuku', 'MoZuku LSP', serverOptions, clientOptions); - const semanticHighlights = new Map(); - const commentHighlights = new Map(); - const contentHighlights = new Map(); - const semanticColors = { - noun: '#c8c8c8', - verb: '#569cd6', - adjective: '#4fc1ff', - adverb: '#9cdcfe', - particle: '#d16969', - aux: '#87ceeb', - conjunction: '#d7ba7d', - symbol: '#808080', - interj: '#b5cea8', - prefix: '#c8c8c8', - suffix: '#c8c8c8', - unknown: '#aaaaaa', - }; - const semanticDecorationTypes = new Map(); - const commentDecorationType = vscode.window.createTextEditorDecorationType({ - color: '#f59e0b', - }); - const contentDecorationType = vscode.window.createTextEditorDecorationType({}); - ctx.subscriptions.push(commentDecorationType, contentDecorationType); - const getSemanticDecorationType = (tokenType) => { - if (!semanticDecorationTypes.has(tokenType)) { - const color = semanticColors[tokenType] ?? '#cccccc'; - const decoration = vscode.window.createTextEditorDecorationType({ - color, - }); - semanticDecorationTypes.set(tokenType, decoration); - ctx.subscriptions.push(decoration); - } - return semanticDecorationTypes.get(tokenType); - }; - const applyDecorationsToEditor = (editor) => { - if (!editor) { - return; - } - const uri = editor.document.uri.toString(); - const semanticByType = semanticHighlights.get(uri); - if (semanticByType) { - for (const [tokenType, ranges] of semanticByType) { - const decoration = getSemanticDecorationType(tokenType); - editor.setDecorations(decoration, ranges); - } - } - for (const [tokenType, decoration] of semanticDecorationTypes) { - if (!semanticByType || !semanticByType.has(tokenType)) { - editor.setDecorations(decoration, []); - } - } - const commentRanges = commentHighlights.get(uri) ?? []; - editor.setDecorations(commentDecorationType, commentRanges); - const contentRanges = contentHighlights.get(uri) ?? []; - const hasSemantic = semanticByType && semanticByType.size > 0; - if (contentRanges.length > 0 && !hasSemantic) { - editor.setDecorations(contentDecorationType, contentRanges); - } - else { - editor.setDecorations(contentDecorationType, []); - } - }; - const applyDecorationsForUri = (uri) => { - for (const editor of vscode.window.visibleTextEditors) { - if (editor.document.uri.toString() === uri) { - applyDecorationsToEditor(editor); - } - } - }; - const applyDecorationsToVisibleEditors = () => { - for (const editor of vscode.window.visibleTextEditors) { - applyDecorationsToEditor(editor); - } - }; - // クライアント状態変化のハンドリング - client.onDidChangeState((event) => { - if (isDebug) { - console.log(`[MoZuku] クライアント状態変更: ${node_1.State[event.oldState]} -> ${node_1.State[event.newState]}`); - } - if (event.newState === node_1.State.Running) { - console.log('[MoZuku] LSPクライアントが起動しました'); - } - else if (event.newState === node_1.State.Stopped) { - console.error('[MoZuku] LSPクライアントが停止しました'); - if (event.oldState === node_1.State.Running) { - vscode.window.showErrorMessage('MoZuku LSPサーバーが予期せず停止しました。サーバー実行ファイルを確認してください。'); - } - } - }); - client.onNotification('mozuku/commentHighlights', (payload) => { - const { uri, ranges = [] } = payload; - const vsRanges = ranges.map((r) => { - const start = new vscode.Position(r.start.line, r.start.character); - const end = new vscode.Position(r.end.line, r.end.character); - return new vscode.Range(start, end); - }); - if (vsRanges.length === 0) { - commentHighlights.delete(uri); - } - else { - commentHighlights.set(uri, vsRanges); - } - applyDecorationsForUri(uri); - }); - client.onNotification('mozuku/contentHighlights', (payload) => { - const { uri, ranges = [] } = payload; - const vsRanges = ranges.map((r) => { - const start = new vscode.Position(r.start.line, r.start.character); - const end = new vscode.Position(r.end.line, r.end.character); - return new vscode.Range(start, end); - }); - if (vsRanges.length === 0) { - contentHighlights.delete(uri); - } - else { - contentHighlights.set(uri, vsRanges); - } - applyDecorationsForUri(uri); - }); - client.onNotification('mozuku/semanticHighlights', (payload) => { - const { uri, tokens = [] } = payload; - if (tokens.length === 0) { - semanticHighlights.delete(uri); - applyDecorationsForUri(uri); - return; - } - const perType = new Map(); - for (const token of tokens) { - const start = new vscode.Position(token.range.start.line, token.range.start.character); - const end = new vscode.Position(token.range.end.line, token.range.end.character); - const range = new vscode.Range(start, end); - const decoration = getSemanticDecorationType(token.type); - if (!perType.has(token.type)) { - perType.set(token.type, []); - } - perType.get(token.type).push(range); - // Ensure decoration is kept alive - void decoration; - } - semanticHighlights.set(uri, perType); - applyDecorationsForUri(uri); - }); - // デバッグ用にサーバー出力を表示 - if (isDebug) { - client.outputChannel.show(); - console.log('[MoZuku] デバッグのためLSPクライアント出力チャンネルを表示'); - } - ctx.subscriptions.push(client); - // クライアントを起動 - try { - await client.start(); - if (isDebug) { - console.log('[MoZuku] LSPクライアントの起動に成功しました'); - } - applyDecorationsToVisibleEditors(); - // デバッグ用のドキュメントイベントリスナーを追加 - const openDisposable = vscode.workspace.onDidOpenTextDocument((doc) => { - console.log('[MoZuku] ドキュメントを開きました:', { - uri: doc.uri.toString(), - languageId: doc.languageId, - fileName: doc.fileName - }); - applyDecorationsForUri(doc.uri.toString()); - }); - const activeEditorDisposable = vscode.window.onDidChangeActiveTextEditor((editor) => { - if (editor) { - console.log('[MoZuku] アクティブエディタが変更されました:', { - uri: editor.document.uri.toString(), - languageId: editor.document.languageId, - fileName: editor.document.fileName - }); - } - applyDecorationsToEditor(editor ?? undefined); - }); - const visibleEditorsDisposable = vscode.window.onDidChangeVisibleTextEditors(() => { - applyDecorationsToVisibleEditors(); - }); - const closeDisposable = vscode.workspace.onDidCloseTextDocument((doc) => { - const uri = doc.uri.toString(); - semanticHighlights.delete(uri); - commentHighlights.delete(uri); - contentHighlights.delete(uri); - applyDecorationsForUri(uri); - }); - ctx.subscriptions.push(openDisposable, activeEditorDisposable, visibleEditorsDisposable, closeDisposable); - } - catch (error) { - console.error('[MoZuku] LSPクライアントの起動に失敗しました:', error); - vscode.window.showErrorMessage(`MoZuku LSPの起動に失敗: ${error}`); - throw error; - } - return client; -} -/** - * サーバーバイナリのパスを複数の候補から解決 - * @param ctx 拡張機能コンテキスト - * @param configured ユーザー設定のパス - * @returns 解決されたサーバーバイナリの絶対パス - */ -function resolveServerPath(ctx, configured) { - const isWindows = process.platform === 'win32'; - const exeName = isWindows ? 'mozuku-lsp.exe' : 'mozuku-lsp'; - // 診断のため現在はデバッグログを常に有効化 - const isDebug = true; - if (isDebug) { - console.log('[MoZuku] サーバーパスを解決中:', { - configured, - extensionPath: ctx.extensionUri.fsPath, - workspaceFolders: vscode.workspace.workspaceFolders?.map(f => f.uri.fsPath) - }); - } - const candidates = []; - // 1) 設定されたパスが存在する場合はそれを使用 - if (configured && hasPathSep(configured)) { - candidates.push({ type: '設定済み', path: configured }); - } - // 2) 拡張機能にパッケージされたバイナリ: /bin/mozuku-lsp(新統一構造) - const primaryPackaged = vscode.Uri.joinPath(ctx.extensionUri, 'bin', exeName).fsPath; - candidates.push({ type: 'パッケージ済み-統一版', path: primaryPackaged }); - // 2b) 旧拡張機能パッケージバイナリへのフォールバック: /server/bin/-/mozuku-lsp - const plat = process.platform; - const arch = process.arch; - const legacyPackaged = vscode.Uri.joinPath(ctx.extensionUri, 'server', 'bin', `${plat}-${arch}`, exeName).fsPath; - candidates.push({ type: 'パッケージ済み-レガシー', path: legacyPackaged }); - // 3) ワークスペース相対パスを試行(ワークスペースフォルダが存在する場合) - const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; - if (workspaceRoot) { - candidates.push({ type: 'ワークスペース-build', path: path.join(workspaceRoot, 'build', exeName) }); - candidates.push({ type: 'ワークスペース-lsp', path: path.join(workspaceRoot, 'mozuku-lsp', 'build', exeName) }); - } - // 4) 開発環境用フォールバック - candidates.push({ type: '開発-ルート', path: path.join(ctx.extensionUri.fsPath, '..', 'build', exeName) }); - candidates.push({ type: '開発-兄弟', path: path.join(ctx.extensionUri.fsPath, '..', 'mozuku-lsp', 'build', exeName) }); - // 候補を順番にチェック - for (const candidate of candidates) { - if (fs.existsSync(candidate.path)) { - if (isDebug) { - console.log(`[MoZuku] ${candidate.type}パスを使用:`, candidate.path); - } - return candidate.path; - } - else if (isDebug) { - console.log(`[MoZuku] ${candidate.type}パスが見つかりません:`, candidate.path); - } - } - // 5) 最終手段: PATH上に存在することを期待 - const fallback = configured || exeName; - if (isDebug) { - console.log('[MoZuku] フォールバックパスを使用:', fallback); - } - return fallback; -} -function hasPathSep(p) { - return p.includes('/') || p.includes('\\'); -} -//# sourceMappingURL=client.js.map \ No newline at end of file diff --git a/vscode-mozuku/out/client.js.map b/vscode-mozuku/out/client.js.map deleted file mode 100644 index b63432d..0000000 --- a/vscode-mozuku/out/client.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vscode-mozuku/out/extension.js b/vscode-mozuku/out/extension.js deleted file mode 100644 index f64bb8a..0000000 --- a/vscode-mozuku/out/extension.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.activate = activate; -exports.deactivate = deactivate; -// VS Code拡張APIを使用したMoZuku拡張のエントリポイント -const vscode = __importStar(require("vscode")); -const client_1 = require("./client"); -/** - * 拡張機能のアクティベーション処理 - * 初回コマンド実行時またはstartupFinished時に呼び出される - */ -async function activate(context) { - console.log('[MoZuku] 拡張機能をアクティベート中...'); - // LSPクライアントを起動 - const serverPath = vscode.workspace.getConfiguration('mozuku').get('serverPath') || - 'mozuku-lsp'; - console.log('[MoZuku] LSPクライアント起動: サーバーパス =', serverPath); - const client = await (0, client_1.startClient)(context, serverPath); - console.log('[MoZuku] 拡張機能のアクティベートが完了しました'); - // デモコマンドを保持(将来削除予定) - const disposable = vscode.commands.registerCommand('mozuku.helloWorld', () => { - vscode.window.showInformationMessage('MoZukuからこんにちは!'); - }); - context.subscriptions.push(disposable); -} -/** - * 拡張機能の非アクティベーション処理 - */ -function deactivate() { - // クリーンアップ処理(必要に応じて追加) -} -//# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/vscode-mozuku/out/extension.js.map b/vscode-mozuku/out/extension.js.map deleted file mode 100644 index d1b0a8e..0000000 --- a/vscode-mozuku/out/extension.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,4BAiBC;AAKD,gCAEC;AAhCD,qCAAqC;AACrC,+CAAiC;AACjC,qCAAuC;AAEvC;;;GAGG;AACI,KAAK,UAAU,QAAQ,CAAC,OAAgC;IAC7D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,eAAe;IACf,MAAM,UAAU,GACd,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAS,YAAY,CAAC;QACrE,YAAY,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAW,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,oBAAoB;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,sBAAsB;AACxB,CAAC"} \ No newline at end of file diff --git a/vscode-mozuku/out/test/extension.test.js b/vscode-mozuku/out/test/extension.test.js deleted file mode 100644 index 4951e6f..0000000 --- a/vscode-mozuku/out/test/extension.test.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -const assert = __importStar(require("assert")); -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -const vscode = __importStar(require("vscode")); -// import * as myExtension from '../../extension'; -suite('Extension Test Suite', () => { - vscode.window.showInformationMessage('Start all tests.'); - test('Sample test', () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)); - assert.strictEqual(-1, [1, 2, 3].indexOf(0)); - }); -}); -//# sourceMappingURL=extension.test.js.map \ No newline at end of file diff --git a/vscode-mozuku/out/test/extension.test.js.map b/vscode-mozuku/out/test/extension.test.js.map deleted file mode 100644 index e115fba..0000000 --- a/vscode-mozuku/out/test/extension.test.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"extension.test.js","sourceRoot":"","sources":["../../src/test/extension.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAEjC,0DAA0D;AAC1D,8CAA8C;AAC9C,+CAAiC;AACjC,kDAAkD;AAElD,KAAK,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAClC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IAEzD,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/vscode-mozuku/package.json b/vscode-mozuku/package.json index 13b5496..d21a1d4 100644 --- a/vscode-mozuku/package.json +++ b/vscode-mozuku/package.json @@ -54,8 +54,8 @@ "properties": { "mozuku.serverPath": { "type": "string", - "default": "./bin/mozuku-lsp", - "description": "Path to the MoZuku LSP server binary (relative to extension root)" + "default": "mozuku-lsp", + "description": "Command or path to the MoZuku LSP server binary. If not found directly, PATH and standard install locations are searched." }, "mozuku.mecab.dicdir": { "type": "string", diff --git a/vscode-mozuku/src/client.ts b/vscode-mozuku/src/client.ts index a0628e2..a0babb3 100644 --- a/vscode-mozuku/src/client.ts +++ b/vscode-mozuku/src/client.ts @@ -1,13 +1,13 @@ -import * as vscode from 'vscode'; -import * as fs from 'fs'; -import * as path from 'path'; +import * as vscode from "vscode"; +import * as fs from "fs"; +import * as path from "path"; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, State, -} from 'vscode-languageclient/node'; +} from "vscode-languageclient/node"; type CommentHighlightMessage = { uri: string; @@ -38,32 +38,34 @@ type SemanticHighlightMessage = { }; const supportedLanguages = [ - 'japanese', - 'c', - 'cpp', - 'html', - 'python', - 'javascript', - 'javascriptreact', - 'typescript', - 'typescriptreact', - 'rust', - 'html', - 'latex', + "japanese", + "c", + "cpp", + "html", + "python", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "rust", + "html", + "latex", ]; export async function startClient( ctx: vscode.ExtensionContext, - serverPath: string + serverPath: string, ) { - const isDebug = process.env.VSCODE_DEBUG_MODE === 'true' || ctx.extensionMode === vscode.ExtensionMode.Development; + const isDebug = + process.env.VSCODE_DEBUG_MODE === "true" || + ctx.extensionMode === vscode.ExtensionMode.Development; const resolved = resolveServerPath(ctx, serverPath); - console.log('[MoZuku] 最終的に解決されたサーバーパス:', resolved); + console.log("[MoZuku] 最終的に解決されたサーバーパス:", resolved); if (!fs.existsSync(resolved)) { const msg = `MoZuku LSPサーバーが見つかりません: ${resolved}。先にLSPサーバーをビルドしてください。`; - console.error('[MoZuku]', msg); + console.error("[MoZuku]", msg); vscode.window.showErrorMessage(msg); throw new Error(msg); } @@ -72,76 +74,126 @@ export async function startClient( run: { command: resolved, transport: TransportKind.stdio, - options: { env: isDebug ? { ...process.env, MOZUKU_DEBUG: '1' } : process.env } + options: { + env: isDebug ? { ...process.env, MOZUKU_DEBUG: "1" } : process.env, + }, }, debug: { command: resolved, transport: TransportKind.stdio, - options: { env: { ...process.env, MOZUKU_DEBUG: '1' } } + options: { env: { ...process.env, MOZUKU_DEBUG: "1" } }, }, }; - const config = vscode.workspace.getConfiguration('mozuku'); + const config = vscode.workspace.getConfiguration("mozuku"); const initOptions = { mozuku: { mecab: { - dicdir: config.get('mecab.dicdir', ''), - charset: config.get('mecab.charset', 'UTF-8') + dicdir: config.get("mecab.dicdir", ""), + charset: config.get("mecab.charset", "UTF-8"), }, analysis: { - enableCaboCha: config.get('analysis.enableCaboCha', true), - grammarCheck: config.get('analysis.grammarCheck', true), - minJapaneseRatio: config.get('analysis.minJapaneseRatio', 0.1), - warningMinSeverity: config.get('analysis.warningMinSeverity', 2), + enableCaboCha: config.get("analysis.enableCaboCha", true), + grammarCheck: config.get("analysis.grammarCheck", true), + minJapaneseRatio: config.get("analysis.minJapaneseRatio", 0.1), + warningMinSeverity: config.get( + "analysis.warningMinSeverity", + 2, + ), warnings: { - particleDuplicate: config.get('analysis.warnings.particleDuplicate', true), - particleSequence: config.get('analysis.warnings.particleSequence', true), - particleMismatch: config.get('analysis.warnings.particleMismatch', true), - sentenceStructure: config.get('analysis.warnings.sentenceStructure', false), - styleConsistency: config.get('analysis.warnings.styleConsistency', false), - redundancy: config.get('analysis.warnings.redundancy', false) + particleDuplicate: config.get( + "analysis.warnings.particleDuplicate", + true, + ), + particleSequence: config.get( + "analysis.warnings.particleSequence", + true, + ), + particleMismatch: config.get( + "analysis.warnings.particleMismatch", + true, + ), + sentenceStructure: config.get( + "analysis.warnings.sentenceStructure", + false, + ), + styleConsistency: config.get( + "analysis.warnings.styleConsistency", + false, + ), + redundancy: config.get( + "analysis.warnings.redundancy", + false, + ), }, rules: { - commaLimit: config.get('analysis.rules.commaLimit', true), - adversativeGa: config.get('analysis.rules.adversativeGa', true), - duplicateParticleSurface: config.get('analysis.rules.duplicateParticleSurface', true), - adjacentParticles: config.get('analysis.rules.adjacentParticles', true), - conjunctionRepeat: config.get('analysis.rules.conjunctionRepeat', true), - raDropping: config.get('analysis.rules.raDropping', true), - commaLimitMax: config.get('analysis.rules.commaLimitMax', 3), - adversativeGaMax: config.get('analysis.rules.adversativeGaMax', 1), - duplicateParticleSurfaceMaxRepeat: config.get('analysis.rules.duplicateParticleSurfaceMaxRepeat', 1), - adjacentParticlesMaxRepeat: config.get('analysis.rules.adjacentParticlesMaxRepeat', 1), - conjunctionRepeatMax: config.get('analysis.rules.conjunctionRepeatMax', 1), - } - } - } + commaLimit: config.get("analysis.rules.commaLimit", true), + adversativeGa: config.get( + "analysis.rules.adversativeGa", + true, + ), + duplicateParticleSurface: config.get( + "analysis.rules.duplicateParticleSurface", + true, + ), + adjacentParticles: config.get( + "analysis.rules.adjacentParticles", + true, + ), + conjunctionRepeat: config.get( + "analysis.rules.conjunctionRepeat", + true, + ), + raDropping: config.get("analysis.rules.raDropping", true), + commaLimitMax: config.get("analysis.rules.commaLimitMax", 3), + adversativeGaMax: config.get( + "analysis.rules.adversativeGaMax", + 1, + ), + duplicateParticleSurfaceMaxRepeat: config.get( + "analysis.rules.duplicateParticleSurfaceMaxRepeat", + 1, + ), + adjacentParticlesMaxRepeat: config.get( + "analysis.rules.adjacentParticlesMaxRepeat", + 1, + ), + conjunctionRepeatMax: config.get( + "analysis.rules.conjunctionRepeatMax", + 1, + ), + }, + }, + }, }; if (isDebug) { - console.log('[MoZuku] LSP初期化オプション:', JSON.stringify(initOptions, null, 2)); + console.log( + "[MoZuku] LSP初期化オプション:", + JSON.stringify(initOptions, null, 2), + ); } const documentSelector = [ ...supportedLanguages.map((language) => ({ language })), - { scheme: 'file', pattern: '**/*.ja.txt' }, - { scheme: 'file', pattern: '**/*.ja.md' }, + { scheme: "file", pattern: "**/*.ja.txt" }, + { scheme: "file", pattern: "**/*.ja.md" }, ]; const clientOptions: LanguageClientOptions = { documentSelector, synchronize: { - fileEvents: vscode.workspace.createFileSystemWatcher('**/*'), + fileEvents: vscode.workspace.createFileSystemWatcher("**/*"), }, initializationOptions: initOptions, middleware: {}, }; const client = new LanguageClient( - 'mozuku', - 'MoZuku LSP', + "mozuku", + "MoZuku LSP", serverOptions, - clientOptions + clientOptions, ); const semanticHighlights = new Map>(); @@ -149,29 +201,35 @@ export async function startClient( const contentHighlights = new Map(); const semanticColors: Record = { - noun: '#c8c8c8', - verb: '#569cd6', - adjective: '#4fc1ff', - adverb: '#9cdcfe', - particle: '#d16969', - aux: '#87ceeb', - conjunction: '#d7ba7d', - symbol: '#808080', - interj: '#b5cea8', - prefix: '#c8c8c8', - suffix: '#c8c8c8', - unknown: '#aaaaaa', + noun: "#c8c8c8", + verb: "#569cd6", + adjective: "#4fc1ff", + adverb: "#9cdcfe", + particle: "#d16969", + aux: "#87ceeb", + conjunction: "#d7ba7d", + symbol: "#808080", + interj: "#b5cea8", + prefix: "#c8c8c8", + suffix: "#c8c8c8", + unknown: "#aaaaaa", }; - const semanticDecorationTypes = new Map(); - const commentDecorationType = vscode.window.createTextEditorDecorationType({}); - const contentDecorationType = vscode.window.createTextEditorDecorationType({ - }); + const semanticDecorationTypes = new Map< + string, + vscode.TextEditorDecorationType + >(); + const commentDecorationType = vscode.window.createTextEditorDecorationType( + {}, + ); + const contentDecorationType = vscode.window.createTextEditorDecorationType( + {}, + ); ctx.subscriptions.push(commentDecorationType, contentDecorationType); const getSemanticDecorationType = (tokenType: string) => { if (!semanticDecorationTypes.has(tokenType)) { - const color = semanticColors[tokenType] ?? '#cccccc'; + const color = semanticColors[tokenType] ?? "#cccccc"; const decoration = vscode.window.createTextEditorDecorationType({ color, }); @@ -228,78 +286,97 @@ export async function startClient( client.onDidChangeState((event) => { if (isDebug) { - console.log(`[MoZuku] クライアント状態変更: ${State[event.oldState]} -> ${State[event.newState]}`); + console.log( + `[MoZuku] クライアント状態変更: ${State[event.oldState]} -> ${State[event.newState]}`, + ); } if (event.newState === State.Running) { - console.log('[MoZuku] LSPクライアントが起動しました'); + console.log("[MoZuku] LSPクライアントが起動しました"); } else if (event.newState === State.Stopped) { - console.error('[MoZuku] LSPクライアントが停止しました'); + console.error("[MoZuku] LSPクライアントが停止しました"); if (event.oldState === State.Running) { - vscode.window.showErrorMessage('MoZuku LSPサーバーが予期せず停止しました。サーバー実行ファイルを確認してください。'); + vscode.window.showErrorMessage( + "MoZuku LSPサーバーが予期せず停止しました。サーバー実行ファイルを確認してください。", + ); } } }); - client.onNotification('mozuku/commentHighlights', (payload: CommentHighlightMessage) => { - const { uri, ranges = [] } = payload; - const vsRanges = ranges.map((r) => { - const start = new vscode.Position(r.start.line, r.start.character); - const end = new vscode.Position(r.end.line, r.end.character); - return new vscode.Range(start, end); - }); - if (vsRanges.length === 0) { - commentHighlights.delete(uri); - } else { - commentHighlights.set(uri, vsRanges); - } - applyDecorationsForUri(uri); - }); - - client.onNotification('mozuku/contentHighlights', (payload: ContentHighlightMessage) => { - const { uri, ranges = [] } = payload; - const vsRanges = ranges.map((r) => { - const start = new vscode.Position(r.start.line, r.start.character); - const end = new vscode.Position(r.end.line, r.end.character); - return new vscode.Range(start, end); - }); - if (vsRanges.length === 0) { - contentHighlights.delete(uri); - } else { - contentHighlights.set(uri, vsRanges); - } - applyDecorationsForUri(uri); - }); - - client.onNotification('mozuku/semanticHighlights', (payload: SemanticHighlightMessage) => { - const { uri, tokens = [] } = payload; - if (tokens.length === 0) { - semanticHighlights.delete(uri); + client.onNotification( + "mozuku/commentHighlights", + (payload: CommentHighlightMessage) => { + const { uri, ranges = [] } = payload; + const vsRanges = ranges.map((r) => { + const start = new vscode.Position(r.start.line, r.start.character); + const end = new vscode.Position(r.end.line, r.end.character); + return new vscode.Range(start, end); + }); + if (vsRanges.length === 0) { + commentHighlights.delete(uri); + } else { + commentHighlights.set(uri, vsRanges); + } applyDecorationsForUri(uri); - return; - } + }, + ); - const perType = new Map(); - for (const token of tokens) { - const start = new vscode.Position(token.range.start.line, token.range.start.character); - const end = new vscode.Position(token.range.end.line, token.range.end.character); - const range = new vscode.Range(start, end); + client.onNotification( + "mozuku/contentHighlights", + (payload: ContentHighlightMessage) => { + const { uri, ranges = [] } = payload; + const vsRanges = ranges.map((r) => { + const start = new vscode.Position(r.start.line, r.start.character); + const end = new vscode.Position(r.end.line, r.end.character); + return new vscode.Range(start, end); + }); + if (vsRanges.length === 0) { + contentHighlights.delete(uri); + } else { + contentHighlights.set(uri, vsRanges); + } + applyDecorationsForUri(uri); + }, + ); - const decoration = getSemanticDecorationType(token.type); - if (!perType.has(token.type)) { - perType.set(token.type, []); + client.onNotification( + "mozuku/semanticHighlights", + (payload: SemanticHighlightMessage) => { + const { uri, tokens = [] } = payload; + if (tokens.length === 0) { + semanticHighlights.delete(uri); + applyDecorationsForUri(uri); + return; } - perType.get(token.type)!.push(range); - void decoration; - } + const perType = new Map(); + for (const token of tokens) { + const start = new vscode.Position( + token.range.start.line, + token.range.start.character, + ); + const end = new vscode.Position( + token.range.end.line, + token.range.end.character, + ); + const range = new vscode.Range(start, end); + + const decoration = getSemanticDecorationType(token.type); + if (!perType.has(token.type)) { + perType.set(token.type, []); + } + perType.get(token.type)!.push(range); - semanticHighlights.set(uri, perType); - applyDecorationsForUri(uri); - }); + void decoration; + } + + semanticHighlights.set(uri, perType); + applyDecorationsForUri(uri); + }, + ); if (isDebug) { client.outputChannel.show(); - console.log('[MoZuku] デバッグのためLSPクライアント出力チャンネルを表示'); + console.log("[MoZuku] デバッグのためLSPクライアント出力チャンネルを表示"); } ctx.subscriptions.push(client); @@ -307,34 +384,37 @@ export async function startClient( try { await client.start(); if (isDebug) { - console.log('[MoZuku] LSPクライアントの起動に成功しました'); + console.log("[MoZuku] LSPクライアントの起動に成功しました"); } applyDecorationsToVisibleEditors(); const openDisposable = vscode.workspace.onDidOpenTextDocument((doc) => { - console.log('[MoZuku] ドキュメントを開きました:', { + console.log("[MoZuku] ドキュメントを開きました:", { uri: doc.uri.toString(), languageId: doc.languageId, - fileName: doc.fileName + fileName: doc.fileName, }); applyDecorationsForUri(doc.uri.toString()); }); - const activeEditorDisposable = vscode.window.onDidChangeActiveTextEditor((editor) => { - if (editor) { - console.log('[MoZuku] アクティブエディタが変更されました:', { - uri: editor.document.uri.toString(), - languageId: editor.document.languageId, - fileName: editor.document.fileName - }); - } - applyDecorationsToEditor(editor ?? undefined); - }); + const activeEditorDisposable = vscode.window.onDidChangeActiveTextEditor( + (editor) => { + if (editor) { + console.log("[MoZuku] アクティブエディタが変更されました:", { + uri: editor.document.uri.toString(), + languageId: editor.document.languageId, + fileName: editor.document.fileName, + }); + } + applyDecorationsToEditor(editor ?? undefined); + }, + ); - const visibleEditorsDisposable = vscode.window.onDidChangeVisibleTextEditors(() => { - applyDecorationsToVisibleEditors(); - }); + const visibleEditorsDisposable = + vscode.window.onDidChangeVisibleTextEditors(() => { + applyDecorationsToVisibleEditors(); + }); const closeDisposable = vscode.workspace.onDidCloseTextDocument((doc) => { const uri = doc.uri.toString(); @@ -344,9 +424,14 @@ export async function startClient( applyDecorationsForUri(uri); }); - ctx.subscriptions.push(openDisposable, activeEditorDisposable, visibleEditorsDisposable, closeDisposable); + ctx.subscriptions.push( + openDisposable, + activeEditorDisposable, + visibleEditorsDisposable, + closeDisposable, + ); } catch (error) { - console.error('[MoZuku] LSPクライアントの起動に失敗しました:', error); + console.error("[MoZuku] LSPクライアントの起動に失敗しました:", error); vscode.window.showErrorMessage(`MoZuku LSPの起動に失敗: ${error}`); throw error; } @@ -354,72 +439,190 @@ export async function startClient( return client; } -function resolveServerPath(ctx: vscode.ExtensionContext, configured: string): string { - const isWindows = process.platform === 'win32'; - const exeName = isWindows ? 'mozuku-lsp.exe' : 'mozuku-lsp'; - - const isDebug = true; +function resolveServerPath( + ctx: vscode.ExtensionContext, + configured: string, +): string { + const isWindows = process.platform === "win32"; + const exeName = isWindows ? "mozuku-lsp.exe" : "mozuku-lsp"; + const isDebug = + process.env.VSCODE_DEBUG_MODE === "true" || + ctx.extensionMode === vscode.ExtensionMode.Development; + const configuredValue = configured.trim(); + const envValue = process.env.MOZUKU_LSP?.trim() ?? ""; + const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + const extensionRoot = ctx.extensionUri.fsPath; + const seen = new Set(); if (isDebug) { - console.log('[MoZuku] サーバーパスを解決中:', { - configured, - extensionPath: ctx.extensionUri.fsPath, - workspaceFolders: vscode.workspace.workspaceFolders?.map(f => f.uri.fsPath) + console.log("[MoZuku] サーバーパスを解決中:", { + configured: configuredValue, + extensionPath: extensionRoot, + workspaceFolders: vscode.workspace.workspaceFolders?.map( + (f) => f.uri.fsPath, + ), }); } const candidates: { type: string; path: string }[] = []; const add = (type: string, p: string | undefined) => { - if (!p || p.trim().length === 0) { return; } + if (!p || p.trim().length === 0) { + return; + } + const normalized = path.normalize(p); + if (seen.has(normalized)) { + return; + } + seen.add(normalized); candidates.push({ type, path: p }); }; + const addResolvedPath = (type: string, candidate: string | undefined) => { + if (!candidate) { + return; + } + if (path.isAbsolute(candidate)) { + add(type, candidate); + return; + } + if (workspaceRoot) { + add(`${type} (workspace)`, path.join(workspaceRoot, candidate)); + } + add(`${type} (extension)`, path.join(extensionRoot, candidate)); + add(`${type} (cwd)`, path.resolve(candidate)); + }; + const installDirs = (): string[] => { + const dirs: string[] = []; + const pathEnv = process.env.PATH || ""; + for (const dir of pathEnv.split(path.delimiter)) { + if (dir) { + dirs.push(dir); + } + } - // 1) 設定でフルパス指定 - if (configured && hasPathSep(configured)) { - add('設定済み', configured); - } + const home = process.env.HOME || process.env.USERPROFILE; + if (home) { + dirs.push(path.join(home, ".local", "bin")); + dirs.push(path.join(home, "bin")); + } - // 2) 環境変数 MOZUKU_LSP - add('環境変数 MOZUKU_LSP', process.env.MOZUKU_LSP); + if (isWindows) { + const localAppData = process.env.LOCALAPPDATA; + if (localAppData) { + dirs.push(path.join(localAppData, "Programs", "MoZuku", "bin")); + dirs.push(path.join(localAppData, "Programs", "mozuku-lsp", "bin")); + } + for (const base of [ + process.env.ProgramFiles, + process.env["ProgramFiles(x86)"], + ]) { + if (!base) { + continue; + } + dirs.push(path.join(base, "MoZuku", "bin")); + dirs.push(path.join(base, "mozuku-lsp", "bin")); + } + } else { + dirs.push("/usr/local/bin"); + dirs.push("/usr/bin"); + if (process.platform === "darwin") { + dirs.push("/opt/homebrew/bin"); + dirs.push("/opt/local/bin"); + } + } - // 3) PATH 上のコマンド - const pathEnv = process.env.PATH || ''; - for (const dir of pathEnv.split(path.delimiter)) { - if (!dir) { continue; } - add('PATH', path.join(dir, exeName)); - } + return dirs; + }; + const addCommandSearch = (type: string, commandName: string | undefined) => { + if (!commandName || hasPathSep(commandName)) { + return; + } + const names = + isWindows && !commandName.toLowerCase().endsWith(".exe") + ? [commandName, `${commandName}.exe`] + : [commandName]; + for (const dir of installDirs()) { + for (const name of names) { + add(type, path.join(dir, name)); + } + } + }; - // 4) 既知の標準インストール先 - const home = process.env.HOME || process.env.USERPROFILE; - if (home) { - add('ユーザーインストール', path.join(home, '.mozuku', 'bin', exeName)); + if (configuredValue && hasPathSep(configuredValue)) { + addResolvedPath("設定済み", configuredValue); } - if (isWindows) { - const localAppData = process.env.LOCALAPPDATA; - if (localAppData) { - add('ユーザーインストール', path.join(localAppData, 'mozuku', 'bin', exeName)); - } - } else { - add('システム /usr/local/bin', path.join('/usr/local/bin', exeName)); + if (envValue && hasPathSep(envValue)) { + addResolvedPath("環境変数 MOZUKU_LSP", envValue); } - // 5) 拡張同梱バイナリ - const primaryPackaged = vscode.Uri.joinPath(ctx.extensionUri, 'bin', exeName).fsPath; - add('パッケージ済み', primaryPackaged); + addCommandSearch( + "設定済みコマンド", + configuredValue && !hasPathSep(configuredValue) + ? configuredValue + : undefined, + ); + addCommandSearch( + "環境変数 MOZUKU_LSP", + envValue && !hasPathSep(envValue) ? envValue : undefined, + ); + addCommandSearch("デフォルトコマンド", exeName); + + add( + "パッケージ済み", + vscode.Uri.joinPath(ctx.extensionUri, "bin", exeName).fsPath, + ); - const plat = process.platform; const arch = process.arch; - const legacyPackaged = vscode.Uri.joinPath(ctx.extensionUri, 'server', 'bin', `${plat}-${arch}`, exeName).fsPath; - add('パッケージ済み', legacyPackaged); + const plat = process.platform; + const arch = process.arch; + add( + "パッケージ済み", + vscode.Uri.joinPath( + ctx.extensionUri, + "server", + "bin", + `${plat}-${arch}`, + exeName, + ).fsPath, + ); - // 6) ワークスペース/開発のビルド成果物 - const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; if (workspaceRoot) { - add('ワークスペース-build', path.join(workspaceRoot, 'build', exeName)); - add('ワークスペース-lsp', path.join(workspaceRoot, 'mozuku-lsp', 'build', exeName)); + add( + "ワークスペース-install", + path.join(workspaceRoot, "build", "install", "bin", exeName), + ); + add("ワークスペース-build", path.join(workspaceRoot, "build", exeName)); + add( + "ワークスペース-install", + path.join( + workspaceRoot, + "mozuku-lsp", + "build", + "install", + "bin", + exeName, + ), + ); + add( + "ワークスペース-build", + path.join(workspaceRoot, "mozuku-lsp", "build", exeName), + ); } - add('開発-ルート', path.join(ctx.extensionUri.fsPath, '..', 'build', exeName)); - add('開発-サブ', path.join(ctx.extensionUri.fsPath, '..', 'mozuku-lsp', 'build', exeName)); + add( + "開発-install", + path.join( + extensionRoot, + "..", + "mozuku-lsp", + "build", + "install", + "bin", + exeName, + ), + ); + add( + "開発-build", + path.join(extensionRoot, "..", "mozuku-lsp", "build", exeName), + ); for (const candidate of candidates) { if (fs.existsSync(candidate.path)) { @@ -428,17 +631,20 @@ function resolveServerPath(ctx: vscode.ExtensionContext, configured: string): st } return candidate.path; } else if (isDebug) { - console.log(`[MoZuku] ${candidate.type}パスが見つかりません:`, candidate.path); + console.log( + `[MoZuku] ${candidate.type}パスが見つかりません:`, + candidate.path, + ); } } - const fallback = configured || exeName; + const fallback = configuredValue || envValue || exeName; if (isDebug) { - console.log('[MoZuku] フォールバックパスを使用:', fallback); + console.log("[MoZuku] フォールバックパスを使用:", fallback); } return fallback; } function hasPathSep(p: string): boolean { - return p.includes('/') || p.includes('\\'); + return p.includes("/") || p.includes("\\"); }