Skip to content

Commit

Permalink
Showing 22 changed files with 93 additions and 220 deletions.
1 change: 0 additions & 1 deletion apps/proto/.formatter.exs
Original file line number Diff line number Diff line change
@@ -4,7 +4,6 @@ proto_dsl = [
defenum: 1,
defnotification: 1,
defnotification: 2,
defrequest: 1,
defrequest: 2,
defresponse: 1,
deftype: 1
2 changes: 1 addition & 1 deletion apps/proto/lib/lexical/proto.ex
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ defmodule Lexical.Proto do
import Proto.Alias, only: [defalias: 1]
import Proto.Enum, only: [defenum: 1]
import Proto.Notification, only: [defnotification: 1, defnotification: 2]
import Proto.Request, only: [defrequest: 1, defrequest: 2]
import Proto.Request, only: [defrequest: 2]
import Proto.Response, only: [defresponse: 1]
import Proto.Type, only: [deftype: 1]
end
13 changes: 0 additions & 13 deletions apps/proto/lib/lexical/proto/alias.ex
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
defmodule Lexical.Proto.Alias do
alias Lexical.Proto.CompileMetadata
alias Lexical.Proto.Field

defmacro defalias(alias_definition) do
caller_module = __CALLER__.module
CompileMetadata.add_type_alias_module(caller_module)

quote location: :keep do
def parse(lsp_map) do
Field.extract(unquote(alias_definition), :alias, lsp_map)
end

def definition do
unquote(alias_definition)
end
@@ -22,14 +17,6 @@ defmodule Lexical.Proto.Alias do
def __meta__(:param_names) do
[]
end

def __meta__(:definition) do
unquote(alias_definition)
end

def __meta__(:raw_definition) do
unquote(Macro.escape(alias_definition))
end
end
end
end
4 changes: 0 additions & 4 deletions apps/proto/lib/lexical/proto/macros/meta.ex
Original file line number Diff line number Diff line change
@@ -11,10 +11,6 @@ defmodule Lexical.Proto.Macros.Meta do
def __meta__(:types) do
%{unquote_splicing(opts)}
end

def __meta__(:raw_types) do
unquote(Macro.escape(opts))
end
end
end

24 changes: 5 additions & 19 deletions apps/proto/lib/lexical/proto/notification.ex
Original file line number Diff line number Diff line change
@@ -2,22 +2,8 @@ defmodule Lexical.Proto.Notification do
alias Lexical.Proto.CompileMetadata
alias Lexical.Proto.Macros.Message

defmacro defnotification(method) do
do_defnotification(method, [], __CALLER__)
end

defmacro defnotification(method, params_module_ast) do
params_module =
params_module_ast
|> Macro.expand(__CALLER__)
|> Code.ensure_compiled!()

types = params_module.__meta__(:raw_types)
do_defnotification(method, types, __CALLER__)
end

defp do_defnotification(method, types, caller) do
CompileMetadata.add_notification_module(caller.module)
defmacro defnotification(method, types \\ []) do
CompileMetadata.add_notification_module(__CALLER__.module)

jsonrpc_types = [
jsonrpc: quote(do: literal("2.0")),
@@ -26,8 +12,8 @@ defmodule Lexical.Proto.Notification do

param_names = Keyword.keys(types)
lsp_types = Keyword.merge(jsonrpc_types, types)
elixir_types = Message.generate_elixir_types(caller.module, lsp_types)
lsp_module_name = Module.concat(caller.module, LSP)
elixir_types = Message.generate_elixir_types(__CALLER__.module, lsp_types)
lsp_module_name = Module.concat(__CALLER__.module, LSP)

quote location: :keep do
defmodule LSP do
@@ -56,7 +42,7 @@ defmodule Lexical.Proto.Notification do
struct(__MODULE__, lsp: LSP.new(opts), method: unquote(method), jsonrpc: "2.0")
end

defimpl Jason.Encoder, for: unquote(caller.module) do
defimpl Jason.Encoder, for: unquote(__CALLER__.module) do
def encode(notification, opts) do
Jason.Encoder.encode(notification.lsp, opts)
end
24 changes: 5 additions & 19 deletions apps/proto/lib/lexical/proto/request.ex
Original file line number Diff line number Diff line change
@@ -5,22 +5,8 @@ defmodule Lexical.Proto.Request do

import TypeFunctions, only: [optional: 1, literal: 1]

defmacro defrequest(method) do
do_defrequest(method, [], __CALLER__)
end

defmacro defrequest(method, params_module_ast) do
params_module =
params_module_ast
|> Macro.expand(__CALLER__)
|> Code.ensure_compiled!()

types = params_module.__meta__(:raw_types)
do_defrequest(method, types, __CALLER__)
end

defp do_defrequest(method, types, caller) do
CompileMetadata.add_request_module(caller.module)
defmacro defrequest(method, types) do
CompileMetadata.add_request_module(__CALLER__.module)
# id is optional so we can resuse the parse function. If it's required,
# it will go in the pattern match for the params, which won't work.

@@ -31,9 +17,9 @@ defmodule Lexical.Proto.Request do
]

lsp_types = Keyword.merge(jsonrpc_types, types)
elixir_types = Message.generate_elixir_types(caller.module, lsp_types)
elixir_types = Message.generate_elixir_types(__CALLER__.module, lsp_types)
param_names = Keyword.keys(types)
lsp_module_name = Module.concat(caller.module, LSP)
lsp_module_name = Module.concat(__CALLER__.module, LSP)

quote location: :keep do
defmodule LSP do
@@ -66,7 +52,7 @@ defmodule Lexical.Proto.Request do
struct(__MODULE__, lsp: raw, id: raw.id, method: unquote(method), jsonrpc: "2.0")
end

defimpl Jason.Encoder, for: unquote(caller.module) do
defimpl Jason.Encoder, for: unquote(__CALLER__.module) do
def encode(request, opts) do
Jason.Encoder.encode(request.lsp, opts)
end

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
defmodule Lexical.Protocol.Types.TextDocument.ContentChangeEvent do
alias Lexical.Proto
alias Lexical.Protocol.Types
alias __MODULE__, as: Parent

defmodule TextDocumentContentChangeEvent do
use Proto
@@ -14,5 +15,5 @@ defmodule Lexical.Protocol.Types.TextDocument.ContentChangeEvent do
end

use Proto
defalias one_of([TextDocumentContentChangeEvent, TextDocumentContentChangeEvent1])
defalias one_of([Parent.TextDocumentContentChangeEvent, Parent.TextDocumentContentChangeEvent1])
end
35 changes: 25 additions & 10 deletions apps/protocol/lib/lexical/protocol/notifications.ex
Original file line number Diff line number Diff line change
@@ -16,56 +16,69 @@ defmodule Lexical.Protocol.Notifications do
defmodule Cancel do
use Proto

defnotification "$/cancelRequest", Types.Cancel.Params
defnotification "$/cancelRequest", id: integer()
end

defmodule DidOpen do
use Proto

defnotification "textDocument/didOpen", Types.DidOpenTextDocument.Params
defnotification "textDocument/didOpen", text_document: Types.TextDocument.Item
end

defmodule DidClose do
use Proto

defnotification "textDocument/didClose", Types.DidCloseTextDocument.Params
defnotification "textDocument/didClose", text_document: Types.TextDocument.Identifier
end

defmodule DidChange do
use Proto

defnotification "textDocument/didChange", Types.DidChangeTextDocument.Params
defnotification "textDocument/didChange",
text_document: Types.TextDocument.Versioned.Identifier,
content_changes:
list_of(
one_of([
Types.TextDocument.ContentChangeEvent.TextDocumentContentChangeEvent,
Types.TextDocument.ContentChangeEvent.TextDocumentContentChangeEvent1
])
)
end

defmodule DidChangeConfiguration do
use Proto

defnotification "workspace/didChangeConfiguration", Types.DidChangeConfiguration.Params
defnotification "workspace/didChangeConfiguration", settings: map_of(any())
end

defmodule DidChangeWatchedFiles do
use Proto

defnotification "workspace/didChangeWatchedFiles", Types.DidChangeWatchedFiles.Params
defnotification "workspace/didChangeWatchedFiles", changes: list_of(Types.FileEvent)
end

defmodule DidSave do
use Proto

defnotification "textDocument/didSave", Types.DidSaveTextDocument.Params
defnotification "textDocument/didSave", text_document: Types.TextDocument.Identifier
end

defmodule PublishDiagnostics do
use Proto

defnotification "textDocument/publishDiagnostics", Types.PublishDiagnostics.Params
defnotification "textDocument/publishDiagnostics",
uri: string(),
version: optional(integer()),
diagnostics: list_of(Types.Diagnostic)
end

defmodule LogMessage do
use Proto
require Types.Message.Type

defnotification "window/logMessage", Types.LogMessage.Params
defnotification "window/logMessage",
message: string(),
type: Types.Message.Type

for type <- [:error, :warning, :info, :log] do
def unquote(type)(message) do
@@ -78,7 +91,9 @@ defmodule Lexical.Protocol.Notifications do
use Proto
require Types.Message.Type

defnotification "window/showMessage", Types.ShowMessage.Params
defnotification "window/showMessage",
message: string(),
type: Types.Message.Type

for type <- [:error, :warning, :info, :log] do
def unquote(type)(message) do
41 changes: 32 additions & 9 deletions apps/protocol/lib/lexical/protocol/requests.ex
Original file line number Diff line number Diff line change
@@ -1,62 +1,85 @@
defmodule Lexical.Protocol.Requests do
alias Lexical.Proto
alias Lexical.Protocol.LspTypes
alias Lexical.Protocol.Types

# Client -> Server request
defmodule Initialize do
use Proto

defrequest "initialize", Types.Initialize.Params
defrequest "initialize",
capabilities: optional(Types.ClientCapabilities),
client_info: optional(LspTypes.ClientInfo),
initialization_options: optional(any()),
locale: optional(string()),
process_id: optional(integer()),
root_path: optional(string()),
root_uri: optional(uri()),
trace: optional(Types.TraceValues),
workspace_folders: optional(list_of(Types.Workspace.Folder))
end

defmodule Cancel do
use Proto

defrequest "$/cancelRequest", Types.Cancel.Params
defrequest "$/cancelRequest", id: one_of([string(), integer()])
end

defmodule Shutdown do
use Proto

defrequest "shutdown"
defrequest "shutdown", []
end

defmodule FindReferences do
use Proto

defrequest "textDocument/references", Types.Reference.Params
defrequest "textDocument/references",
position: Types.Position,
text_document: Types.TextDocument.Identifier
end

defmodule GoToDefinition do
use Proto

defrequest "textDocument/definition", Types.Definition.Params
defrequest "textDocument/definition",
text_document: Types.TextDocument.Identifier,
position: Types.Position
end

defmodule Formatting do
use Proto

defrequest "textDocument/formatting", Types.Document.Formatting.Params
defrequest "textDocument/formatting",
options: Types.Formatting.Options,
text_document: Types.TextDocument.Identifier
end

defmodule CodeAction do
use Proto

defrequest "textDocument/codeAction", Types.CodeAction.Params
defrequest "textDocument/codeAction",
context: Types.CodeAction.Context,
range: Types.Range,
text_document: Types.TextDocument.Identifier
end

defmodule Completion do
use Proto

defrequest "textDocument/completion", Types.Completion.Params
defrequest "textDocument/completion",
text_document: Types.TextDocument.Identifier,
position: Types.Position,
context: Types.Completion.Context
end

# Server -> Client requests

defmodule RegisterCapability do
use Proto

defrequest "client/registerCapability", Types.Registration.Params
defrequest "client/registerCapability",
registrations: optional(list_of(LspTypes.Registration))
end

use Proto, decoders: :requests
7 changes: 3 additions & 4 deletions apps/protocol/mix.exs
Original file line number Diff line number Diff line change
@@ -30,11 +30,10 @@ defmodule Lexical.Protocol.MixProject do
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:common, in_umbrella: true},
{:common_protocol, in_umbrella: true},
{:jason, "~> 1.4", optional: true},
{:patch, "~> 0.12", only: [:test]},
{:proto, in_umbrella: true}
{:common, in_umbrella: true},
{:proto, in_umbrella: true},
{:common_protocol, in_umbrella: true}
]
end
end
81 changes: 20 additions & 61 deletions apps/protocol/test/lexical/proto_test.exs
Original file line number Diff line number Diff line change
@@ -342,18 +342,13 @@ defmodule Lexical.ProtoTest do
describe "notifications" do
setup [:with_source_file_store]

defmodule Notif.Params do
use Proto

deftype line: integer(),
notice_message: string(),
column: integer()
end

defmodule Notif do
use Proto

defnotification "textDocument/somethingHappened", Notif.Params
defnotification "textDocument/somethingHappened",
line: integer(),
notice_message: string(),
column: integer()
end

test "parse fills out the notification" do
@@ -392,16 +387,11 @@ defmodule Lexical.ProtoTest do
assert notif.notice_message == "This went wrong"
end

defmodule Notif.WithTextDoc.Params do
use Proto

deftype text_document: Types.TextDocument.Identifier
end

defmodule Notif.WithTextDoc do
use Proto

defnotification "notif/withTextDoc", Notif.WithTextDoc.Params
defnotification "notif/withTextDoc",
text_document: Types.TextDocument.Identifier
end

test "to_native fills out the source file", ctx do
@@ -411,17 +401,12 @@ defmodule Lexical.ProtoTest do
assert %SourceFile{} = notif.source_file
end

defmodule Notif.WithPos.Params do
use Proto

deftype text_document: Types.TextDocument.Identifier,
position: Types.Position
end

defmodule Notif.WithPos do
use Proto

defnotification "notif/WithPos", Notif.WithPos.Params
defnotification "notif/WithPos",
text_document: Types.TextDocument.Identifier,
position: Types.Position
end

test "to_native fills out a position", ctx do
@@ -441,17 +426,12 @@ defmodule Lexical.ProtoTest do
assert notif.position.character == 1
end

defmodule Notif.WithRange.Params do
use Proto

deftype text_document: Types.TextDocument.Identifier,
range: Types.Range
end

defmodule Notif.WithRange do
use Proto

defnotification "notif/WithRange", Notif.WithRange.Params
defnotification "notif/WithPos",
text_document: Types.TextDocument.Identifier,
range: Types.Range
end

test "to_native fills out a range", ctx do
@@ -479,27 +459,16 @@ defmodule Lexical.ProtoTest do
describe "requests" do
setup [:with_source_file_store]

defmodule Req.Params do
use Proto

deftype line: integer(), error_message: string()
end

defmodule Req do
use Proto

defrequest "something", Req.Params
end

defmodule TextDocReq.Params do
use Proto
deftype text_document: Types.TextDocument.Identifier
defrequest "something", line: integer(), error_message: string()
end

defmodule TextDocReq do
use Proto

defrequest "textDoc", TextDocReq.Params
defrequest "textDoc", text_document: Types.TextDocument.Identifier
end

test "parse fills out the request" do
@@ -545,17 +514,12 @@ defmodule Lexical.ProtoTest do
assert %SourceFile{} = ex_req.source_file
end

defmodule PositionReq.Params do
use Proto

deftype text_document: Types.TextDocument.Identifier,
position: Types.Position
end

defmodule PositionReq do
use Proto

defrequest "posReq", PositionReq.Params
defrequest "posReq",
text_document: Types.TextDocument.Identifier,
position: Types.Position
end

test "to_native fills out a position", ctx do
@@ -576,17 +540,12 @@ defmodule Lexical.ProtoTest do
assert %SourceFile{} = ex_req.source_file
end

defmodule RangeReq.Params do
use Proto

deftype text_document: Types.TextDocument.Identifier,
range: Types.Range
end

defmodule RangeReq do
use Proto

defrequest "rangeReq", RangeReq.Params
defrequest "rangeReq",
text_document: Types.TextDocument.Identifier,
range: Types.Range
end

test "to_native fills out a range", ctx do

0 comments on commit ef8099d

Please sign in to comment.