|
@@ -37,6 +37,9 @@ namespace lsp {
|
|
|
|
|
|
typedef String DocumentUri;
|
|
|
|
|
|
+/** Format BBCode documentation from DocData to markdown */
|
|
|
+static String marked_documentation(const String &p_bbcode);
|
|
|
+
|
|
|
/**
|
|
|
* Text documents are identified using a URI. On the protocol level, URIs are passed as strings.
|
|
|
*/
|
|
@@ -282,6 +285,9 @@ struct Command {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
+// lsp::EnumName::EnumValue is OK but lsp::EnumValue is not
|
|
|
+
|
|
|
namespace TextDocumentSyncKind {
|
|
|
/**
|
|
|
* Documents should not be synced at all.
|
|
@@ -592,6 +598,7 @@ struct TextDocumentContentChangeEvent {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
namespace DiagnosticSeverity {
|
|
|
/**
|
|
|
* Reports an error.
|
|
@@ -692,6 +699,7 @@ struct Diagnostic {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
/**
|
|
|
* Describes the content type that a client supports in various
|
|
|
* result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
|
|
@@ -756,6 +764,9 @@ struct MarkupContent {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
+// lsp::EnumName::EnumValue is OK but lsp::EnumValue is not
|
|
|
+// And here C++ compilers are unhappy with our enumeration name like Color, File, Reference etc.
|
|
|
/**
|
|
|
* The kind of a completion entry.
|
|
|
*/
|
|
@@ -787,6 +798,7 @@ static const int Operator = 24;
|
|
|
static const int TypeParameter = 25;
|
|
|
}; // namespace CompletionItemKind
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
/**
|
|
|
* Defines whether the insert text in a completion item should be interpreted as
|
|
|
* plain text or a snippet.
|
|
@@ -979,36 +991,39 @@ struct CompletionList {
|
|
|
Vector<CompletionItem> items;
|
|
|
};
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
+// lsp::EnumName::EnumValue is OK but lsp::EnumValue is not
|
|
|
+// And here C++ compilers are unhappy with our enumeration name like String, Array, Object etc
|
|
|
/**
|
|
|
* A symbol kind.
|
|
|
*/
|
|
|
namespace SymbolKind {
|
|
|
-static const int File = 1;
|
|
|
-static const int Module = 2;
|
|
|
-static const int Namespace = 3;
|
|
|
-static const int Package = 4;
|
|
|
-static const int Class = 5;
|
|
|
-static const int Method = 6;
|
|
|
-static const int Property = 7;
|
|
|
-static const int Field = 8;
|
|
|
-static const int Constructor = 9;
|
|
|
-static const int Enum = 10;
|
|
|
-static const int Interface = 11;
|
|
|
-static const int Function = 12;
|
|
|
-static const int Variable = 13;
|
|
|
-static const int Constant = 14;
|
|
|
-static const int String = 15;
|
|
|
-static const int Number = 16;
|
|
|
-static const int Boolean = 17;
|
|
|
-static const int Array = 18;
|
|
|
-static const int Object = 19;
|
|
|
-static const int Key = 20;
|
|
|
-static const int Null = 21;
|
|
|
-static const int EnumMember = 22;
|
|
|
-static const int Struct = 23;
|
|
|
-static const int Event = 24;
|
|
|
-static const int Operator = 25;
|
|
|
-static const int TypeParameter = 26;
|
|
|
+static const int File = 0;
|
|
|
+static const int Module = 1;
|
|
|
+static const int Namespace = 2;
|
|
|
+static const int Package = 3;
|
|
|
+static const int Class = 4;
|
|
|
+static const int Method = 5;
|
|
|
+static const int Property = 6;
|
|
|
+static const int Field = 7;
|
|
|
+static const int Constructor = 8;
|
|
|
+static const int Enum = 9;
|
|
|
+static const int Interface = 10;
|
|
|
+static const int Function = 11;
|
|
|
+static const int Variable = 12;
|
|
|
+static const int Constant = 13;
|
|
|
+static const int String = 14;
|
|
|
+static const int Number = 15;
|
|
|
+static const int Boolean = 16;
|
|
|
+static const int Array = 17;
|
|
|
+static const int Object = 18;
|
|
|
+static const int Key = 19;
|
|
|
+static const int Null = 20;
|
|
|
+static const int EnumMember = 21;
|
|
|
+static const int Struct = 22;
|
|
|
+static const int Event = 23;
|
|
|
+static const int Operator = 24;
|
|
|
+static const int TypeParameter = 25;
|
|
|
}; // namespace SymbolKind
|
|
|
|
|
|
/**
|
|
@@ -1134,7 +1149,7 @@ struct DocumentSymbol {
|
|
|
*/
|
|
|
Vector<DocumentSymbol> children;
|
|
|
|
|
|
- _FORCE_INLINE_ Dictionary to_json() const {
|
|
|
+ Dictionary to_json(bool with_doc = false) const {
|
|
|
Dictionary dict;
|
|
|
dict["name"] = name;
|
|
|
dict["detail"] = detail;
|
|
@@ -1142,10 +1157,14 @@ struct DocumentSymbol {
|
|
|
dict["deprecated"] = deprecated;
|
|
|
dict["range"] = range.to_json();
|
|
|
dict["selectionRange"] = selectionRange.to_json();
|
|
|
+ if (with_doc) {
|
|
|
+ dict["documentation"] = documentation;
|
|
|
+ dict["native_class"] = native_class;
|
|
|
+ }
|
|
|
Array arr;
|
|
|
arr.resize(children.size());
|
|
|
for (int i = 0; i < children.size(); i++) {
|
|
|
- arr[i] = children[i].to_json();
|
|
|
+ arr[i] = children[i].to_json(with_doc);
|
|
|
}
|
|
|
dict["children"] = arr;
|
|
|
return dict;
|
|
@@ -1177,7 +1196,7 @@ struct DocumentSymbol {
|
|
|
markdown.value = "\t" + detail + "\n\n";
|
|
|
}
|
|
|
if (documentation.length()) {
|
|
|
- markdown.value += documentation + "\n\n";
|
|
|
+ markdown.value += marked_documentation(documentation) + "\n\n";
|
|
|
}
|
|
|
if (script_path.length()) {
|
|
|
markdown.value += "Defined in [" + script_path + "](" + uri + ")";
|
|
@@ -1229,6 +1248,17 @@ struct DocumentSymbol {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+struct NativeSymbolInspectParams {
|
|
|
+
|
|
|
+ String native_class;
|
|
|
+ String symbol_name;
|
|
|
+
|
|
|
+ void load(const Dictionary &p_params) {
|
|
|
+ native_class = p_params["native_class"];
|
|
|
+ symbol_name = p_params["symbol_name"];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* Enum of known range kinds
|
|
|
*/
|
|
@@ -1289,6 +1319,7 @@ struct FoldingRange {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// Use namespace instead of enumeration to follow the LSP specifications
|
|
|
/**
|
|
|
* How a completion was triggered
|
|
|
*/
|
|
@@ -1536,6 +1567,61 @@ struct InitializeResult {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+/** Format BBCode documentation from DocData to markdown */
|
|
|
+static String marked_documentation(const String &p_bbcode) {
|
|
|
+
|
|
|
+ String markdown = p_bbcode.strip_edges();
|
|
|
+
|
|
|
+ Vector<String> lines = markdown.split("\n");
|
|
|
+ bool in_code_block = false;
|
|
|
+ int code_block_indent = -1;
|
|
|
+
|
|
|
+ markdown = "";
|
|
|
+ for (int i = 0; i < lines.size(); i++) {
|
|
|
+ String line = lines[i];
|
|
|
+ int block_start = line.find("[codeblock]");
|
|
|
+ if (block_start != -1) {
|
|
|
+ code_block_indent = block_start;
|
|
|
+ in_code_block = true;
|
|
|
+ line = "\n";
|
|
|
+ } else if (in_code_block) {
|
|
|
+ line = "\t" + line.substr(code_block_indent, line.length());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (in_code_block && line.find("[/codeblock]") != -1) {
|
|
|
+ line = "\n";
|
|
|
+ in_code_block = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!in_code_block) {
|
|
|
+ line = line.strip_edges();
|
|
|
+ line = line.replace("[code]", "`");
|
|
|
+ line = line.replace("[/code]", "`");
|
|
|
+ line = line.replace("[i]", "*");
|
|
|
+ line = line.replace("[/i]", "*");
|
|
|
+ line = line.replace("[b]", "**");
|
|
|
+ line = line.replace("[/b]", "**");
|
|
|
+ line = line.replace("[u]", "__");
|
|
|
+ line = line.replace("[/u]", "__");
|
|
|
+ line = line.replace("[method ", "`");
|
|
|
+ line = line.replace("[member ", "`");
|
|
|
+ line = line.replace("[signal ", "`");
|
|
|
+ line = line.replace("[enum ", "`");
|
|
|
+ line = line.replace("[constant ", "`");
|
|
|
+ line = line.replace("[", "`");
|
|
|
+ line = line.replace("]", "`");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!in_code_block && i < lines.size() - 1) {
|
|
|
+ line += "\n\n";
|
|
|
+ } else if (i < lines.size() - 1) {
|
|
|
+ line += "\n";
|
|
|
+ }
|
|
|
+ markdown += line;
|
|
|
+ }
|
|
|
+ return markdown;
|
|
|
+}
|
|
|
+
|
|
|
} // namespace lsp
|
|
|
|
|
|
#endif
|