@@ -69,14 +69,38 @@ message ToolInfo {
69
69
70
70
// Document defines the metadata about a source file on disk.
71
71
message Document {
72
- // (Required) Path to the text document relative to the directory supplied in
73
- // the associated `Metadata.project_root`. Not URI-encoded. This value should
74
- // not begin with a directory separator.
72
+ // The string ID for the programming language this file is written in.
73
+ // The `Language` enum contains the names of most common programming languages.
74
+ // This field is typed as a string to permit any programming language, including
75
+ // ones that are not specified by the `Language` enum.
76
+ string language = 4 ;
77
+ // (Required) Unique path to the text document.
78
+ //
79
+ // 1. The path must be relative to the directory supplied in the associated
80
+ // `Metadata.project_root`.
81
+ // 2. The path must not begin with a leading '/'.
82
+ // 3. The path must point to a regular file, not a symbolic link.
83
+ // 4. The path must use '/' as the separator, including on Windows.
84
+ // 5. The path must be canonical; it cannot include empty components ('//'),
85
+ // or '.' or '..'.
75
86
string relative_path = 1 ;
76
87
// Occurrences that appear in this file.
77
88
repeated Occurrence occurrences = 2 ;
78
- // Symbols that are defined within this document.
89
+ // Symbols that are "defined" within this document.
90
+ //
91
+ // This should include symbols which technically do not have any definition,
92
+ // but have a reference and are defined by some other symbol (see
93
+ // Relationship.is_definition).
79
94
repeated SymbolInformation symbols = 3 ;
95
+
96
+ // (optional) Text contents of the this document. Indexers are not expected to
97
+ // include the text by default. It's preferrable that clients read the text
98
+ // contents from the file system by resolving the absolute path from joining
99
+ // `Index.metadata.project_root` and `Document.relative_path`. This field was
100
+ // introduced to support `SymbolInformation.signature_documentation`, but it
101
+ // can be used for other purposes as well, for example testing or when working
102
+ // with virtual/in-memory documents.
103
+ string text = 5 ;
80
104
}
81
105
82
106
// Symbol is similar to a URI, it identifies a class, method, or a local
@@ -145,12 +169,205 @@ message SymbolInformation {
145
169
// The string must be formatted according to the grammar in `Symbol`.
146
170
string symbol = 1 ;
147
171
// (optional, but strongly recommended) The markdown-formatted documentation
148
- // for this symbol. This field is repeated to allow different kinds of
149
- // documentation. For example, it's nice to include both the signature of a
150
- // method (parameters and return type) along with the accompanying docstring.
172
+ // for this symbol. Use `SymbolInformation.signature_documentation` to
173
+ // document the method/class/type signature of this symbol.
174
+ // Due to historical reasons, indexers may include signature documentation in
175
+ // this field by rendering markdown code blocks. New indexers should only
176
+ // include non-code documentation in this field, for example docstrings.
151
177
repeated string documentation = 3 ;
152
178
// (optional) Relationships to other symbols (e.g., implements, type definition).
153
179
repeated Relationship relationships = 4 ;
180
+ // The kind of this symbol. Use this field instead of
181
+ // `SymbolDescriptor.Suffix` to determine whether something is, for example, a
182
+ // class or a method.
183
+ Kind kind = 5 ;
184
+ // (optional) Kind represents the fine-grained category of a symbol, suitable for presenting
185
+ // information about the symbol's meaning in the language.
186
+ //
187
+ // For example:
188
+ // - A Java method would have the kind `Method` while a Go function would
189
+ // have the kind `Function`, even if the symbols for these use the same
190
+ // syntax for the descriptor `SymbolDescriptor.Suffix.Method`.
191
+ // - A Go struct has the symbol kind `Struct` while a Java class has
192
+ // the symbol kind `Class` even if they both have the same descriptor:
193
+ // `SymbolDescriptor.Suffix.Type`.
194
+ //
195
+ // Since Kind is more fine-grained than Suffix:
196
+ // - If two symbols have the same Kind, they should share the same Suffix.
197
+ // - If two symbols have different Suffixes, they should have different Kinds.
198
+ enum Kind {
199
+ UnspecifiedKind = 0 ;
200
+ // A method which may or may not have a body. For Java, Kotlin etc.
201
+ AbstractMethod = 66 ;
202
+ // For Ruby's attr_accessor
203
+ Accessor = 72 ;
204
+ Array = 1 ;
205
+ // For Alloy
206
+ Assertion = 2 ;
207
+ AssociatedType = 3 ;
208
+ // For C++
209
+ Attribute = 4 ;
210
+ // For Lean
211
+ Axiom = 5 ;
212
+ Boolean = 6 ;
213
+ Class = 7 ;
214
+ Constant = 8 ;
215
+ Constructor = 9 ;
216
+ // For Solidity
217
+ Contract = 62 ;
218
+ // For Haskell
219
+ DataFamily = 10 ;
220
+ // For C# and F#
221
+ Delegate = 73 ;
222
+ Enum = 11 ;
223
+ EnumMember = 12 ;
224
+ Error = 63 ;
225
+ Event = 13 ;
226
+ // For Alloy
227
+ Fact = 14 ;
228
+ Field = 15 ;
229
+ File = 16 ;
230
+ Function = 17 ;
231
+ // For 'get' in Swift, 'attr_reader' in Ruby
232
+ Getter = 18 ;
233
+ // For Raku
234
+ Grammar = 19 ;
235
+ // For Purescript and Lean
236
+ Instance = 20 ;
237
+ Interface = 21 ;
238
+ Key = 22 ;
239
+ // For Racket
240
+ Lang = 23 ;
241
+ // For Lean
242
+ Lemma = 24 ;
243
+ // For solidity
244
+ Library = 64 ;
245
+ Macro = 25 ;
246
+ Method = 26 ;
247
+ // For Ruby
248
+ MethodAlias = 74 ;
249
+ // Analogous to 'ThisParameter' and 'SelfParameter', but for languages
250
+ // like Go where the receiver doesn't have a conventional name.
251
+ MethodReceiver = 27 ;
252
+ // Analogous to 'AbstractMethod', for Go.
253
+ MethodSpecification = 67 ;
254
+ // For Protobuf
255
+ Message = 28 ;
256
+ // For Solidity
257
+ Modifier = 65 ;
258
+ Module = 29 ;
259
+ Namespace = 30 ;
260
+ Null = 31 ;
261
+ Number = 32 ;
262
+ Object = 33 ;
263
+ Operator = 34 ;
264
+ Package = 35 ;
265
+ PackageObject = 36 ;
266
+ Parameter = 37 ;
267
+ ParameterLabel = 38 ;
268
+ // For Haskell's PatternSynonyms
269
+ Pattern = 39 ;
270
+ // For Alloy
271
+ Predicate = 40 ;
272
+ Property = 41 ;
273
+ // Analogous to 'Trait' and 'TypeClass', for Swift and Objective-C
274
+ Protocol = 42 ;
275
+ // Analogous to 'AbstractMethod', for Swift and Objective-C.
276
+ ProtocolMethod = 68 ;
277
+ // Analogous to 'AbstractMethod', for C++.
278
+ PureVirtualMethod = 69 ;
279
+ // For Haskell
280
+ Quasiquoter = 43 ;
281
+ // 'self' in Python, Rust, Swift etc.
282
+ SelfParameter = 44 ;
283
+ // For 'set' in Swift, 'attr_writer' in Ruby
284
+ Setter = 45 ;
285
+ // For Alloy, analogous to 'Struct'.
286
+ Signature = 46 ;
287
+ // For Ruby
288
+ SingletonClass = 75 ;
289
+ // Analogous to 'StaticMethod', for Ruby.
290
+ SingletonMethod = 76 ;
291
+ // Analogous to 'StaticField', for C++
292
+ StaticDataMember = 77 ;
293
+ // For C#
294
+ StaticEvent = 78 ;
295
+ // For C#
296
+ StaticField = 79 ;
297
+ // For Java, C#, C++ etc.
298
+ StaticMethod = 80 ;
299
+ // For C#, TypeScript etc.
300
+ StaticProperty = 81 ;
301
+ // For C, C++
302
+ StaticVariable = 82 ;
303
+ String = 48 ;
304
+ Struct = 49 ;
305
+ // For Swift
306
+ Subscript = 47 ;
307
+ // For Lean
308
+ Tactic = 50 ;
309
+ // For Lean
310
+ Theorem = 51 ;
311
+ // Method receiver for languages
312
+ // 'this' in JavaScript, C++, Java etc.
313
+ ThisParameter = 52 ;
314
+ // Analogous to 'Protocol' and 'TypeClass', for Rust, Scala etc.
315
+ Trait = 53 ;
316
+ // Analogous to 'AbstractMethod', for Rust, Scala etc.
317
+ TraitMethod = 70 ;
318
+ // Data type definition for languages like OCaml which use `type`
319
+ // rather than separate keywords like `struct` and `enum`.
320
+ Type = 54 ;
321
+ TypeAlias = 55 ;
322
+ // Analogous to 'Trait' and 'Protocol', for Haskell, Purescript etc.
323
+ TypeClass = 56 ;
324
+ // Analogous to 'AbstractMethod', for Haskell, Purescript etc.
325
+ TypeClassMethod = 71 ;
326
+ // For Haskell
327
+ TypeFamily = 57 ;
328
+ TypeParameter = 58 ;
329
+ // For C, C++, Capn Proto
330
+ Union = 59 ;
331
+ Value = 60 ;
332
+ Variable = 61 ;
333
+ // Next = 83;
334
+ // Feel free to open a PR proposing new language-specific kinds.
335
+ }
336
+ // (optional) The name of this symbol as it should be displayed to the user.
337
+ // For example, the symbol "com/example/MyClass#myMethod(+1)." should have the
338
+ // display name "myMethod". The `symbol` field is not a reliable source of
339
+ // the display name for several reasons:
340
+ //
341
+ // - Local symbols don't encode the name.
342
+ // - Some languages have case-insensitive names, so the symbol is all-lowercase.
343
+ // - The symbol may encode names with special characters that should not be
344
+ // displayed to the user.
345
+ string display_name = 6 ;
346
+ // (optional) The signature of this symbol as it's displayed in API
347
+ // documentation or in hover tooltips. For example, a Java method that adds
348
+ // two numbers this would have `Document.language = "java"` and `Document.text
349
+ // = "void add(int a, int b)". The `language` and `text` fields are required
350
+ // while other fields such as `Documentation.occurrences` can be optionally
351
+ // included to support hyperlinking referenced symbols in the signature.
352
+ Document signature_documentation = 7 ;
353
+ // (optional) The enclosing symbol if this is a local symbol. For non-local
354
+ // symbols, the enclosing symbol should be parsed from the `symbol` field
355
+ // using the `Descriptor` grammar.
356
+ //
357
+ // The primary use-case for this field is to allow local symbol to be displayed
358
+ // in a symbol hierarchy for API documentation. It's OK to leave this field
359
+ // empty for local variables since local variables usually don't belong in API
360
+ // documentation. However, in the situation that you wish to include a local
361
+ // symbol in the hierarchy, then you can use `enclosing_symbol` to locate the
362
+ // "parent" or "owner" of this local symbol. For example, a Java indexer may
363
+ // choose to use local symbols for private class fields while providing an
364
+ // `enclosing_symbol` to reference the enclosing class to allow the field to
365
+ // be part of the class documentation hierarchy. From the perspective of an
366
+ // author of an indexer, the decision to use a local symbol or global symbol
367
+ // should exclusively be determined whether the local symbol is accessible
368
+ // outside the document, not by the capability to find the enclosing
369
+ // symbol.
370
+ string enclosing_symbol = 8 ;
154
371
}
155
372
156
373
message Relationship {
@@ -382,3 +599,129 @@ enum DiagnosticTag {
382
599
Unnecessary = 1 ;
383
600
Deprecated = 2 ;
384
601
}
602
+
603
+ // Language standardises names of common programming languages that can be used
604
+ // for the `Document.language` field. The primary purpose of this enum is to
605
+ // prevent a situation where we have a single programming language ends up with
606
+ // multiple string representations. For example, the C++ language uses the name
607
+ // "CPP" in this enum and other names such as "cpp" are incompatible.
608
+ // Feel free to send a pull-request to add missing programming languages.
609
+ enum Language {
610
+ UnspecifiedLanguage = 0 ;
611
+ ABAP = 60 ;
612
+ Apex = 96 ;
613
+ APL = 49 ;
614
+ Ada = 39 ;
615
+ Agda = 45 ;
616
+ AsciiDoc = 86 ;
617
+ Assembly = 58 ;
618
+ Awk = 66 ;
619
+ Bat = 68 ;
620
+ BibTeX = 81 ;
621
+ C = 34 ;
622
+ COBOL = 59 ;
623
+ CPP = 35 ; // C++ (the name "CPP" was chosen for consistency with LSP)
624
+ CSS = 26 ;
625
+ CSharp = 1 ;
626
+ Clojure = 8 ;
627
+ Coffeescript = 21 ;
628
+ CommonLisp = 9 ;
629
+ Coq = 47 ;
630
+ CUDA = 97 ;
631
+ Dart = 3 ;
632
+ Delphi = 57 ;
633
+ Diff = 88 ;
634
+ Dockerfile = 80 ;
635
+ Dyalog = 50 ;
636
+ Elixir = 17 ;
637
+ Erlang = 18 ;
638
+ FSharp = 42 ;
639
+ Fish = 65 ;
640
+ Flow = 24 ;
641
+ Fortran = 56 ;
642
+ Git_Commit = 91 ;
643
+ Git_Config = 89 ;
644
+ Git_Rebase = 92 ;
645
+ Go = 33 ;
646
+ GraphQL = 98 ;
647
+ Groovy = 7 ;
648
+ HTML = 30 ;
649
+ Hack = 20 ;
650
+ Handlebars = 90 ;
651
+ Haskell = 44 ;
652
+ Idris = 46 ;
653
+ Ini = 72 ;
654
+ J = 51 ;
655
+ JSON = 75 ;
656
+ Java = 6 ;
657
+ JavaScript = 22 ;
658
+ JavaScriptReact = 93 ;
659
+ Jsonnet = 76 ;
660
+ Julia = 55 ;
661
+ Justfile = 109 ;
662
+ Kotlin = 4 ;
663
+ LaTeX = 83 ;
664
+ Lean = 48 ;
665
+ Less = 27 ;
666
+ Lua = 12 ;
667
+ Luau = 108 ;
668
+ Makefile = 79 ;
669
+ Markdown = 84 ;
670
+ Matlab = 52 ;
671
+ Nickel = 110 ; // https://nickel-lang.org/
672
+ Nix = 77 ;
673
+ OCaml = 41 ;
674
+ Objective_C = 36 ;
675
+ Objective_CPP = 37 ;
676
+ Pascal = 99 ;
677
+ PHP = 19 ;
678
+ PLSQL = 70 ;
679
+ Perl = 13 ;
680
+ PowerShell = 67 ;
681
+ Prolog = 71 ;
682
+ Protobuf = 100 ;
683
+ Python = 15 ;
684
+ R = 54 ;
685
+ Racket = 11 ;
686
+ Raku = 14 ;
687
+ Razor = 62 ;
688
+ Repro = 102 ; // Internal language for testing SCIP
689
+ ReST = 85 ;
690
+ Ruby = 16 ;
691
+ Rust = 40 ;
692
+ SAS = 61 ;
693
+ SCSS = 29 ;
694
+ SML = 43 ;
695
+ SQL = 69 ;
696
+ Sass = 28 ;
697
+ Scala = 5 ;
698
+ Scheme = 10 ;
699
+ ShellScript = 64 ; // Bash
700
+ Skylark = 78 ;
701
+ Slang = 107 ;
702
+ Solidity = 95 ;
703
+ Svelte = 106 ;
704
+ Swift = 2 ;
705
+ Tcl = 101 ;
706
+ TOML = 73 ;
707
+ TeX = 82 ;
708
+ Thrift = 103 ;
709
+ TypeScript = 23 ;
710
+ TypeScriptReact = 94 ;
711
+ Verilog = 104 ;
712
+ VHDL = 105 ;
713
+ VisualBasic = 63 ;
714
+ Vue = 25 ;
715
+ Wolfram = 53 ;
716
+ XML = 31 ;
717
+ XSL = 32 ;
718
+ YAML = 74 ;
719
+ Zig = 38 ;
720
+ // NextLanguage = 111;
721
+ // Steps add a new language:
722
+ // 1. Copy-paste the "NextLanguage = N" line above
723
+ // 2. Increment "NextLanguage = N" to "NextLanguage = N+1"
724
+ // 3. Replace "NextLanguage = N" with the name of the new language.
725
+ // 4. Move the new language to the correct line above using alphabetical order
726
+ // 5. (optional) Add a brief comment behind the language if the name is not self-explanatory
727
+ }
0 commit comments