Config for raLspServerPath will be overwritten if __RA_LSP_SERVER_DEBUG is set

Changed presentation from clear to reveal silent
Removed the vscode gitignore entry
Added debugging documentation
Added tasks and launch configs
This commit is contained in:
Andrew Ross 2019-01-18 12:59:08 +02:00 committed by Aleksey Kladov
parent 168c46ab77
commit 1800bfb6e6
7 changed files with 470 additions and 7 deletions

1
.gitignore vendored
View file

@ -2,6 +2,5 @@
crates/*/target
**/*.rs.bk
.idea/*
.vscode/*
*.log
*.iml

9
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,9 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
// List of extensions which should be recommended for users of this workspace.
"recommendations": ["vadimcn.vscode-lldb"],
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
"unwantedRecommendations": []
}

340
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,340 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/editors/code",
"--disable-extensions"
],
"env": {
"__RA_LSP_SERVER_DEBUG": "${workspaceFolder}/target/debug/ra_lsp_server"
},
"outFiles": ["${workspaceFolder}/editors/code/out/**/*.js"],
"preLaunchTask": "Build All"
},
{
"name": "Debug Lsp Server",
"type": "lldb",
"request": "attach",
"program": "${workspaceFolder}/target/debug/ra_lsp_server",
"pid": "${command:pickMyProcess}",
"sourceLanguages": ["rust"]
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'gen_lsp_server'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=gen_lsp_server"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'ra_analysis'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=ra_analysis"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug test 'tests'",
"cargo": {
"args": ["build", "--test=tests", "--package=ra_analysis"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in test 'tests'",
"cargo": {
"args": ["test", "--no-run", "--test=tests", "--package=ra_analysis"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'ra_hir'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=ra_hir"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'ra_db'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=ra_db"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'ra_editor'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=ra_editor"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'ra_syntax'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=ra_syntax"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug test 'test'",
"cargo": {
"args": ["build", "--test=test", "--package=ra_syntax"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in test 'test'",
"cargo": {
"args": ["test", "--no-run", "--test=test", "--package=ra_syntax"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'test_utils'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=test_utils"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'ra_cli'",
"cargo": {
"args": ["build", "--bin=ra_cli", "--package=ra_cli"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'ra_cli'",
"cargo": {
"args": ["test", "--no-run", "--bin=ra_cli", "--package=ra_cli"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'tools'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=tools"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'tools'",
"cargo": {
"args": ["build", "--bin=tools", "--package=tools"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'tools'",
"cargo": {
"args": ["test", "--no-run", "--bin=tools", "--package=tools"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug test 'cli'",
"cargo": {
"args": ["build", "--test=cli", "--package=tools"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in test 'cli'",
"cargo": {
"args": ["test", "--no-run", "--test=cli", "--package=tools"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'ra_lsp_server'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=ra_lsp_server"],
"filter": {
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'ra_lsp_server'",
"cargo": {
"args": ["build", "--bin=ra_lsp_server", "--package=ra_lsp_server"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'ra_lsp_server'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=ra_lsp_server",
"--package=ra_lsp_server"
],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug test 'heavy_tests'",
"cargo": {
"args": ["build", "--test=heavy_tests", "--package=ra_lsp_server"],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in test 'heavy_tests'",
"cargo": {
"args": [
"test",
"--no-run",
"--test=heavy_tests",
"--package=ra_lsp_server"
],
"filter": {
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

47
.vscode/tasks.json vendored Normal file
View file

@ -0,0 +1,47 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "compile",
"label": "Build Extension",
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"fileLocation": ["relative", "${workspaceRoot}/editors/code"]
},
"path": "editors/code/"
},
{
"label": "Build Lsp",
"type": "shell",
"command": "cargo build",
"problemMatcher": {
"owner": "rust",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": [
{
"regexp": "^(warning|warn|error)(?:\\[(.*?)\\])?: (.*)$",
"severity": 1,
"code": 2,
"message": 3
},
{
"regexp": "^[\\s->=]*(.*?):(\\d*):(\\d*)\\s*$",
"file": 1,
"line": 2,
"column": 3
}
]
}
},
{
"label": "Build All",
"group": "build",
"dependsOn": ["Build Extension", "Build Lsp"],
"problemMatcher": []
}
]
}

62
DEBUGGING.md Normal file
View file

@ -0,0 +1,62 @@
# Debugging vs Code plugin and the Language Server
Install [LLDB](https://lldb.llvm.org/) and the [LLDB Extension](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb).
Checkout rust rust-analyzer and open it in vscode.
```
$ git clone https://github.com/rust-analyzer/rust-analyzer.git --depth 1
$ cd rust-analyzer
$ code .
```
- To attach to the `lsp server` in linux you'll have to run:
`echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`
This enables ptrace on non forked processes
- Ensure the dependencies for the extension are installed, run the `npm: install - editors/code` task in vscode.
- Launch the `Debug Extension`, this will build the extension and the `lsp server`.
- A new instance of vscode with `[Extension Development Host]` in the title.
Don't worry about disabling `rls` all other extensions will be disabled but this one.
- In the new vscode instance open a rust project, and navigate to a rust file
- In the original vscode start an additional debug session (the three periods in the launch) and select `Debug Lsp Server`.
- A list of running processes should appear select the `ra_lsp_server` from this repo.
- Navigate to `crates/ra_lsp_server/src/main_loop.rs` and add a breakpoint to the `on_task` function.
- Go back to the `[Extension Development Host]` instance and hover over a rust variable and your breakpoint should hit.
## Demo
![demonstration of debugging](./images/Rls_Debug.gif)
## Troubleshooting
### Can't find the `ra_lsp_server` process
It could be a case of just jumping the gun.
The `ra_lsp_server` is only started once the `onLanguage:rust` activation.
Make sure you open a rust file in the `[Extension Development Host]` and try again.
### Can't connect to `ra_lsp_server`
Make sure you have run `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`.
By default this should reset back to 1 everytime you log in.
### Breakpoints are never being hit
Check your version of `lldb` if it's version 6 and lower use the `classic` adapter type.
It's `lldb.adapterType` in settings file.
If you're running `lldb` version 7 change the lldb adapter type to `bundled` or `native`.

View file

@ -14,7 +14,6 @@ Work on the Rust Analyzer is sponsored by
[![Ferrous Systems](https://ferrous-systems.com/images/ferrous-logo-text.svg)](https://ferrous-systems.com/)
## Quick Start
Rust analyzer builds on Rust >= 1.31.0 and uses the 2018 edition.
@ -36,6 +35,11 @@ $ cargo install --path crates/ra_lsp_server
See [these instructions](./editors/README.md) for VS Code setup and the list of
features (some of which are VS Code specific).
## Debugging
See [these instructions](./DEBUGGING.md) for VS Code setup and the list of
features (some of which are VS Code specific).
## Current Status and Plans
Rust analyzer aims to fill the same niche as the official [Rust Language
@ -53,11 +57,11 @@ The near/mid term plan is to work independently of the main rustc compiler and
implement at least simplistic versions of name resolution, macro expansion and
type inference. The purpose is two fold:
* to quickly bootstrap usable and useful language server: solution that covers
- to quickly bootstrap usable and useful language server: solution that covers
80% of Rust code will be useful for IDEs, and will be vastly simpler than 100%
solution.
* to understand how the consumer-side of compiler API should look like
- to understand how the consumer-side of compiler API should look like
(especially it's on-demand aspects). If you have `get_expression_type`
function, you can write a ton of purely-IDE features on top of it, even if the
function is only partially correct. Pluging in the precise function afterwards
@ -77,7 +81,6 @@ implemented in Rust: [https://discord.gg/sx3RQZB](https://discord.gg/sx3RQZB).
See [CONTRIBUTING.md](./CONTRIBUTING.md) and [ARCHITECTURE.md](./ARCHITECTURE.md)
## License
Rust analyzer is primarily distributed under the terms of both the MIT

View file

@ -2,9 +2,11 @@ import * as vscode from 'vscode';
import { Server } from './server';
const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG;
export class Config {
public highlightingOn = true;
public raLspServerPath = 'ra_lsp_server';
public raLspServerPath = RA_LSP_DEBUG || 'ra_lsp_server';
constructor() {
vscode.workspace.onDidChangeConfiguration(_ =>
@ -24,7 +26,8 @@ export class Config {
}
if (config.has('raLspServerPath')) {
this.raLspServerPath = config.get('raLspServerPath') as string;
this.raLspServerPath =
RA_LSP_DEBUG || (config.get('raLspServerPath') as string);
}
}
}