collie-lsp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.collie.yml.example +144 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +10 -0
- data/LICENSE +21 -0
- data/README.md +273 -0
- data/Rakefile +8 -0
- data/collie-lsp.gemspec +36 -0
- data/exe/collie-lsp +9 -0
- data/lib/collie_lsp/collie_wrapper.rb +97 -0
- data/lib/collie_lsp/document_store.rb +66 -0
- data/lib/collie_lsp/handlers/code_action.rb +77 -0
- data/lib/collie_lsp/handlers/completion.rb +72 -0
- data/lib/collie_lsp/handlers/definition.rb +117 -0
- data/lib/collie_lsp/handlers/diagnostics.rb +64 -0
- data/lib/collie_lsp/handlers/document_symbol.rb +185 -0
- data/lib/collie_lsp/handlers/folding_range.rb +211 -0
- data/lib/collie_lsp/handlers/formatting.rb +55 -0
- data/lib/collie_lsp/handlers/hover.rb +104 -0
- data/lib/collie_lsp/handlers/references.rb +185 -0
- data/lib/collie_lsp/handlers/rename.rb +226 -0
- data/lib/collie_lsp/handlers/semantic_tokens.rb +302 -0
- data/lib/collie_lsp/handlers/workspace_symbol.rb +161 -0
- data/lib/collie_lsp/protocol/initialize.rb +58 -0
- data/lib/collie_lsp/protocol/shutdown.rb +25 -0
- data/lib/collie_lsp/protocol/text_document.rb +81 -0
- data/lib/collie_lsp/server.rb +104 -0
- data/lib/collie_lsp/version.rb +5 -0
- data/lib/collie_lsp.rb +25 -0
- data/vscode-extension/.gitignore +3 -0
- data/vscode-extension/.vscode/launch.json +17 -0
- data/vscode-extension/.vscode/tasks.json +14 -0
- data/vscode-extension/README.md +35 -0
- data/vscode-extension/package.json +49 -0
- data/vscode-extension/src/extension.ts +48 -0
- data/vscode-extension/test-grammar.y +42 -0
- data/vscode-extension/tsconfig.json +12 -0
- metadata +98 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module CollieLsp
|
|
4
|
+
module Protocol
|
|
5
|
+
# Handles initialize and initialized LSP messages
|
|
6
|
+
module Initialize
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
# Handle initialize request
|
|
10
|
+
# @param request [Hash] LSP request
|
|
11
|
+
# @param writer [Object] Response writer
|
|
12
|
+
def handle(request, writer)
|
|
13
|
+
writer.write(
|
|
14
|
+
id: request[:id],
|
|
15
|
+
result: {
|
|
16
|
+
capabilities: {
|
|
17
|
+
textDocumentSync: {
|
|
18
|
+
openClose: true,
|
|
19
|
+
change: 2, # Incremental
|
|
20
|
+
save: { includeText: true }
|
|
21
|
+
},
|
|
22
|
+
documentFormattingProvider: true,
|
|
23
|
+
codeActionProvider: true,
|
|
24
|
+
hoverProvider: true,
|
|
25
|
+
completionProvider: {
|
|
26
|
+
triggerCharacters: ['%', '$']
|
|
27
|
+
},
|
|
28
|
+
definitionProvider: true,
|
|
29
|
+
referencesProvider: true,
|
|
30
|
+
documentSymbolProvider: true,
|
|
31
|
+
renameProvider: true,
|
|
32
|
+
semanticTokensProvider: {
|
|
33
|
+
legend: {
|
|
34
|
+
tokenTypes: Handlers::SemanticTokens::TOKEN_TYPES,
|
|
35
|
+
tokenModifiers: Handlers::SemanticTokens::TOKEN_MODIFIERS
|
|
36
|
+
},
|
|
37
|
+
full: true
|
|
38
|
+
},
|
|
39
|
+
workspaceSymbolProvider: true,
|
|
40
|
+
foldingRangeProvider: true
|
|
41
|
+
},
|
|
42
|
+
serverInfo: {
|
|
43
|
+
name: 'collie-lsp',
|
|
44
|
+
version: CollieLsp::VERSION
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Handle initialized notification
|
|
51
|
+
# @param _request [Hash] LSP request
|
|
52
|
+
# @param _writer [Object] Response writer
|
|
53
|
+
def handle_initialized(_request, _writer)
|
|
54
|
+
# Nothing to do for initialized notification
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module CollieLsp
|
|
4
|
+
module Protocol
|
|
5
|
+
# Handles shutdown and exit LSP messages
|
|
6
|
+
module Shutdown
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
# Handle shutdown request
|
|
10
|
+
# @param request [Hash] LSP request
|
|
11
|
+
# @param writer [Object] Response writer
|
|
12
|
+
def handle(request, writer)
|
|
13
|
+
writer.write(
|
|
14
|
+
id: request[:id],
|
|
15
|
+
result: nil
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Handle exit notification
|
|
20
|
+
def handle_exit
|
|
21
|
+
exit(0)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module CollieLsp
|
|
4
|
+
module Protocol
|
|
5
|
+
# Handles textDocument/* LSP messages
|
|
6
|
+
module TextDocument
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
# Handle textDocument/didOpen notification
|
|
10
|
+
# @param request [Hash] LSP request
|
|
11
|
+
# @param document_store [DocumentStore] Document store
|
|
12
|
+
# @param collie [CollieWrapper] Collie wrapper
|
|
13
|
+
# @param writer [Object] Response writer
|
|
14
|
+
def handle_did_open(request, document_store, collie, writer)
|
|
15
|
+
params = request[:params]
|
|
16
|
+
uri = params[:textDocument][:uri]
|
|
17
|
+
text = params[:textDocument][:text]
|
|
18
|
+
version = params[:textDocument][:version]
|
|
19
|
+
|
|
20
|
+
document_store.open(uri, text, version)
|
|
21
|
+
publish_diagnostics(uri, text, document_store, collie, writer)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Handle textDocument/didChange notification
|
|
25
|
+
# @param request [Hash] LSP request
|
|
26
|
+
# @param document_store [DocumentStore] Document store
|
|
27
|
+
# @param collie [CollieWrapper] Collie wrapper
|
|
28
|
+
# @param writer [Object] Response writer
|
|
29
|
+
def handle_did_change(request, document_store, collie, writer)
|
|
30
|
+
params = request[:params]
|
|
31
|
+
uri = params[:textDocument][:uri]
|
|
32
|
+
version = params[:textDocument][:version]
|
|
33
|
+
|
|
34
|
+
# For full document sync (change: 1)
|
|
35
|
+
return unless params[:contentChanges]&.first&.dig(:text)
|
|
36
|
+
|
|
37
|
+
text = params[:contentChanges].first[:text]
|
|
38
|
+
document_store.change(uri, text, version)
|
|
39
|
+
publish_diagnostics(uri, text, document_store, collie, writer)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Handle textDocument/didSave notification
|
|
43
|
+
# @param request [Hash] LSP request
|
|
44
|
+
# @param document_store [DocumentStore] Document store
|
|
45
|
+
# @param collie [CollieWrapper] Collie wrapper
|
|
46
|
+
# @param writer [Object] Response writer
|
|
47
|
+
def handle_did_save(request, document_store, collie, writer)
|
|
48
|
+
params = request[:params]
|
|
49
|
+
uri = params[:textDocument][:uri]
|
|
50
|
+
doc = document_store.get(uri)
|
|
51
|
+
|
|
52
|
+
return unless doc
|
|
53
|
+
|
|
54
|
+
publish_diagnostics(uri, doc[:text], document_store, collie, writer)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Handle textDocument/didClose notification
|
|
58
|
+
# @param request [Hash] LSP request
|
|
59
|
+
# @param document_store [DocumentStore] Document store
|
|
60
|
+
# @param _collie [CollieWrapper] Collie wrapper (unused)
|
|
61
|
+
# @param _writer [Object] Response writer (unused)
|
|
62
|
+
def handle_did_close(request, document_store, _collie, _writer)
|
|
63
|
+
uri = request[:params][:textDocument][:uri]
|
|
64
|
+
document_store.close(uri)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Publish diagnostics for a document
|
|
68
|
+
# @param uri [String] Document URI
|
|
69
|
+
# @param text [String] Document text
|
|
70
|
+
# @param document_store [DocumentStore] Document store
|
|
71
|
+
# @param collie [CollieWrapper] Collie wrapper
|
|
72
|
+
# @param writer [Object] Response writer
|
|
73
|
+
def publish_diagnostics(uri, text, document_store, collie, writer)
|
|
74
|
+
filename = uri.gsub(%r{^file://}, '')
|
|
75
|
+
offenses = collie.lint(text, filename: filename)
|
|
76
|
+
|
|
77
|
+
Handlers::Diagnostics.publish(uri, offenses, document_store, writer)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'language_server-protocol'
|
|
4
|
+
|
|
5
|
+
module CollieLsp
|
|
6
|
+
# Main LSP server implementation
|
|
7
|
+
class Server
|
|
8
|
+
# Initialize server
|
|
9
|
+
# @param input [IO] Input stream (default: stdin)
|
|
10
|
+
# @param output [IO] Output stream (default: stdout)
|
|
11
|
+
def initialize(input: $stdin, output: $stdout)
|
|
12
|
+
@reader = LanguageServer::Protocol::Transport::Io::Reader.new(input)
|
|
13
|
+
@writer = LanguageServer::Protocol::Transport::Io::Writer.new(output)
|
|
14
|
+
@document_store = DocumentStore.new
|
|
15
|
+
@collie = nil
|
|
16
|
+
@workspace_root = nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Start the server
|
|
20
|
+
def start
|
|
21
|
+
@reader.read do |request|
|
|
22
|
+
handle_request(request)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# Handle an LSP request
|
|
29
|
+
# @param request [Hash] LSP request message
|
|
30
|
+
def handle_request(request)
|
|
31
|
+
case request[:method]
|
|
32
|
+
when 'initialize'
|
|
33
|
+
handle_initialize(request)
|
|
34
|
+
when 'initialized'
|
|
35
|
+
Protocol::Initialize.handle_initialized(request, @writer)
|
|
36
|
+
when 'textDocument/didOpen'
|
|
37
|
+
Protocol::TextDocument.handle_did_open(request, @document_store, @collie, @writer)
|
|
38
|
+
when 'textDocument/didChange'
|
|
39
|
+
Protocol::TextDocument.handle_did_change(request, @document_store, @collie, @writer)
|
|
40
|
+
when 'textDocument/didSave'
|
|
41
|
+
Protocol::TextDocument.handle_did_save(request, @document_store, @collie, @writer)
|
|
42
|
+
when 'textDocument/didClose'
|
|
43
|
+
Protocol::TextDocument.handle_did_close(request, @document_store, @collie, @writer)
|
|
44
|
+
when 'textDocument/formatting'
|
|
45
|
+
Handlers::Formatting.handle(request, @document_store, @collie, @writer)
|
|
46
|
+
when 'textDocument/codeAction'
|
|
47
|
+
Handlers::CodeAction.handle(request, @document_store, @collie, @writer)
|
|
48
|
+
when 'textDocument/hover'
|
|
49
|
+
Handlers::Hover.handle(request, @document_store, @collie, @writer)
|
|
50
|
+
when 'textDocument/completion'
|
|
51
|
+
Handlers::Completion.handle(request, @document_store, @collie, @writer)
|
|
52
|
+
when 'textDocument/definition'
|
|
53
|
+
Handlers::Definition.handle(request, @document_store, @collie, @writer)
|
|
54
|
+
when 'textDocument/references'
|
|
55
|
+
Handlers::References.handle(request, @document_store, @collie, @writer)
|
|
56
|
+
when 'textDocument/documentSymbol'
|
|
57
|
+
Handlers::DocumentSymbol.handle(request, @document_store, @collie, @writer)
|
|
58
|
+
when 'textDocument/rename'
|
|
59
|
+
Handlers::Rename.handle(request, @document_store, @collie, @writer)
|
|
60
|
+
when 'textDocument/semanticTokens/full'
|
|
61
|
+
Handlers::SemanticTokens.handle(request, @document_store, @collie, @writer)
|
|
62
|
+
when 'workspace/symbol'
|
|
63
|
+
Handlers::WorkspaceSymbol.handle(request, @document_store, @collie, @writer)
|
|
64
|
+
when 'textDocument/foldingRange'
|
|
65
|
+
Handlers::FoldingRange.handle(request, @document_store, @collie, @writer)
|
|
66
|
+
when 'shutdown'
|
|
67
|
+
Protocol::Shutdown.handle(request, @writer)
|
|
68
|
+
when 'exit'
|
|
69
|
+
Protocol::Shutdown.handle_exit
|
|
70
|
+
end
|
|
71
|
+
rescue StandardError => e
|
|
72
|
+
log_error("Error handling request: #{e.message}\n#{e.backtrace.join("\n")}")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Handle initialize request and set up workspace
|
|
76
|
+
# @param request [Hash] LSP initialize request
|
|
77
|
+
def handle_initialize(request)
|
|
78
|
+
@workspace_root = extract_workspace_root(request)
|
|
79
|
+
@collie = CollieWrapper.new(workspace_root: @workspace_root)
|
|
80
|
+
Protocol::Initialize.handle(request, @writer)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Extract workspace root from initialize request
|
|
84
|
+
# @param request [Hash] LSP initialize request
|
|
85
|
+
# @return [String, nil] Workspace root path or nil
|
|
86
|
+
def extract_workspace_root(request)
|
|
87
|
+
params = request[:params]
|
|
88
|
+
root_uri = params[:rootUri]
|
|
89
|
+
return nil unless root_uri
|
|
90
|
+
|
|
91
|
+
root_uri.gsub(%r{^file://}, '')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Log error message
|
|
95
|
+
# @param message [String] Error message
|
|
96
|
+
def log_error(message)
|
|
97
|
+
return unless ENV['COLLIE_LSP_LOG']
|
|
98
|
+
|
|
99
|
+
File.open(ENV.fetch('COLLIE_LSP_LOG', nil), 'a') do |f|
|
|
100
|
+
f.puts "[#{Time.now}] ERROR: #{message}"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
data/lib/collie_lsp.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'collie_lsp/version'
|
|
4
|
+
require_relative 'collie_lsp/server'
|
|
5
|
+
require_relative 'collie_lsp/document_store'
|
|
6
|
+
require_relative 'collie_lsp/collie_wrapper'
|
|
7
|
+
require_relative 'collie_lsp/protocol/initialize'
|
|
8
|
+
require_relative 'collie_lsp/protocol/text_document'
|
|
9
|
+
require_relative 'collie_lsp/protocol/shutdown'
|
|
10
|
+
require_relative 'collie_lsp/handlers/diagnostics'
|
|
11
|
+
require_relative 'collie_lsp/handlers/formatting'
|
|
12
|
+
require_relative 'collie_lsp/handlers/code_action'
|
|
13
|
+
require_relative 'collie_lsp/handlers/hover'
|
|
14
|
+
require_relative 'collie_lsp/handlers/completion'
|
|
15
|
+
require_relative 'collie_lsp/handlers/definition'
|
|
16
|
+
require_relative 'collie_lsp/handlers/references'
|
|
17
|
+
require_relative 'collie_lsp/handlers/document_symbol'
|
|
18
|
+
require_relative 'collie_lsp/handlers/rename'
|
|
19
|
+
require_relative 'collie_lsp/handlers/semantic_tokens'
|
|
20
|
+
require_relative 'collie_lsp/handlers/workspace_symbol'
|
|
21
|
+
require_relative 'collie_lsp/handlers/folding_range'
|
|
22
|
+
|
|
23
|
+
module CollieLsp
|
|
24
|
+
class Error < StandardError; end
|
|
25
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.2.0",
|
|
3
|
+
"configurations": [
|
|
4
|
+
{
|
|
5
|
+
"name": "Run Extension",
|
|
6
|
+
"type": "extensionHost",
|
|
7
|
+
"request": "launch",
|
|
8
|
+
"args": [
|
|
9
|
+
"--extensionDevelopmentPath=${workspaceFolder}"
|
|
10
|
+
],
|
|
11
|
+
"outFiles": [
|
|
12
|
+
"${workspaceFolder}/out/**/*.js"
|
|
13
|
+
],
|
|
14
|
+
"preLaunchTask": "${defaultBuildTask}"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Collie LSP Test Extension
|
|
2
|
+
|
|
3
|
+
Test extension for developing and testing collie-lsp.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install dependencies
|
|
9
|
+
npm install
|
|
10
|
+
|
|
11
|
+
# Compile TypeScript
|
|
12
|
+
npm run compile
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Testing
|
|
16
|
+
|
|
17
|
+
1. Open this folder in VS Code
|
|
18
|
+
2. Press F5 to launch Extension Development Host
|
|
19
|
+
3. Create a test .y file
|
|
20
|
+
4. Verify LSP features work (diagnostics, completion, etc.)
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
In the Extension Development Host, you can configure:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"collie-lsp.serverPath": "/path/to/collie-lsp",
|
|
29
|
+
"collie-lsp.trace.server": "verbose"
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Viewing LSP Communication
|
|
34
|
+
|
|
35
|
+
Open Output panel (View > Output) and select "Collie LSP" from the dropdown.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "collie-lsp-test",
|
|
3
|
+
"displayName": "Collie LSP Test",
|
|
4
|
+
"description": "Test extension for collie-lsp",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"engines": {
|
|
7
|
+
"vscode": "^1.75.0"
|
|
8
|
+
},
|
|
9
|
+
"categories": ["Programming Languages"],
|
|
10
|
+
"activationEvents": ["onLanguage:yacc"],
|
|
11
|
+
"main": "./out/extension.js",
|
|
12
|
+
"contributes": {
|
|
13
|
+
"languages": [{
|
|
14
|
+
"id": "yacc",
|
|
15
|
+
"extensions": [".y"],
|
|
16
|
+
"aliases": ["Yacc", "yacc"]
|
|
17
|
+
}],
|
|
18
|
+
"configuration": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"title": "Collie LSP",
|
|
21
|
+
"properties": {
|
|
22
|
+
"collie-lsp.serverPath": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"default": "collie-lsp",
|
|
25
|
+
"description": "Path to collie-lsp executable"
|
|
26
|
+
},
|
|
27
|
+
"collie-lsp.trace.server": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"enum": ["off", "messages", "verbose"],
|
|
30
|
+
"default": "verbose",
|
|
31
|
+
"description": "Traces the communication between VS Code and the language server"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"vscode:prepublish": "npm run compile",
|
|
38
|
+
"compile": "tsc -p ./",
|
|
39
|
+
"watch": "tsc -watch -p ./"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"vscode-languageclient": "^9.0.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^20.0.0",
|
|
46
|
+
"@types/vscode": "^1.75.0",
|
|
47
|
+
"typescript": "^5.0.0"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { workspace, ExtensionContext } from 'vscode';
|
|
3
|
+
import {
|
|
4
|
+
LanguageClient,
|
|
5
|
+
LanguageClientOptions,
|
|
6
|
+
ServerOptions,
|
|
7
|
+
TransportKind
|
|
8
|
+
} from 'vscode-languageclient/node';
|
|
9
|
+
|
|
10
|
+
let client: LanguageClient;
|
|
11
|
+
|
|
12
|
+
export function activate(context: ExtensionContext) {
|
|
13
|
+
// Get server path from configuration
|
|
14
|
+
const config = workspace.getConfiguration('collie-lsp');
|
|
15
|
+
const serverPath = config.get<string>('serverPath') || 'collie-lsp';
|
|
16
|
+
|
|
17
|
+
// Server options
|
|
18
|
+
const serverOptions: ServerOptions = {
|
|
19
|
+
command: serverPath,
|
|
20
|
+
args: ['--stdio'],
|
|
21
|
+
transport: TransportKind.stdio
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Client options
|
|
25
|
+
const clientOptions: LanguageClientOptions = {
|
|
26
|
+
documentSelector: [{ scheme: 'file', language: 'yacc' }],
|
|
27
|
+
synchronize: {
|
|
28
|
+
fileEvents: workspace.createFileSystemWatcher('**/.y')
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Create and start the client
|
|
33
|
+
client = new LanguageClient(
|
|
34
|
+
'collie-lsp',
|
|
35
|
+
'Collie LSP',
|
|
36
|
+
serverOptions,
|
|
37
|
+
clientOptions
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
client.start();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function deactivate(): Thenable<void> | undefined {
|
|
44
|
+
if (!client) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return client.stop();
|
|
48
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
%{
|
|
2
|
+
/* Test grammar file for collie-lsp */
|
|
3
|
+
#include <stdio.h>
|
|
4
|
+
%}
|
|
5
|
+
|
|
6
|
+
%token NUMBER
|
|
7
|
+
%token IDENTIFIER
|
|
8
|
+
%token PLUS MINUS
|
|
9
|
+
%token TIMES DIVIDE
|
|
10
|
+
|
|
11
|
+
%left PLUS MINUS
|
|
12
|
+
%left TIMES DIVIDE
|
|
13
|
+
|
|
14
|
+
%%
|
|
15
|
+
|
|
16
|
+
program
|
|
17
|
+
: expression
|
|
18
|
+
;
|
|
19
|
+
|
|
20
|
+
expression
|
|
21
|
+
: expression PLUS term
|
|
22
|
+
| expression MINUS term
|
|
23
|
+
| term
|
|
24
|
+
;
|
|
25
|
+
|
|
26
|
+
term
|
|
27
|
+
: term TIMES factor
|
|
28
|
+
| term DIVIDE factor
|
|
29
|
+
| factor
|
|
30
|
+
;
|
|
31
|
+
|
|
32
|
+
factor
|
|
33
|
+
: NUMBER
|
|
34
|
+
| IDENTIFIER
|
|
35
|
+
| '(' expression ')'
|
|
36
|
+
;
|
|
37
|
+
|
|
38
|
+
%%
|
|
39
|
+
|
|
40
|
+
int main() {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
metadata
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: collie-lsp
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Yudai Takada
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: language_server-protocol
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 3.17.0
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: 3.17.0
|
|
26
|
+
description: collie-lsp provides real-time linting, formatting, and code intelligence
|
|
27
|
+
features for .y grammar files in any LSP-compatible editor
|
|
28
|
+
email:
|
|
29
|
+
- t.yudai92@gmail.com
|
|
30
|
+
executables:
|
|
31
|
+
- collie-lsp
|
|
32
|
+
extensions: []
|
|
33
|
+
extra_rdoc_files: []
|
|
34
|
+
files:
|
|
35
|
+
- ".collie.yml.example"
|
|
36
|
+
- ".rspec"
|
|
37
|
+
- CHANGELOG.md
|
|
38
|
+
- LICENSE
|
|
39
|
+
- README.md
|
|
40
|
+
- Rakefile
|
|
41
|
+
- collie-lsp.gemspec
|
|
42
|
+
- exe/collie-lsp
|
|
43
|
+
- lib/collie_lsp.rb
|
|
44
|
+
- lib/collie_lsp/collie_wrapper.rb
|
|
45
|
+
- lib/collie_lsp/document_store.rb
|
|
46
|
+
- lib/collie_lsp/handlers/code_action.rb
|
|
47
|
+
- lib/collie_lsp/handlers/completion.rb
|
|
48
|
+
- lib/collie_lsp/handlers/definition.rb
|
|
49
|
+
- lib/collie_lsp/handlers/diagnostics.rb
|
|
50
|
+
- lib/collie_lsp/handlers/document_symbol.rb
|
|
51
|
+
- lib/collie_lsp/handlers/folding_range.rb
|
|
52
|
+
- lib/collie_lsp/handlers/formatting.rb
|
|
53
|
+
- lib/collie_lsp/handlers/hover.rb
|
|
54
|
+
- lib/collie_lsp/handlers/references.rb
|
|
55
|
+
- lib/collie_lsp/handlers/rename.rb
|
|
56
|
+
- lib/collie_lsp/handlers/semantic_tokens.rb
|
|
57
|
+
- lib/collie_lsp/handlers/workspace_symbol.rb
|
|
58
|
+
- lib/collie_lsp/protocol/initialize.rb
|
|
59
|
+
- lib/collie_lsp/protocol/shutdown.rb
|
|
60
|
+
- lib/collie_lsp/protocol/text_document.rb
|
|
61
|
+
- lib/collie_lsp/server.rb
|
|
62
|
+
- lib/collie_lsp/version.rb
|
|
63
|
+
- vscode-extension/.gitignore
|
|
64
|
+
- vscode-extension/.vscode/launch.json
|
|
65
|
+
- vscode-extension/.vscode/tasks.json
|
|
66
|
+
- vscode-extension/README.md
|
|
67
|
+
- vscode-extension/package.json
|
|
68
|
+
- vscode-extension/src/extension.ts
|
|
69
|
+
- vscode-extension/test-grammar.y
|
|
70
|
+
- vscode-extension/tsconfig.json
|
|
71
|
+
homepage: https://github.com/ydah/collie-lsp
|
|
72
|
+
licenses:
|
|
73
|
+
- MIT
|
|
74
|
+
metadata:
|
|
75
|
+
homepage_uri: https://github.com/ydah/collie-lsp
|
|
76
|
+
source_code_uri: https://github.com/ydah/collie-lsp
|
|
77
|
+
changelog_uri: https://github.com/ydah/collie-lsp/blob/main/CHANGELOG.md
|
|
78
|
+
bug_tracker_uri: https://github.com/ydah/collie-lsp/issues
|
|
79
|
+
documentation_uri: https://github.com/ydah/collie-lsp/blob/main/README.md
|
|
80
|
+
rubygems_mfa_required: 'true'
|
|
81
|
+
rdoc_options: []
|
|
82
|
+
require_paths:
|
|
83
|
+
- lib
|
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 3.2.0
|
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
|
+
requirements:
|
|
91
|
+
- - ">="
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '0'
|
|
94
|
+
requirements: []
|
|
95
|
+
rubygems_version: 3.6.9
|
|
96
|
+
specification_version: 4
|
|
97
|
+
summary: Language Server Protocol implementation for Lrama Style BNF grammar files
|
|
98
|
+
test_files: []
|