summaryrefslogtreecommitdiffstats
path: root/source/compiler-core
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-06-16 01:50:43 -0700
committerGitHub <noreply@github.com>2022-06-16 01:50:43 -0700
commit241def9c7619c437aad1bb620be8891e61707d8d (patch)
treed412a108bcd4bc9e52e0d6bf230b16d90df632d2 /source/compiler-core
parent23f567323e36a14e0649899b5b8811312d7ea9fd (diff)
Language server: document symbols (#2287)
* Language Server: Document Symbol outline. * Fix highlighting of extension decls. Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/compiler-core')
-rw-r--r--source/compiler-core/slang-language-server-protocol.cpp30
-rw-r--r--source/compiler-core/slang-language-server-protocol.h87
2 files changed, 117 insertions, 0 deletions
diff --git a/source/compiler-core/slang-language-server-protocol.cpp b/source/compiler-core/slang-language-server-protocol.cpp
index 713d209dd..51799f05e 100644
--- a/source/compiler-core/slang-language-server-protocol.cpp
+++ b/source/compiler-core/slang-language-server-protocol.cpp
@@ -215,6 +215,7 @@ static const StructRttiInfo _makeServerCapabilitiesRtti()
builder.addField("completionProvider", &obj.completionProvider);
builder.addField("semanticTokensProvider", &obj.semanticTokensProvider);
builder.addField("signatureHelpProvider", &obj.signatureHelpProvider);
+ builder.addField("documentSymbolProvider", &obj.documentSymbolProvider);
builder.ignoreUnknownFields();
return builder.make();
}
@@ -574,6 +575,35 @@ const StructRttiInfo LogMessageParams::g_rttiInfo = _makeLogMessageParamsRtti();
const UnownedStringSlice LogMessageParams::methodName =
UnownedStringSlice::fromLiteral("window/logMessage");
+static const StructRttiInfo _makeDocumentSymbolParamsRtti()
+{
+ DocumentSymbolParams obj;
+ StructRttiBuilder builder(
+ &obj, "LanguageServerProtocol::DocumentSymbolParams", &WorkDoneProgressParams::g_rttiInfo);
+ builder.addField("textDocument", &obj.textDocument);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo DocumentSymbolParams::g_rttiInfo = _makeDocumentSymbolParamsRtti();
+const UnownedStringSlice DocumentSymbolParams::methodName =
+ UnownedStringSlice::fromLiteral("textDocument/documentSymbol");
+
+static const StructRttiInfo _makeDocumentSymbolRtti()
+{
+ DocumentSymbol obj;
+ StructRttiBuilder builder(
+ &obj, "LanguageServerProtocol::DocumentSymbol", nullptr);
+ builder.addField("name", &obj.name);
+ builder.addField("detail", &obj.detail);
+ builder.addField("kind", &obj.kind);
+ builder.addField("range", &obj.range);
+ builder.addField("selectionRange", &obj.selectionRange);
+ builder.addField("children", &obj.children);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo DocumentSymbol::g_rttiInfo = _makeDocumentSymbolRtti();
+
} // namespace LanguageServerProtocol
}
diff --git a/source/compiler-core/slang-language-server-protocol.h b/source/compiler-core/slang-language-server-protocol.h
index 11446bd0b..7d9d8d5cb 100644
--- a/source/compiler-core/slang-language-server-protocol.h
+++ b/source/compiler-core/slang-language-server-protocol.h
@@ -238,6 +238,7 @@ struct ServerCapabilities
TextDocumentSyncOptions textDocumentSync;
bool hoverProvider = false;
bool definitionProvider = false;
+ bool documentSymbolProvider = false;
CompletionOptions completionProvider;
SemanticTokensOptions semanticTokensProvider;
SignatureHelpOptions signatureHelpProvider;
@@ -740,5 +741,91 @@ struct LogMessageParams
static const UnownedStringSlice methodName;
};
+struct DocumentSymbolParams : WorkDoneProgressParams
+{
+ /**
+ * The text document.
+ */
+ TextDocumentIdentifier textDocument;
+
+ static const StructRttiInfo g_rttiInfo;
+ static const UnownedStringSlice methodName;
+};
+
+typedef int SymbolKind;
+const int kSymbolKindFile = 1;
+const int kSymbolKindModule = 2;
+const int kSymbolKindNamespace = 3;
+const int kSymbolKindPackage = 4;
+const int kSymbolKindClass = 5;
+const int kSymbolKindMethod = 6;
+const int kSymbolKindProperty = 7;
+const int kSymbolKindField = 8;
+const int kSymbolKindConstructor = 9;
+const int kSymbolKindEnum = 10;
+const int kSymbolKindInterface = 11;
+const int kSymbolKindFunction = 12;
+const int kSymbolKindVariable = 13;
+const int kSymbolKindConstant = 14;
+const int kSymbolKindString = 15;
+const int kSymbolKindNumber = 16;
+const int kSymbolKindBoolean = 17;
+const int kSymbolKindArray = 18;
+const int kSymbolKindObject = 19;
+const int kSymbolKindKey = 20;
+const int kSymbolKindNull = 21;
+const int kSymbolKindEnumMember = 22;
+const int kSymbolKindStruct = 23;
+const int kSymbolKindEvent = 24;
+const int kSymbolKindOperator = 25;
+const int kSymbolKindTypeParameter = 26;
+
+/**
+ * Represents programming constructs like variables, classes, interfaces etc.
+ * that appear in a document. Document symbols can be hierarchical and they
+ * have two ranges: one that encloses its definition and one that points to its
+ * most interesting range, e.g. the range of an identifier.
+ */
+struct DocumentSymbol {
+
+ /**
+ * The name of this symbol. Will be displayed in the user interface and
+ * therefore must not be an empty string or a string only consisting of
+ * white spaces.
+ */
+ String name;
+
+ /**
+ * More detail for this symbol, e.g the signature of a function.
+ */
+ String detail;
+
+ /**
+ * The kind of this symbol.
+ */
+ SymbolKind kind;
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace
+ * but everything else like comments. This information is typically used to
+ * determine if the clients cursor is inside the symbol to reveal in the
+ * symbol in the UI.
+ */
+ Range range;
+
+ /**
+ * The range that should be selected and revealed when this symbol is being
+ * picked, e.g. the name of a function. Must be contained by the `range`.
+ */
+ Range selectionRange;
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ List<DocumentSymbol> children;
+
+ static const StructRttiInfo g_rttiInfo;
+};
+
} // namespace LanguageServerProtocol
} // namespace Slang