Compare commits

...

464 Commits

Author SHA1 Message Date
Fangrui Song
962c0e72b4 Clear index requests upon "exit"
to make indexers stop in time. This is especially relevant when there
are many initial index requests.
2025-01-28 10:34:19 -08:00
Ka Ho Ng
48f1a006b7
Reformat all the files after 192a82b (#979)
Since the introduction of "ColumnLimit: 120" in .clang-format, the
column limit has become 120 characters instead of 80 characters.

This prevents clang-format from generating too much changes even if just
a small portion of a source file or header file is modified.
2024-12-06 17:58:19 -08:00
Fangrui Song
4331c89586 Adapt llvmorg-20-init-12964-gdf9a14d7bbf1: createDiagnostics 2024-11-23 18:33:49 -08:00
Fangrui Song
3640f899f1 textDocument/signatureHelp: add trigger character {
to enable https://reviews.llvm.org/D116317
2024-11-09 23:10:55 -08:00
Fangrui Song
664f952f38 Implement textDocument/switchSourceheader
When the current file is X.cc, there might be multiple X.h.
Use a heuristic to find the best X.h.

Vote for each interesting symbol's definitions (for header) or
declarations (for non-header). Select the file with the most votes.

If `file_id2cnt` is empty, use a simpler heuristic.
2024-11-08 20:56:30 -08:00
Fangrui Song
cc13ced659 Support LSP semantic tokens
This patch implements `textDocument/semanticTokens/{full,range}`. If the
client supports semantic tokens, $ccls/publishSemanticHighlight (now
deprecated) is disabled.

These token modifiers are mostly useful to emphasize certain symbols:
`static, classScope, globalScope, namespaceScope`.

To enable a colorful syntax highlighting scheme, set the
highlight.rainbow initialization option to 10.
https://maskray.me/blog/2024-10-20-ccls-and-lsp-semantic-tokens

Note that the older $ccls/publishSemanticHighlight protocol with
highlight.lsRanges==true (used by vscode-ccls) is no longer supported.
2024-11-05 21:57:24 -08:00
Fangrui Song
50fd8d069e Drop support for LLVM 7, 8, and 9 2024-11-01 23:50:25 -07:00
Fangrui Song
192a82ba85 .clang-format: ColumnLimit: 120 2024-10-21 17:52:44 -07:00
Fangrui Song
349cdc471b didOpen: Sort index requests by approximity to working files
For a large project, it is preferable to prioritize indexing files
neighboring working files.
2024-10-21 17:49:54 -07:00
Sam James
ddbe41300f
utils: Add <cstdint> (#968)
utils uses `uint64_t` without including `<cstdint>`
which fails to build w/ GCC 15 after a change in libstdc++ [0]

[0] https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=3a817a4a5a6d94da9127af3be9f84a74e3076ee2
2024-10-02 17:36:02 -07:00
Fangrui Song
e5e101253a Adapt llvmorg-19-init-9465-g39adc8f42329: BuiltinType::ArraySection 2024-05-05 17:49:30 -07:00
Fangrui Song
559b416409 Adapt llvmorg-19-init-9119-g4ec9a662d388: startswith/endswith removal 2024-05-05 17:49:30 -07:00
Fangrui Song
88e382f8a3 Adapt llvmorg-19-init-1720-gda95d926f6fc: InclusionDirective 2024-05-05 17:44:13 -07:00
Fangrui Song
f8d2778b65 Adapt llvm/llvm-project#74910: FileEntry::getName
Based on a patch by @zsrkmyn
2024-02-02 00:05:55 -08:00
Fangrui Song
f36ecb0c0e Adapt llvmorg-18-init-13684-ge1e34cc2a17c: llvm/Support/Host.h 2023-12-14 22:08:17 -08:00
Fangrui Song
490edc1e02 Adapt llvmorg-18-init-10631-gedd690b02e16: TTK_* 2023-11-15 16:01:09 -08:00
Fangrui Song
7b17426b9f Adapt llvmorg-18-init-4877-g62e576b454e1: getLangOpts 2023-09-09 19:43:27 -07:00
Fangrui Song
ee2d4f5b9a Disable -include b.hh => -include b.hh.{gch,pch} transition
See https://maskray.me/blog/2023-07-16-precompiled-headers for the
behavior.
2023-07-17 16:06:49 -07:00
Fangrui Song
ba38e13b93 Adapt llvmorg-17-init-4072-gcc929590ad30: PrecompiledPreamble::Build 2023-04-11 11:04:01 -07:00
Fangrui Song
8bc3959537 Use raw module format to fix -gmodules crash
To avoid `llvm::report_fatal_error("unknown module format")` in getPCHContainerWriter.
See a3e2ff19e5
2023-01-15 12:14:42 -08:00
Fangrui Song
2468edc0b3 cmake: Adapt llvmorg-16-init-15123-gf09cf34d0062 (LLVMTargetParser) 2023-01-14 21:37:52 -08:00
Fangrui Song
6dc564f2a8 Adapt llvm::Optional deprecation 2023-01-09 16:03:16 -08:00
Fangrui Song
8a93950fb9 Add callHierarchy 2022-11-03 00:20:22 -07:00
Fangrui Song
74458915b3 Adapt llvmorg-15-init-7692-gd79ad2f1dbc2: PPCallbacks::InclusionDirective parameter 2022-04-16 22:29:03 -07:00
Fangrui Song
790daca4b2 query: include llvm/ADT/STLExtras.h
The header is no longer transitively included in 2022-01.
2022-01-30 11:17:32 -08:00
augiedoggie
b28cec1872
platform_posix: add support for Haiku (#863) 2022-01-23 00:22:29 -08:00
Fangrui Song
c7596e3712 initialize: Add offsetEncoding to InitializeResult 2022-01-11 19:25:21 -08:00
Fangrui Song
8422f0a522 Adapt llvmorg-14-init-13600-g92417eaf3329: braced constructor call 2022-01-09 12:25:07 -08:00
Fangrui Song
dce86b1362 cmake: Add LANGUAGE C to fix find_package(Clang REQUIRED) error 2021-12-15 10:14:34 -08:00
Fangrui Song
5a48e6c419 sema_manager: only keep latest session.maxNum sessions in case of a surge of textDocument/didChange 2021-09-23 14:41:51 -07:00
Fangrui Song
3ce756e39a Adaopt llvmorg-14-init-3863-g601102d282d5: refactor clang::isIdentifierBody 2021-09-23 13:36:01 -07:00
Fangrui Song
f21fd7e5a2 pipeline: Avoid Twine
For some reason, Twine(int), when concatenated, may incorrectly become Twine(const unsigned long&) and cause a dereference crash.
2021-06-26 12:07:41 -07:00
Fangrui Song
80d06eb476 sema_manager: Use llvm::CrashRecoveryContext 2021-05-18 21:01:50 -07:00
Ludovic J
c018bce9af hierarchicalDocumentSymbol: use a range based method to support
out-of-line class members (#674)
2021-05-09 11:33:34 -07:00
Fangrui Song
c6686be382 ccls_lsp
The old name was somehow taken.
2021-04-05 18:04:57 -07:00
zhangjunphy
0ada56ef3b Fix short_name_size when getNameAsString does not return a prefix (#784) 2021-03-30 23:33:43 -07:00
Fangrui Song
4cd308d7fd Adapt llvmorg-12-init-17739-gf4d02fbe418d: change CanReuse 2021-01-28 00:18:27 -08:00
Yu Zeng
aca02d209b Fix compile error when use msvc 2019 (#754)
See https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
2021-01-18 19:05:28 -08:00
Fangrui Song
40145807d5 completion: Don't overwrite the following identifier (#749) 2021-01-09 11:12:33 -08:00
Fangrui Song
a2d2fd8167 diagnosticMain: Rebuild preamble for bounds change 2020-12-26 12:31:41 -08:00
Jan Lahoda
4ff22e6603
Making the progress an integer, as per the specification (#739) 2020-12-26 12:30:53 -08:00
Fangrui Song
4c66fdf09d Resolve "directory" in compile_commands.json in case CWD is not the project root
Also delete an unneeded chdir hack.

Close #703
2020-12-19 21:42:21 -08:00
Fangrui Song
feb153a843 Adapt llvmorg-12-init-11522-g4c55c3b66de: change ComputePreambleBounds 2020-11-18 22:33:04 -08:00
Fangrui Song
68d6e4122d project: fix initial directory list for recursive .ccls
Fix #717
2020-11-06 18:55:01 -08:00
Fangrui Song
a3c5d4a1eb Adapt llvmorg-12-init-5498-g257b29715bb: add an argument to the ctor of clang::driver::Driver 2020-09-23 16:06:49 -07:00
Fangrui Song
20a9f7b5f4 clang_tu: set RecoveryAST & RecoveryASTType 2020-08-30 10:21:58 -07:00
Fangrui Song
55c0d5b4eb project: override the compdb entry with .ccls if compile_commands.json is not used
Note: `exact_match` should be false if the entry is an synthetic one, instead
of an explicit entry in compile_commands.json
2020-08-26 11:36:55 -07:00
Fangrui Song
aa4d2d1b43 If clang >= 10, don't crash on #pragma clang __debug 2020-08-22 10:29:39 -07:00
Fangrui Song
125915e254 Adapt llvmorg-12-init-946-g10b1b4a231a: add find_package(ZLIB) 2020-07-25 08:30:18 -07:00
Fangrui Song
ca95f48a53 Support workspaces as symlinks and symlinks within a workspace
Fix #639
2020-07-19 17:03:16 -07:00
Fangrui Song
5108cfafcb Report index status via $/progress
Add WorkDoneProgress to represent WorkDoneProgressBegin/WorkDoneProgressReport/WorkDoneProgressEnd.
2020-07-04 10:05:26 -07:00
Ernest Borowski
468258d641 cmake: Fix rapidJSON version detection 2020-06-29 22:46:00 -07:00
Fangrui Song
6244594d71 indexer: log the number of errors and the first diagnostic
Example log:

```
15:47:45 indexer1         pipeline.cc:379 I parse /tmp/d/a.c error:1 use of undeclared identifier 'arg'
 clang /tmp/d/a.c --gcc-toolchain=/usr -working-directory=/tmp/d/
```
2020-06-28 17:16:35 -07:00
Fangrui Song
8cf8a3c4a4 Disable PCH reading/writing 2020-06-14 23:16:13 -07:00
Victor Sui
7a05f1ed06 cmake: Fail loudly when found rapidjson is too old (#646)
When the rapidjson found by cmake is an older version it defines a
variable RAPIDJSON_INCLUDE_DIRS instead of RapidJSON_INCLUDE_DIRS (#455).
According to #383 we do not want to make these older version work with
ccls. However currently if the rapidjson found by cmake is an older
version that defined RAPIDJSON_INCLUDE_DIRS, then the cmake invocation
still succeeds but any build command will fail because
RapidJSON_INCLUDE_DIRS was never set properly. This makes the cmake
invocation fail with a relevant error message in this event.
2020-06-14 23:15:48 -07:00
Ludovic Jozeau
c5acf62060 indexer: set the kind of static data members to Field instead of Var
Otherwise it is impossible to distinguish a static variable from a
static member variable.

Close #593
2020-04-22 09:08:20 -07:00
Fangrui Song
de800ebb70 sema_manager: report diagnostics in macro expansions
Fix #608
2020-04-19 11:27:57 -07:00
Fangrui Song
c10642d29b Delete ci/ and use .gitignore whitelist 2020-03-22 09:50:48 -07:00
Evan Klitzke
386f714f5e Set indexer threads' priority to ThreadPriority::Background (#538) 2019-12-02 19:20:39 -08:00
Fangrui Song
6c87a4656c project: decrease score if .c is matched against .hh (#549) 2019-12-22 10:06:34 -08:00
akocis
e373f9ed97 position: support line numbers larger than INT16_MAX (but <= UINT16_MAX) (#553) 2019-12-27 20:56:50 +01:00
Jan Lahoda
a2ecd9a8f0 textDocument/documentSymbol: support unopened files (#548) 2019-12-22 09:26:23 +01:00
xVan Turing
06a04d5102 indexer: add name for anonymous Enum 2019-11-16 05:42:51 +08:00
Felicián Németh
760f5e57ff initialize: implement serverInfo (LSP 3.15.0)
Return serverInfo for an initialize request. This helps clients to
identify ccls even when they just connect to a TCP port and allows them
to easily implement server specific functionalities like $ccls/navigate.
2019-11-11 10:19:24 +01:00
Fangrui Song
0a1e08a8ca indexer: fix getAdjustedDecl for explicit instantiations; fix incorrect short_offset_size=1 when name is empty
Fix #516
2019-11-09 13:27:09 -08:00
Fangrui Song
7e795e9b9e cmake: support CLANG_LINK_CLANG_DYLIB 2019-11-01 10:36:38 -07:00
Fangrui Song
0fe8a16504 Infer -target and --driver-mode from argv[0]
Fix #511
2019-10-31 22:31:03 -07:00
Fangrui Song
5935db10fd Fix some clang-tidy warnings
Incorporated some fixes by Daniel Chabrowski (#467)
2019-10-10 19:24:44 -07:00
Fangrui Song
2bffff7b0b Add initialization option completion.placeholder; change client.snippetSupport: false to drop ( and <
* client.snippetSupport: false => `foo`
* client.snippetSupport: true
  + completion.placeholder: false => `foo($1)$0` `bar<$1>()$0`
  + completion.placeholder: true => `foo(${1:int a}, ${2:int b})$0` `bar<${1:typename T}>()$0`

Note, client.snippetSupport is always false if the client does not support snippets.

Close #412
2019-10-06 23:54:45 -07:00
Fangrui Song
aa9668a8fc completion: don't reuse cache if the buffer line has changed
Fix emacs-ccls#54
2019-09-26 23:25:09 -07:00
Fangrui Song
0c6be472ce project: strip -Xclang <arg> 2019-09-11 19:05:04 -07:00
Fangrui Song
b3d694b8bd indexer: disable warnings and skip processed function bodies
Adapt clang rC370337: removal of createIndexingAction and WrappingIndexAction
2019-08-21 18:59:41 -07:00
Fangrui Song
65f86d0498 indexer: llvm::sys::fs::UniqueID -> clang::FileID
Fix a minor issue that an empty included file is not recorded.

Note, we need to skip invalid uid2lid_and_path because
otherwise lid2path may contain invalid entries with lid: 0,
which will cause the file entry with file_id 0 to have an empty path.
2019-08-21 23:46:02 -07:00
Fangrui Song
0f0e679edb indexer: delete redundant consumeFile 2020-04-21 21:43:56 -07:00
Fangrui Song
6717986541 Adapt llvmorg-11-init-1314-g777180a32b6: StringRef's conversion to std::string is now explicit
For compatibility with LLVM 7, the call sites have to be a bit verbose.
2020-01-29 00:29:06 -08:00
Fangrui Song
61a1071634 💥 Rename FunctionName -> functionName, VarName -> var_name 2019-08-22 10:12:03 -07:00
Fangrui Song
62fbde7873 textDocument/definition: don't jump to the type definition 2019-08-22 02:24:20 -07:00
Fangrui Song
50d7fbc235 project: allow absolute compilationDatabaseDirectory
Fix #466
2019-08-16 19:34:11 -07:00
Shengjing Zhu
0eebe0c1a9 Support override CLANG_RESOURCE_DIR
The result from clang commandline is something like
/usr/lib/llvm-7/lib/clang/7.0.1

Which means I need to recompile when the clang is upgraded to newer 7.x.x

However the system has a convenient symlink, which is
/usr/include/clang/7.
2019-08-11 18:06:47 +08:00
Fangrui Song
17dc4a6ecc Construct SourceManager with UserFilesAreVolatile
Fix #235. Close #453

In clang, it may be worth generalizing UserFilesAreVolatile (introduced in rC160074) to FilesAreVolatile.
2019-07-30 21:18:34 -07:00
Fangrui Song
a43e51f3bf project: improve ComputeGuessScore heuristics 2019-07-20 06:13:53 -07:00
Fangrui Song
ab6498e2ff Support indexing non-existent files in index.onChange:true mode 2019-07-20 01:16:15 -07:00
Fangrui Song
86a93b2d71 $ccls/fileInfo: optionally dump dependencies, includes and skipped_ranges 2019-07-20 02:24:07 -07:00
Riatre Foo
3dac492025 Change RequestId::value from int to std::string to allow non-numeric IDs. 2019-07-16 14:39:35 +08:00
Dan Čermák
795ad205d7 Only add include directories for LLVM, clang & rapidjson if they are not in CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES
/usr/include/c++/9 comes before /usr/include in `{clang,gcc} -v -fsyntax-only -xc++ /dev/null`.

    target_include_directories(ccls SYSTEM PRIVATE ${RapidJSON_INCLUDE_DIRS})

If ${RapidJSON_INCLUDE_DIRS} resolves to /usr/include, /usr/include will
be shuffled before /usr/include/c++/9 and will cause `#include_next <stdlib.h>`
issues (see https://github.com/MaskRay/ccls/pull/417).

Check if the include directories are already in CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES.
2019-06-27 12:19:11 +02:00
Fangrui Song
c728fe9795 project: support %cu directive and strip -M* options 2019-06-27 19:11:38 -07:00
Fangrui Song
ab4b4efcaf pipeline: report changed arg 2019-06-27 01:41:25 -07:00
TÖRÖK Attila
b7027f89e5 threaded_queue.hh: fix -Wpessimizing-move (#409) 2019-06-18 08:45:20 +02:00
Fangrui Song
20883c047c utils.hh: work around MSVC STL bug 2019-06-17 23:42:48 -07:00
Fangrui Song
0d911077f4 Set Diag::concerned if any of its Notes is concerned 2019-05-12 09:03:58 -07:00
Fangrui Song
fd3e82b682 Refactor FindEntry and use best-fit .ccls
Fixes an issue with hierarchical .ccls found by Riatre in #384
2019-04-29 08:44:52 -07:00
Fangrui Song
94727b7eae JsonWriter: write "null" if VersionedTextDocumentIdentifier.version is null
Fix #387
2019-04-30 06:22:32 -07:00
Riatre Foo
aa2f55eb2b Append '/' before populating folder.dot_ccls 2019-04-28 19:11:10 +08:00
Fangrui Song
0951004370 Set RetainCommentsFromSystemHeaders to true
Note with -fretain-comments-from-system-headers, the .gch of bits/stdc++.h becomes larger by 1%, but that is fine.

And improve comment handling in textDocument/hover

Fix #373
2019-04-11 22:26:07 -07:00
Fangrui Song
3a364c868b Set RetainRemappedFileBuffers to true
Reported by David Welch in #350.

This fixes double-free of llvm::MemoryBuffer when parsing fails.
2019-03-29 07:48:58 -07:00
Fangrui Song
4c871d9783 Add error checking of object deserialization; ignore non-object initializationOptions 2019-03-29 06:54:41 -07:00
Fangrui Song
4808ccb32c Add missing headers to adapt llvmorg-11-init-5501-g213aea4c583 and llvmorg-11-init-5528-gd7c5037e6b9 2020-03-12 08:35:59 -07:00
Fangrui Song
b0d42ad8f2 Adapt llvmorg-10-init-12036-g3b9715cb2193: handleDeclOccurence -> handleDeclOccurrence 2019-12-16 22:11:31 -08:00
Fangrui Song
a858567686 Adapt rL364464: clang::FrontendAction::Execute returns llvm::Error instead of bool 2019-06-27 01:10:04 -07:00
Fangrui Song
aab9dd6642 Simplify: hide unrelated options 2019-05-08 07:45:17 -07:00
Fangrui Song
34c5954420 Adapt clang rC358696: removal of OutputIsBinary 2019-04-18 19:16:24 -07:00
Fangrui Song
1066548dba Adapt D73392 - split of llvm/Support/Allocator.h 2020-01-25 09:57:16 -08:00
Fangrui Song
f1cbf8d550 Adapt clang rC357037: removal of setVirtualFileSystem 2019-03-26 18:42:48 -07:00
Fangrui Song
17eaca8a02 Add initialization option index.initialNoLinkage: false
By default, the background indexer doesn't handle names of no linkage.
They are indexed when their files are opened. This saves memory and
makes cache files smaller.
2019-03-24 23:42:00 -07:00
Paul Smith
b6155ddf73 Enhance the output of --version with Git describe results. (#342) 2019-03-23 20:24:10 -04:00
Fangrui Song
7bee63d0e0 Change containers of Query*::Def fields from std::vector to ccls::Vec
Query*::Def contain several immutable std::vector fields. Change them to
ccls::Vec to save bytes which were wasted by `capacity`.
2019-03-15 09:33:44 -07:00
Fangrui Song
e576df4f6f Add initialization option index.name.suppressUnwrittenScope (default: false) 2019-03-10 08:55:01 -07:00
Fangrui Song
dbf7d8eb41 If the workspace folder is a symlink, convert paths relative to it (#314)
If the workspace folder is a symlink and the client doesn't follow it.
Treat /tmp/symlink/ as canonical and convert every /tmp/real/ path to
/tmp/symlink/.
2019-03-10 00:27:50 -08:00
Fangrui Song
7c70c0662f cmake: use {LLVM,Clang}Config.cmake
Combined Daan De Meyer's #227 with other simplification

* USE_SHARED_LLVM is deleted in favor of LLVM_LINK_LLVM_DYLIB
* LLVM_ENABLE_RTTI is deleted as it is provided by LLVMConfig.cmake
* Only direct Clang/LLVM dependencies are required in target_link_libraries
* Restrict -DCLANG_RESOURCE_DIRECTORY= to src/utils.cc
2019-03-09 19:45:37 -08:00
Fangrui Song
5d27ac9f34 Add excludeRole to documentSymbol and override declaration's range/selectionRange with definition's 2019-03-08 23:37:08 -08:00
Fangrui Song
478f849ada cmake: add option to use system rapidjson if exists 2019-03-08 22:46:43 -08:00
Fangrui Song
9ca095f49e Misc 2019-03-02 18:18:02 -08:00
Fangrui Song
6a3cff6e50 Make clang.excludeArgs accept glob patterns 2019-03-04 18:21:53 -08:00
Fangrui Song
6c7b868556 stdin: synthesize an "exit" NotificationMessage in abnormal termination 2019-03-04 06:52:07 -08:00
Fangrui Song
beff1f6e89 textDocument/rename: mitigate edits in the same place and edits in macro replacement
Mitigate edits in the same place (#294) and:

// textDocument/rename on `f`
void f();
void g() { m(); } // incorrectly rewrote m() before
2019-03-01 18:35:13 -08:00
Fangrui Song
4047db2669 Add .github/ISSUE_TEMPLATE
Adapted from https://github.com/hlissner/doom-emacs
2019-03-01 17:37:37 -08:00
Fangrui Song
74432a641d working_files: normalize \r\n and \n to \n
Clients may normalize end-of-line sequences, thus cause a mismatch
between index_lines and buffer_lines.

Thanks to CXuesong for reporting this issue!
2019-03-01 17:30:53 -08:00
Fangrui Song
dcaa5a07af Change Pos::line from int16_t to uint16_t
This allows representing line 0 ~ 65535.
2019-02-23 19:17:26 +08:00
Fangrui Song
9dea14e783 Make hover more detailed (e.g. include inheritance info) 2019-02-22 23:49:37 +08:00
Fangrui Song
f35883f9b4 indexer: index TemplateTypeParmDecl and ParmVarDecl in declarations for clang >= 9
Index ParmVarDecl in declarations if index.parametersInDeclarations is true

And support some unhandled Decl::Kind
2019-02-22 10:59:05 +08:00
Fangrui Song
0c04c27e59 Add cache.{hierarchicalPath,retainInMemory}
cache.hierarchicalPath: store cache files as $directory/a/b/c.cc.blob to
work around NAME_MAX limitation.

cache.retainInMemory: after this number of loads, keep a copy of file
index in memory. If set to 1, it avoids cache corruption if the index
file is changed after the initial load, which may happen if several
language clients open the same project and share the same cache
directory.

Also rename cacheDirectory cacheFormat to cache.{directory,format}
2019-02-21 23:46:20 +08:00
Leszek Swirski
633d8936a8 Use DiagnosticRelatedInformation if client supports publishDiagnostics.relatedInformation (#276)
In clients that support DiagnosticRelatedInformation, display
clang notes as these nested diagnostics rather than appending
them to the parent diagnostic's message. Behaviour for clients
that don't support related information should be unchanged.
2019-02-21 02:23:21 +01:00
Fangrui Song
66e9cbd9a6 indexer: change Pos computation from byte offset to UTF-8 encoded code point offset 2019-02-16 17:23:47 +08:00
Fangrui Song
3bf921b3bd Add initialization option capabilities.* and index.maxInitializerLines
indexer.cc: use index.maxInitializerLines instead of kInitializerMaxLines

messages/initialize.cc: some ServerCapabilities are toggable:

documentOnTypeFormattingProvider.firstTriggerCharacter
foldingRangeProvider
workspace.workspaceFolders.supported
2019-02-10 18:17:07 +08:00
Fangrui Song
aaa97fe8df GetFallback: append clang.extraArgs
When compile_commands.json is absent, GetFallback is called to get
default clang command line when there is no .ccls or .ccls is empty.
2019-02-10 11:58:18 +08:00
Fangrui Song
03f91f0681 Compute CompletionItemKind from Declaration instead of CursorKind 2019-02-02 14:14:23 +08:00
Riatre Foo
2db67f6edb Fix is_local for vars with non-auto storage period 2018-10-15 23:25:46 +08:00
Riatre Foo
cd0f204349 textDocument/signatureHelp: enable documentation 2018-10-14 07:58:08 +08:00
Fangrui Song
716bc01322 Log {Request,Notification}Message, and timestamp change due to dependency 2019-01-29 15:47:03 +08:00
Riatre Foo
84f7d5081f Fix completion result sorting in VSCode (#210)
Fix #207
2019-01-30 23:21:40 +08:00
Fangrui Song
9bbb288b57 cmake: delete SYSTEM_CLANG and auto-download mechanism 2019-01-22 22:44:13 +08:00
Fangrui Song
343fa74dc1 Implement initialization option compilationDatabaseCommand on Windows 2019-01-21 12:15:28 +08:00
Fangrui Song
c6d56519e3 Drop support for clang 6 2019-01-21 10:44:44 +08:00
Fangrui Song
f496580081 Add -log-file=stderr and make it default
Change -log-file-append to a boolean flag
2019-01-21 10:20:07 +08:00
Fangrui Song
c592f95be0 completion: if preamble size changes, rebuild it
Fix #190

If a new header is added, the preamble size changes. Language clients may cache completion results, thus we rebuild preamble to avoid inaccurate results.
2019-01-13 18:33:18 +08:00
Fangrui Song
962dcf93c1 Update wiki links and delete comparison with cquery 2019-01-04 10:54:20 +08:00
Fangrui Song
f99cf50456 textDocument/didOpen: index related files when a header is opened
Fix #180

index.initialBlacklist: ["."] can inhibit initial indexing (useful for larger code bases).
Opened files are still indexed, though.
This heuristic allows related files (a/foo.c a/b/foo.cc) to be indexed when a header (foo.h) is opened.
2019-11-09 20:09:13 -08:00
Fangrui Song
8835a555f8 Delay requests if the document has not not indexed (#176)
This fixes a plethora of "not indexed" errors when the document has not been indexed.

* Message handler throws NotIndexed if not overdue
* The message is put into backlog and tagged with backlog_path
* path2backlog[path] tracks backlog associated with document `path`
* The backlog is cleared when the index is merged
* backlog[0] is forced to run if it becomes overdue
2019-11-09 20:09:13 -08:00
Fangrui Song
dd74d03cfc Adjust FrontendOpts.Inputs[0] for inferred files 2019-11-09 20:09:13 -08:00
Fangrui Song
52e0289245 Handle file deletion and register workspace/didChangeWatchedFiles
* In the "initialized" callback, send client/registerCapability with DidChangeWatchedFilesRegistrationOptions
* In workspace/didChangeWatchedFiles callback, call pipeline::Index
* In pipeline::Index, add a `deleted` status
2019-11-09 20:09:13 -08:00
Fangrui Song
ab48179946 Make cacheDirectory related to project root; delete Timer 2019-11-09 20:09:13 -08:00
Fangrui Song
45ac75fce3 completion: ignore CXXDeductionGuide
Fix #173
2019-11-09 20:09:13 -08:00
Fangrui Song
c085e07b19 Extend .ccls
* Add %h for C header files (the suffix .h is considered a C header, not a C++ header)
* Add %hpp for C++ header files
* If .ccls exists, it provides full command line for files not specified by compile_commands.json (before, compile_commands.json was ignored)
* If the first line of .ccls is %compile_commands.json, it appends flags to compile_commands.json "arguments", instead of overriding.
  Files not specified by compile_commands.json will not be added to folder.entries, but their command line can be inferred from other files.

Also fix `#include <` completion of -I flags for clang < 8
2019-11-09 20:09:13 -08:00
Fangrui Song
3edda5cf76 Make -v=1 work and log cflags for SemaManager session and Indexer 2019-11-09 20:09:13 -08:00
Fangrui Song
6e8a45b25e Add strict to FuzzyMatcher::Match
In completion, underscore prefixed builtin macros may be annoying when the first type character is not an underscore.

When `strict` is true, `Match` enforces the first characters should be loosely of the same category.
2019-11-09 20:09:13 -08:00
Fangrui Song
836caba19b ParameterInformation: use label: [number, number]
Don't bother checking signatureHelp.signatureInformationparameterInformation.labelOffsetSupport
2019-11-09 20:09:13 -08:00
Fangrui Song
49ae9e8912 Support textDocument/declaration & LocationLink
textDocument/{declaration,definition,typeDefinition} return either LocationLink[] or Location[]
Add an initialization option client.linkSupport . When it is false, ccls will return Location[] disregarding client's linkSupport.
`struct LocationLink` does not include originSelectionRange as it is wasteful.
2019-11-09 20:09:13 -08:00
Fangrui Song
e3133bea90 cmake_minimum_required 3.8; clean up 2019-11-09 20:09:13 -08:00
Fangrui Song
20e0beb9f3 Rendezvous after receiving "exit" notification (#159) 2019-11-09 20:09:13 -08:00
Fangrui Song
c06c2ca324 Support multiple -init=
Initialization options are applied (deserialized to the same object) in the following order:

* "initializationOptions" from client
* first -init=
* second -init=
* ...

Scalar options will be overridden but arrays will get concatenated, e.g.

ccls -log-file=/dev/stderr -index . -init='{"clang":{"extraArgs":["-DA"]}}' -init='{"clang":{"extraArgs":["-DB"]}}'

results in clang.extraArgs: ["-DA", "-DB"]
2019-11-09 20:09:13 -08:00
Leszek Swirski
25c8928121 Spin IncludeComplete's destructor until scanning completes (#147) 2019-11-09 20:09:13 -08:00
Fangrui Song
c941ca1bcd query: fix UpdateUses when a new entity is seen; simplify {DeclRef,Use,Usr}Update
Thanks to Leszek Swirski
2019-11-09 20:09:13 -08:00
Fangrui Song
a47fb42e30 Refactor serializer
Delete virtual bases Reader & Writer
Delete unused MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY
Merge serializers/{json,binary}.hh into serializer.{hh,cc}
MAKE_REFLECT_STRUCT => REFLECT_STRUCT
MAKE_REFLECT_TYPE_PROXY => REFLECT_UNDERLYING
2019-11-09 20:09:13 -08:00
Fangrui Song
a599aef482 Add ReplyOnce::NotReady and error if didOpen is not seen
Use IgnoringDiagConsumer to override default TextDiagnosticPrinter
2019-11-09 20:09:13 -08:00
Fangrui Song
9ad2450009 Refactor WorkingFiles and CompletionManager
* WorkingFiles::files : vector -> unordered_map
* Add timestamp to WorkingFile

* Rename "comp-preload" thread to "preamble"
* Rename CompletionManager to SemaManager as it is used by "diag" "comp" "preamble"
* Rename clang_complete.* to sema_manager.*
* Merge SemaManager::{preloads,sessions}
* Add initialization option session.maxNum
* In DiagnosticMain, if an included file was modified, cancel the DiagTask and create a PreambleTask instead. The task sets `from_diag` so as to trigger immediate DiagTask after the preamble is built.
2019-11-09 20:09:13 -08:00
Fangrui Song
b9369e055a completion: use Text for Macro{Instantiation,Definition} 2019-11-09 20:09:13 -08:00
Fangrui Song
c6c234725a Fix ComputeGuessScore and delete dead code
Thanks to CXuesong
2019-11-09 20:09:13 -08:00
Fangrui Song
65d856cf8a Merge maybe.hh into utils.hh 2019-11-09 20:09:13 -08:00
Fangrui Song
880c515d64 Merge query.hh and query_util.hh 2019-11-09 20:09:13 -08:00
Fangrui Song
d6dd932e6d Refactor Matcher to use pimpl and merge match.hh into utils.hh 2019-11-09 20:09:13 -08:00
Fangrui Song
38e87a0729 Make EmptyParam empty & rewrite LruCache 2019-11-09 20:09:13 -08:00
Fangrui Song
9603a73421 constexpr std::string_view -> const std::string_view
This works around gcc 7.2/clang rC347417 which have a bad interaction with libstdc++'s implementation of P0426
constexpr std::string_view also emits a string_view object in .rodata that cannot be optimized out by clang (which means larger object file size)

So use good old const.
2019-11-09 20:09:13 -08:00
Fangrui Song
7f8f68c0b2 codeAction: use codeActionProvider: CodeActionOptions and respect CodeActionParams::range 2019-11-09 20:09:13 -08:00
Fangrui Song
19d38bc1d2 Make DocumentLink::range narrower
Thanks to Riatre #135
2019-11-09 20:09:13 -08:00
Fangrui Song
0f0c328a91 completion: delete insertText; don't set filterText if it is the same as label
It decreases Content-Length: from 32K to 25K for the following case:

 #include <bits/stdc++.h>
int main() { std::| }

Also

* make results deterministic when completion text is empty
* sort by newText, label, filterText
2019-11-09 20:09:13 -08:00
Fangrui Song
98be09cc2e serializer: make visitor/vis value/v consistent 2019-11-09 20:09:13 -08:00
Fangrui Song
741d8f2130 Refactor ReplyOnce; error if InitializeParams.rootUri is null 2019-11-09 20:09:13 -08:00
Fangrui Song
8f442c6c35 indexer: handle DecltypeType and empty main file; diag: -Wno-unused-function for headers
Don't replace name with qualified name in Cls::*name
2019-11-09 20:09:13 -08:00
Fangrui Song
e27a5eaff9 .ccls: add %objective-c %objective-cpp
Also allow multiple directives on a line, e.g. %c %cpp -DFOO
2019-11-09 20:09:13 -08:00
Fangrui Song
46d3f075dc Use clang::isIdentifierBody and clean up utils/working_files 2019-11-09 20:09:13 -08:00
Fangrui Song
95bba3ed15 hierarchicalDocumentSymbol: support SymbolKind::Function declaration and uniquify by range
Also ensure selectionRange is a subrange of range, otherwise VSCode won't show the item.
Use detailed_name for 'detail'
2019-11-09 20:09:13 -08:00
Nikolaus Wittenstein
89faa7a6ef Add Apache LICENSE file (#121) 2019-11-09 20:09:13 -08:00
Dso Tsin
e5f7a938b5 Fix VS2017 build issues and add Appveyor CI script (#118) 2019-11-09 20:09:13 -08:00
Fangrui Song
985f5ec4d3 Use SM.isWrittenInMainFile; suppress -Werror in preamble
SM.isWrittenInMainFile is to work around preamble bug: spurious err_pp_unterminated_conditional with circular #include
2019-11-09 20:09:13 -08:00
Fangrui Song
d9a31a72bd hierarchicalDocumentSymbol: display member function declarations 2019-11-09 20:09:13 -08:00
Fangrui Song
aaa5008ec6 Fix some MSVC 2017 errors
Thanks to Dso Tsin!
2019-11-09 20:09:13 -08:00
Fangrui Song
d398e071dc If clang >= 8, delete search path detection and use Sema::CodeCompleteIncludedFile 2019-11-09 20:09:13 -08:00
Fangrui Song
444f0db1f2 Work around relative --sysroot= 2019-11-09 20:09:13 -08:00
Fangrui Song
02a6f39559 Improve semantic highlight in templates 2019-11-09 20:09:13 -08:00
Fangrui Song
09669fff76 Reduce MAKE_REFLECT_STRUCT in lsp.hh
Position -> Pos; lsPosition -> Position
2019-11-09 20:09:13 -08:00
Fangrui Song
0d4f4b68c0 Remove ls prefix from many LSP interfaces
Rename SymbolKind to Kind & lsSymbolKind to SymbolKind
Use textDocumentSync: TextDocumentSyncOptions
2019-11-09 20:09:13 -08:00
Fangrui Song
9a6851c6a5 Misc 2019-11-09 20:09:13 -08:00
Fangrui Song
353b398a73 Simplify and work around vscode _sortTextLow 2019-11-09 20:09:13 -08:00
Fangrui Song
857f41c247 project.cc: deduplicate more cases 2019-11-09 20:09:13 -08:00
Fangrui Song
c598f3ebbd Fix EnumConstantDecl's kind & EnumDecl's vars 2019-11-09 20:09:13 -08:00
Fangrui Song
c8e57ee7b3 textDocument/references workspace/symbol: add folders
For textDocument/reference, base/excludeRole/role has been lifted from params.context.* to params.*
2019-11-09 20:09:13 -08:00
Fangrui Song
c4bf9c5d6a Report InvalidParams for serialization error 2019-11-09 20:09:13 -08:00
Fangrui Song
c1422c7a8d Simplify and better compatibility with encodings retaining the feature of low bytes being 1-byte characters 2019-11-09 20:09:13 -08:00
Fangrui Song
bbce333042 *.h -> *.hh 2019-11-09 20:09:13 -08:00
Fangrui Song
3cd0ee2fc7 Refactor message handler and namespace ccls 2019-11-09 20:09:11 -08:00
Fangrui Song
8fa853c321 Implement textDocument/documentLink 2019-11-09 20:03:28 -08:00
Fangrui Song
617cdd89de Implement textDocument/foldingRange 2019-11-09 20:03:28 -08:00
David F
f6472061d3 Fix broken link in README.md (#101) 2019-11-09 20:03:28 -08:00
Fangrui Song
4f8889c195 Deprioritize completion items with additionTextEdits 2019-11-09 20:03:28 -08:00
Fangrui Song
dc20ea3b33 Fix textDocument/implementation 2019-11-09 20:03:28 -08:00
Fangrui Song
66bf514b5f Add command line option -index=root to index without starting language server 2019-11-09 20:03:28 -08:00
Fangrui Song
a56b6fb228 Improve DeducedType 2019-11-09 20:03:28 -08:00
Fangrui Song
18b47d3f5c Improve extent of definition/declaration; uniquify typeDefinition 2019-11-09 20:03:28 -08:00
Fangrui Song
46cfd5504a Simplify 2019-11-09 20:03:28 -08:00
Fangrui Song
5fbe4eac83 Add ExtentRef; merge symbol2refcnt and outline2refcnt
Fix hierarchical document symbol for namespaces when there are multiple declarations.
2019-11-09 20:03:28 -08:00
Fangrui Song
bc4dc6720b Add pipeline::{Notify,Reply,ReplyError} and simplify message handling
Delete method.{cc,h}
Rename $ccls/setSkippedRanges to $ccls/publishSkippedRanges
Rename $ccls/publishSemanticHighlighting to $ccls/publishSemanticHighlight; stableId -> id
2019-11-09 20:03:28 -08:00
Fangrui Song
4a1eea75db Misc changes to project
* Better LanguageId detection with clangDriver (e.g. .cu -> types::TY_CUDA)
* fallback when there is no .ccls or compile_commands.json

Also Hide clangTooling options from --help
2019-11-09 20:03:28 -08:00
Fangrui Song
40b47f9ca3 Adapt trunk change and write comments to PCH 2019-11-09 20:03:28 -08:00
Fangrui Song
f9cf7854fa -DSYSTEM_CLANG=off: 6.0.1 -> 7.0.0 2019-11-09 20:03:28 -08:00
Riatre Foo
ec71d4c6c0 Fix hierarchical document symbol
1. Fixed a bug on building document symbol tree: As sym2ds was updated in
place, nested funcs/types may be moved into children of another
lsDocumentSymbol before itself got processed.

2. Namespaces only have declarations, in the old implementation it wasn't included in the result, making the result less hierarchical. This
commit fixes this by including the declarations of a symbol if no
definitions found.
2019-11-09 20:03:28 -08:00
Fangrui Song
82deedf8c3 Add namespace alias clang::vfs = llvm::vfs to adapt D52783
vfs::x should be written as llvm::vfs::x to work around a [namepace.udir] bug before GCC 8 when namespace alias is used
2019-11-09 20:03:28 -08:00
Fangrui Song
7b19c87485 Namespace: improve indexer and don't trace bases in $ccls/member 2019-11-09 20:03:28 -08:00
Riatre Foo
3de62168c8 Fix additionalTextEdits -> textEdit hack for VS Code (#89)
* Fix additionalTextEdits -> textEdit hack for VS Code

Visual Studio Code filters the completion result according to
textEdit.range and filterText, if the textEdit.range overlaps with
existing text, we have to include it in filterText, otherwise it would
be filtered out.

* Fix has_open_paren in FilterCandidates
2019-11-09 20:03:28 -08:00
Fangrui Song
49dd0ed558 Support workspace folders 2019-11-09 20:03:28 -08:00
Fangrui Song
e352604ee4 Improve completion
blacklist some undesired candidates
additionalTextEdits if clang>=7
Use CodePatterns for preprocessor directive completion if there is a #
Prefer textEdit over insertText
2019-11-09 20:03:28 -08:00
Fangrui Song
a920e71711 Clean and update tests after Index* refactoring 2019-11-09 20:03:28 -08:00
Fangrui Song
2864f2c647 Use DeclRef spell to represent Use spell + Use extent 2019-11-09 20:03:28 -08:00
Fangrui Song
08b09bc1da Redesign SymbolRef, Ref, Use
Remove lsLocationEx
2019-11-09 20:03:28 -08:00
Fangrui Song
0c5c3a11be Add completion.maxNum: 100 2019-11-09 20:03:28 -08:00
Fangrui Song
8b2565fcd0 For $ccls/member, use unadjusted RecordDecl (if there is forward declaration) and handle ClassTemplateSpecialization 2019-11-09 20:03:28 -08:00
Fangrui Song
2592dd41dd Add PreambleStatCache 2019-11-09 20:03:28 -08:00
Fangrui Song
31314555bb Use pthread if defined(__unix__) || defined(__APPLE__) 2019-11-09 20:03:28 -08:00
firstlove
9a79b2ece1 regard conversion as method instead of constructor 2019-11-09 20:03:28 -08:00
Fangrui Song
3337d3de8c Add $ccls/info 2019-11-09 20:03:28 -08:00
Fangrui Song
3c332b91de Clean 2019-11-09 20:03:28 -08:00
Fangrui Song
fa2234c894 Use non-inferred entries and build preamble for .h; index on didOpen if no pending requests; documentHighlight 2019-11-09 20:03:28 -08:00
Fangrui Song
083a629f90 Rename some initialization options
* Delete index.enabled which can be achieved with index.blacklist: ['.']
* Move completion.include* to completion.include.*
* move largeFileSize to highlight.largeFileSize
2019-11-09 20:03:28 -08:00
Fangrui Song
8d61b1aadb Revamp codeLens & codeAction
b.ref: references of bases
d.ref: references of derived
when b.ref > 0, don't display 0 ref or x bases
2019-11-09 20:03:28 -08:00
Fangrui Song
153e5c0dcc Construct SourceManager with UserFilesAreVolatile
Prettify pipeline
2019-11-09 20:03:28 -08:00
Fangrui Song
7eacd2664f Support textDocument/{formatting,onTypeFormatting,rangeFormatting} 2019-11-09 20:03:26 -08:00
Fangrui Song
ae19826411 Merge textDocument_did{Change,Close,Open,Save}.cc 2019-11-09 20:01:34 -08:00
Amos Bird
93b5fa198c Update threaded_queue.h (#82)
https://en.cppreference.com/w/cpp/language/fold
2019-11-09 19:58:32 -08:00
Fangrui Song
cff6c4714c Simplify semantic highlighting; improve hover of auto && 2019-11-09 19:58:32 -08:00
Fangrui Song
a3b982f5d7 Add index.trackDependency and improve pipeline 2019-11-09 19:58:32 -08:00
Fangrui Song
d9541c3222 Add index.initial{Blacklist,Whitelist}
index.{blacklist,whitelist}: disable indexes thoroughly
index.initial{Blacklist,Whitelist}: disable initial loading. will still be indexed after opening
2019-11-09 19:58:32 -08:00
Fangrui Song
d5f4f22508 Add GetAdjustedDecl to adjust Decl's that are missed by clangIndex 2019-11-09 19:58:32 -08:00
Fangrui Song
3334b2c4b7 Remove clang_utils.* 2019-11-09 19:58:32 -08:00
Fangrui Song
3dea9486b9 Misc
Move using below #include to make preamble happy
textDocument/references: if no references, first line or last line => list where this file is included
malloc_trim() only if files have been indexed in last cycle
Intern: use CachedHashStringRef
2019-11-09 19:58:32 -08:00
Riatre Foo
dc4f45b018 Allow force disabling snippet via client.snippetSupport 2019-11-09 19:58:32 -08:00
Fangrui Song
f82a436536 documentSymbol: ignore TypeParameter
Reported by Riatre
2019-11-09 19:58:32 -08:00
Riatre Foo
3abbca6474 Include macros in completion result 2019-11-09 19:58:32 -08:00
Fangrui Song
e24079366b Add kind to $ccls/member and iterate all QueryType::def
kind:2 => member functions
kind:3 => nested classes / namespace members
2019-11-09 19:58:32 -08:00
Fangrui Song
daa6fbf4b8 Misc 2019-11-09 19:58:32 -08:00
Fangrui Song
4ea0dee1c9 Fix spurious "Failed to index" errors 2019-11-09 19:58:32 -08:00
Fangrui Song
bf698b85d4 Publish diagnostics of inferred files and change diagnostics.{onChange,onOpen,onSave} from bool to debounce time 2019-11-09 19:58:32 -08:00
Riatre Foo
a5b8def411 Remove chunks with CK_Information kind from insertText. (#78)
Without this ccls inserts "size() const" in the following scenario:

std::string text;
text.si| <-- Trigger completion here and pick "size"
2019-11-09 19:58:32 -08:00
Fangrui Song
f0400fdcf2 Delete file_consumer.* 2019-11-09 19:58:32 -08:00
Fangrui Song
28401961ae Simplify semantic highlighting 2019-11-09 19:58:32 -08:00
Fangrui Song
d9f0de4719 Clean up FileConsumer and improve pipeline 2019-11-09 19:58:32 -08:00
Fangrui Song
110023483a Improve VarDef::type for textDocument/typeDefinition 2019-11-09 19:58:32 -08:00
Fangrui Song
569a7624a6 intern args 2019-11-09 19:58:32 -08:00
Fangrui Song
97e773081b intern strings in dependencies and IndexInclude::resolved_path 2019-11-09 19:58:32 -08:00
Fangrui Song
1249eb1eb0 Simplify pipeline and fix race 2019-11-09 19:58:32 -08:00
Fangrui Song
cffc8c8409 Add hierarchicalDocumentSymbolSupport 2019-11-09 19:58:32 -08:00
Fangrui Song
4b2f53aa5d Add clang.pathMappings to reuse cache files with differect source paths
Use `>` as the separator.
2019-11-09 19:58:32 -08:00
Fangrui Song
1208a7d6b2 Remove [spell.start, spell.end) -> [spell.start, extent.end) hack 2019-11-09 19:58:32 -08:00
Fangrui Song
05c4c85bd6 Skip informative scope foo:: 2019-11-09 19:58:32 -08:00
Fangrui Song
62d0c49b0a Rename hierarchies to $ccls/{call,inheritance,member}
bool flat = false; -> bool hierarchy = false; (set it to true to enable hierarchical view)

Delete $ccls/callers (which is what $ccls/call does now)
2019-11-09 19:58:32 -08:00
Fangrui Song
71f2aee644 Better diagnostics 2019-11-09 19:58:32 -08:00
Fangrui Song
db50943cd7 textDocument/documentSymbol 2019-11-09 19:58:32 -08:00
Fangrui Song
d758b78635 Make $ccls/inheritanceHierarchy and textDocument/typeDefinition find declarations if definitions do not exist; spelling ranges of operator= 2019-11-09 19:58:32 -08:00
Fangrui Song
c633ce437b pipeline improvement for files not having a project entry (e.g. .h) 2019-11-09 19:58:32 -08:00
Fangrui Song
f939b6cc44 Make $ccls/reload reset DB and reload cached index files
$ccls/reload is renamed from $ccls/freshenIndex

This is useful when DB (merged index) diverges from backing IndexFile.

Also fix a semantic highlighting bug.
2019-11-09 19:58:32 -08:00
Riatre Foo
082096b613 Normalize paths on Windows
1. Normalize paths in LSP document URIs and project root to forward
slash and uppercase drive letters.
2. Normalize paths in compile_commands.json to forward slash and
uppercase drive letters.
3. Normalize paths from directory listing to forward slash. (Drive
letter should be same as input dir path, which is already uppercase
since path of project root dir is normalized)
4. Add llvm::sys::path::convert_to_slash after certain llvm::sys::path
and llvm::fs calls.
2019-11-09 19:58:32 -08:00
Fangrui Song
fa8b032301 diagnostics; use custom DenseMapInfo 2019-11-09 19:58:32 -08:00
Fangrui Song
68fba7989d Revamp completion and signatureHelp, set completion.detailedLabel: true and add completion.duplicateOptional 2019-11-09 19:58:32 -08:00
Fangrui Song
1b367eeb4b Misc 2019-11-09 19:58:32 -08:00
Fangrui Song
46db389c81 Make CXXConversion references wider; use getTypedefNameForAnonDecl; improve CXXDestructor CXXConversion spell 2019-11-09 19:58:32 -08:00
Fangrui Song
68a27e746d Add diagnostics.onSave 2019-11-09 19:58:32 -08:00
Fangrui Song
1df131d411 Reuse preamble (built by "comp-preload") in indexer 2019-11-09 19:58:32 -08:00
Fangrui Song
f1d9a93819 Support empty cacheDirectory and fix cache load 2019-11-09 19:58:32 -08:00
Fangrui Song
0ba4a7f0a9 Implement index.onChange: true; enable spell checking for diagnostics 2019-11-09 19:58:32 -08:00
Fangrui Song
017a91c30e Add DeclUse as element type of declarations 2019-11-09 19:58:32 -08:00
Fangrui Song
ce72cf7bd9 Remove $ccls/base and clean up; deduplicate codeLens 2019-11-09 19:58:32 -08:00
Fangrui Song
69f749ac9f Improve hover and documentSymbol 2019-11-09 19:58:32 -08:00
Fangrui Song
8a2438411e Add clang.excludeArgs and rename diagnostics.onType to onChange 2019-11-09 19:58:32 -08:00
Fangrui Song
d864f969ad Add $ccls/navigate and improve textDocument/definition 2019-11-09 19:58:29 -08:00
Fangrui Song
d22e6402d9 Add all: boolean to textDocument/documentSymbol 2019-10-24 01:13:24 -07:00
Fangrui Song
d3e0a4c4fd Add index.multiVersion{Black,White}list
They allow files matching specified patterns to be indexed only once
even if index.multiVersion > 0. An example is to exclude system headers
with index.multiVersionBlacklist: ["^/usr/include"]
2019-10-24 01:13:24 -07:00
Fangrui Song
4f67bd03d5 index.multiVersion: int
Before, QueryFile::Def::{all_symbols,outline} were built by indexers.
Now, {symbol,outline}2refcnt are used instead, built by main thread.
*_removed are augmented with Query*:Def to allow removal of old {symbol,outline}2refcnt entries.
2019-10-24 01:13:24 -07:00
Fangrui Song
a8bb605d4a Fix unaligned load/store; add index.multiVersion prototype, rename index.onParse to index.OnOpen
Don't call getFieldOffset() on RD->isInvalidDecl()
2019-10-24 01:13:24 -07:00
Fangrui Song
1ab0d492b7 README 2019-10-24 01:13:24 -07:00
Fangrui Song
6aee7b9648 Remove ASTUnit from indexer and clean up 2019-10-24 01:13:22 -07:00
scturtle
df1717538f Filter deps with index.blacklist. (#64) 2019-10-24 01:12:58 -07:00
Fangrui Song
5c0a146ee4 detailed_name: "{\n}" -> "{}" ; completion 2019-10-24 01:12:58 -07:00
firstlove
ea28e50d0f fix clang_tu.h && clang_complete.cc (#61) 2019-10-24 01:12:58 -07:00
Fangrui Song
fea457616a New diagnostics 2019-10-24 01:12:58 -07:00
Fangrui Song
a66533b023 Use StoreInMemory Preamble for CodeComplete 2019-10-24 01:12:51 -07:00
Fangrui Song
4c1b8f3811 Use StoreInMemory Preamble for CodeComplete 2019-10-24 01:11:30 -07:00
Fangrui Song
368bd9a283 SkipFunctionBodiesScope; improve fuzzy 2019-10-24 01:01:21 -07:00
Fangrui Song
99fe7c7624 Uniquify $ccls/inheritanceHierarchy and add flat to $ccls/memberHierarchy 2019-10-24 01:01:21 -07:00
Fangrui Song
b794b3606f Add LLVM_ENABLE_RTTI (default: OFF) to allow linking against Arch Linux extra/{llvm,clang} (-DLLVM_ENABLE_RTTI=ON) 2019-10-24 01:01:21 -07:00
Fangrui Song
d7c48d12d6 Fix VarDef::is_local; default cacheDirectory to ".ccls-cache" 2019-10-24 01:01:21 -07:00
Fangrui Song
27a5b24b59 Add license notice 2019-10-24 01:01:21 -07:00
Amos Bird
6e8ba37ad0 correctly grabbing the ownership of index files. (#54) 2019-10-24 01:01:21 -07:00
Fangrui Song
73e500bc97 textDocument/hover: prefer definitions in the same file 2019-10-24 01:01:21 -07:00
Fangrui Song
82962e565b Remove CompileCommandsEntry and reduce clangDriver invocations 2019-10-24 01:01:21 -07:00
inengch
84e18e51b2 Fix typo error (#49)
- The word strengthened is spelled mistakenly.
- Unpaired symbol:')' seems to be missing.
2019-10-24 01:01:21 -07:00
Fangrui Song
39787d2851 clang-format
DEF CON 26 CTF
2019-10-24 01:01:21 -07:00
Riatre Foo
87f36a4a96 Fix compile on Windows + MSYS2-MinGW64 (#46)
1. libClangDriver.a shipped by MSYS2 needs -lversion which is not
   included in CMAKE_CXX_STANDARD_LIBRARIES by default.
2. Use string literal for DEFAULT_RESOURCE_DIRECTORY to support
   backslashes in path.
2019-10-24 01:01:21 -07:00
Fangrui Song
7c1e3fc90e Add flat to $ccls/inheritanceHierarchy 2019-10-24 01:01:21 -07:00
Fangrui Song
22627d7a1f Validate RecordDecl 2019-10-24 01:01:21 -07:00
Damon Kwok
04b4d7523a rapidjson url (#43) 2019-10-24 01:01:21 -07:00
Fangrui Song
fc6e2af66f Uniquify textDocument/references
There can be duplicates with template instantiation.
2019-10-24 01:01:21 -07:00
Fangrui Song
af881dff18 cmake: for -DSYSTEM_CLANG=off, 6.0.0 -> 6.0.1 2019-10-24 01:01:21 -07:00
Fangrui Song
1c0bf0af65 Add textDocument/codeAction for clang FixIt
What do you think of the challenge ccls-fringe in Real World CTF?
2019-10-24 01:01:21 -07:00
Fangrui Song
bfb759fd09 Misc 2019-10-24 01:01:21 -07:00
Chao Shen
8eeb1bb3af Fix diagnostics on MacOS and duplicated bases. 2019-10-24 01:01:20 -07:00
Fangrui Song
bde0e6d837 Improve comment and outline 2019-10-24 01:01:20 -07:00
Chao Shen
f87ee1323c Misc. 2019-10-24 01:01:20 -07:00
Chao Shen
0dae2c4a39 Fix preload completion session. 2019-10-24 01:01:20 -07:00
Fangrui Song
3be281416d Fix Twine; index TypedefNameDecl to specialization; anonymous RecordDecl fields 2019-10-24 01:01:20 -07:00
Fangrui Song
3b997b12ad Use ContainerDC for extent, index callees, set StaticMethod 2019-10-24 01:01:20 -07:00
Fangrui Song
c50f0c5900 Add Query*::file_id to allow textDocument/hover on declarations
Also change StorageClass storage to uint8_t
2019-10-24 01:01:20 -07:00
Fangrui Song
31fac4d496 links 2019-10-24 01:01:20 -07:00
Fangrui Song
d13586ac4d --init 2019-10-24 01:01:20 -07:00
Fangrui Song
389418f546 Better bases/derived and initializer 2019-10-24 01:01:20 -07:00
Fangrui Song
d6ce5e6768 Fix spell for clang < 7 2019-10-24 01:01:20 -07:00
Fangrui Song
134a09a255 Remove libclang 2019-10-24 01:01:20 -07:00
Fangrui Song
af77e6615d CrashRecoveryContext 2019-10-24 01:01:20 -07:00
Fangrui Song
0f63be2418 Support BindingDecl and VarTemplate{,Partial}SpecializationDecl 2019-10-24 01:01:20 -07:00
Fangrui Song
8cce275206 Misc improvement to indexer
* Make CXXConstructor span one more column to left/right
* Use OrigD to collect Decl::Record members
* Better comment parsing
* Limit lines of initializers and macro definition to 3
* Attribute macro arg uses to spelling loc
* Remove FuncDef::declaring_type
2019-10-24 01:01:20 -07:00
Fangrui Song
ebf07265eb Diagnostics 2019-10-24 01:01:20 -07:00
Fangrui Song
d743743282 Enable clangDriver in project.cc
https://bugs.llvm.org/show_bug.cgi?id=37695 is not fixed. But since we have eliminated libclang for indexing and completion the bug no longer bothers us.
2019-10-24 01:01:20 -07:00
Fangrui Song
b3d5ea8be5 Simplify 2019-10-24 01:01:20 -07:00
Fangrui Song
c4e22bde23 Use Clang C++ for completion and diagnostics 2019-10-24 01:01:20 -07:00
Fangrui Song
d1c90ec85a $ccls/publishSemanticHighlighting: support both line/character-style and position-style ranges 2019-10-24 01:01:20 -07:00
Fangrui Song
a4dd5d0c44 Use Sema/CodeCompleteConsumer 2019-10-24 01:01:20 -07:00
Fangrui Song
d3536831c3 Fix FreeBSD build with -DUSE_SHARED_LLVM=off 2019-10-24 01:01:20 -07:00
Fangrui Song
aa9cdad54f Use clangTooling 2019-10-24 01:01:20 -07:00
Fangrui Song
b759798e5d Support uses from other files and improve references in macro replacement-list 2019-10-24 01:01:20 -07:00
Fangrui Song
24e99fd767 Cleanup 2019-10-24 01:01:20 -07:00
Fangrui Song
16448e98d1 Add some ObjC kinds 2019-10-24 01:01:20 -07:00
Fangrui Song
548f44dd79 Fix memberHierarchy 2019-10-24 01:01:20 -07:00
Fangrui Song
d816e1b918 $ccls/publishSemanticHighlighting: use pair<int,int> in place of lsRange 2019-10-24 01:01:20 -07:00
Fangrui Song
7ad03c22bd cmake: remove -lc++experimental -ldl -lexecinfo 2019-10-24 01:01:20 -07:00
Fangrui Song
3e8f8fea64 clangIndex 2019-10-24 01:01:20 -07:00
Fangrui Song
32dad17e81 Remove submodule doctest 2019-10-24 01:01:20 -07:00
Fangrui Song
f9befbd5fb pipeline 2019-10-24 01:01:20 -07:00
Fangrui Song
8e4d62212b Misc changes to clangIndex 2019-10-24 01:00:37 -07:00
Fangrui Song
96e0f0fafa clangIndex 2019-10-24 00:55:39 -07:00
Fangrui Song
9b54e5391c Clean up clang_tu; retrieve comments with clang::ASTContext::getRawCommentForAnyRedecl 2019-10-24 00:55:39 -07:00
Fangrui Song
103aa711d3 First draft: replace libclang indexer with clangIndex 2019-10-24 00:53:16 -07:00
Fangrui Song
bc6a48c405 clang+llvm libs 2019-10-24 00:18:13 -07:00
Fangrui Song
a94788b89f textDocument/references: add excludeRole 2019-10-24 00:18:13 -07:00
Fangrui Song
b784685c61 diagnostics 2019-10-24 00:18:13 -07:00
Fangrui Song
2682964039 Rename message files (e.g. ccls_call_hierarchy.cc -> ccls_callHierarchy.cc) 2019-10-24 00:17:28 -07:00
Fangrui Song
9852e618cd Add all to textDocument/documentSymbol 2019-10-24 00:17:28 -07:00
Fangrui Song
7198db1777 Use ChangeStd{in,out}ToBinary 2019-10-24 00:17:28 -07:00
Fangrui Song
b6375de2f3 Display diagnostics from header files 2019-10-24 00:17:28 -07:00
Fangrui Song
a96d9613f4 Put static const into IndexVar::def (a definition is not required unless odr-used) 2019-10-24 00:17:28 -07:00
Fangrui Song
9b9bf1cd19 Fix .. in compdb path; better type alias 2019-10-24 00:17:28 -07:00
Fangrui Song
1830103ec6 Internalize strings & remove diagnostics_publisher.cc 2019-10-24 00:17:28 -07:00
Fangrui Song
d21476d7ee Inject anonymous struct/union into parent scopes 2019-10-24 00:17:28 -07:00
Fangrui Song
732e002b13 Infer system include paths from CompilerInvocation 2019-10-24 00:17:28 -07:00
Fangrui Song
18fa5efa2a Add Config->reparseForDependency
Specify 1 if for large projects you don't want to reparse dependents at load time when a common .h changes.
2019-10-24 00:17:28 -07:00
Fangrui Song
d165a0b0ea Use clang::PrintingPolicy and remove type_printer 2019-10-24 00:17:28 -07:00
Fangrui Song
806a05b234 Add Config->largeFileSize; pure virtual or defaulted methods are definitions; fix $ccls/callHierarchy 2019-10-24 00:17:28 -07:00
Fangrui Song
f0559bba54 Remove Timer and PerformanceImportFile 2019-10-24 00:17:28 -07:00
Fangrui Song
34dc1e93e9 Remove WithFileContent & lex_utils.{cc,h} 2019-10-24 00:17:28 -07:00
Fangrui Song
da545f1139 $ccls/vars: differentiate local/field/parameter 2019-10-24 00:17:28 -07:00
Fangrui Song
bb08fdfa02 Remove $ccls/random; remove DB::symbols; decrease DB::entities grow rate 2019-10-24 00:17:25 -07:00
Fangrui Song
42bcf2b58f $ccls/memberHierarchy: add field offset 2019-10-23 21:56:51 -07:00
Fangrui Song
a962061698 Simplify pipeline 2019-10-23 21:56:51 -07:00
Fangrui Song
cf0d16fa0c Replace loguru with a custom logger 2019-10-23 21:56:51 -07:00
Fangrui Song
a6094ef714 Simplify; improve $ccls/inheritanceHierarchy 2019-10-23 21:56:51 -07:00
Fangrui Song
f5ce45fd55 filesystem.cc: deduplicate with UniqueID 2019-10-23 21:56:51 -07:00
Fangrui Song
6d96d9dce2 textDocument/references: include base references by default 2019-10-23 21:56:51 -07:00
Fangrui Song
c279090ac5 cmake: link against zlib; use StringMap 2019-10-23 21:56:51 -07:00
Fangrui Song
d2e0c7ca24 clean up clang_complete found by scturtle; clean up project 2019-10-23 21:56:51 -07:00
Fangrui Song
f9e1e8cbdc Congratulations to Tea Deliverers 2019-10-23 21:56:51 -07:00
Fangrui Song
36729818c3 experimental/filesystem -> LLVM/Support/FileSystem.h; sparsepp -> DenseMap 2019-10-23 21:56:51 -07:00
Fangrui Song
c81ca26a2e Use llvm::cl and simplify main.cc import_pipeline.cc 2019-10-23 21:56:51 -07:00
Fangrui Song
4207c3ece1 clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz.SHA256 -> 16.04 2019-10-23 21:56:51 -07:00
Fangrui Song
c269876593 Use clang+llvm C++ in cmake; parse args with clang driver 2019-10-23 21:56:51 -07:00
Fangrui Song
b349983e13 cmake: make FreeBSD 11,12 build 2019-10-23 21:56:51 -07:00
Fangrui Song
a385bffcbd Backport and cleanup 2019-10-23 21:56:51 -07:00
scturtle
4797401d55 Fix file_id. (#8) 2019-10-23 21:56:51 -07:00
scturtle
888a870c0d Random changes. (#6) 2019-10-23 21:56:51 -07:00
scturtle
6c57f9663e Add CLANG_USE_BUNDLED_LIBC++ to cmake 2019-10-23 21:56:51 -07:00
Fangrui Song
ba56663055 Reflect optional by Brandon Tolsch 2019-10-23 21:56:51 -07:00
Fangrui Song
49e042e070 Redesign import_pipeline.cc and mitigate race (duplicate Query*::uses for initial indexing) 2019-10-23 21:56:51 -07:00
Fangrui Song
aba672203f README 2019-10-23 21:56:51 -07:00
Fangrui Song
8e703af84e . 2019-10-23 21:56:51 -07:00
Fangrui Song
13c451a7cd . 2019-10-23 21:56:51 -07:00
Fangrui Song
eb057c7acd Use usr as primary key and remove id; simplify import pipeline
Remove on_id_map, IndexMergeIndexUpdates
2019-10-23 21:56:51 -07:00
Fangrui Song
5ef801662b Improve workspace/symbol sorting heuristic 2019-10-23 21:56:51 -07:00
Fangrui Song
f73100adf3 Merge {timestamp_manager,iindexer}.{cc,h}; remove standard_includes.*; use last_write_time 2019-10-23 21:56:51 -07:00
Amos Bird
38eccf79ec using SIGSTOP (avoid interactive signal blocking) (#2) 2019-10-23 21:56:51 -07:00
Fangrui Song
ebaf168e16 Remove variant and clean up 2019-10-23 21:56:51 -07:00
Fangrui Song
12ad568159 Update loguru 2019-10-23 21:56:51 -07:00
Fangrui Song
79df82d4a1 MessagePack -> custom binary format 2019-10-23 21:56:51 -07:00
Fangrui Song
73bd987b1a Add caseSensitivity to config->{completion,workspaceSymbol} 2019-10-23 21:56:51 -07:00
Fangrui Song
e522ce8179 Backport recent update of completion 2019-10-23 21:56:51 -07:00
Fangrui Song
43d1ec144c Catch filesystem_error 2019-10-23 21:56:51 -07:00
Fangrui Song
0e3e567207 Remove eyesore 2019-10-23 21:56:51 -07:00
Fangrui Song
662933e64c Simplify indexer and query 2019-10-23 21:56:51 -07:00
Fangrui Song
9ed024f5cc Simplify lsp.h and fix qual_name_offset when SetVarDetail is called on an existing variable 2019-10-23 21:56:51 -07:00
Fangrui Song
cdc7544471 Better definition/references on #include lines 2019-10-23 21:56:50 -07:00
Fangrui Song
5fb88749a9 Simplify Position & Range; prettify Maybe; remove file_contents.{h,cc} 2019-10-23 21:56:50 -07:00
Fangrui Song
a632f97a2d Remove import_manager.cc 2019-10-23 21:56:50 -07:00
Fangrui Song
b872faa160 Simplify 2019-10-23 21:56:50 -07:00
Fangrui Song
3fbfb99e1b Use clang_File_tryGetRealPathName 2019-10-23 21:56:50 -07:00
Fangrui Song
b51347960c Import cmake improvement by Daan De Meyer 2019-10-23 21:56:50 -07:00
Fangrui Song
a52d56a453 Add qual_name_offset to Index* structs; improve workspace/symbol and documentSymbol 2019-10-23 21:56:50 -07:00
Fangrui Song
2035a24c74 Set typeDefinitionProvider 2019-10-23 21:56:50 -07:00
Fangrui Song
96bba583c9 Remove unused fs code. 2019-10-23 21:56:50 -07:00
Fangrui Song
fdb562bb42 Use global config. 2019-10-23 21:56:50 -07:00
Fangrui Song
062b1ad0fd Simplify optional. 2019-10-23 21:56:50 -07:00
Fangrui Song
38cc501a8a Fuzzy 2019-10-23 21:56:50 -07:00
Fangrui Song
daf7a41278 . 2019-10-23 21:56:50 -07:00
Fangrui Song
c96631d1ee . 2019-10-23 21:56:50 -07:00
Fangrui Song
a58a38c32d . 2019-10-23 21:56:50 -07:00
Fangrui Song
eb7d0951ce . 2019-10-23 21:56:50 -07:00
Fangrui Song
22a7bcb47f . 2019-10-23 21:56:50 -07:00
Fangrui Song
ce33cc86d4 . 2019-10-23 21:56:50 -07:00
Fangrui Song
e1398ff319 . 2019-10-23 21:56:50 -07:00
Fangrui Song
f7872d143d . 2019-10-23 21:56:50 -07:00
Fangrui Song
b839389f77 Resurrection of ccls 2019-10-23 21:56:50 -07:00
Fangrui Song
39dfe052f5 Better textDocument/definition heuristic for T::name style dependent names 2019-10-23 21:56:50 -07:00
Chao Shen
53138afabd Extract LLVM to specific directory. 2019-10-23 21:56:50 -07:00
Fangrui Song
6c95649904 Improve fuzzy matching heuristics. 2019-10-23 21:56:50 -07:00
Chao Shen
4a95eda9d7 Fix lost index update. 2019-10-23 21:56:50 -07:00
DaanDeMeyer
2b493d80c2 Enable gcc extensions on cygwin only 2019-10-23 21:56:50 -07:00
DaanDeMeyer
bbf7feae19 enable gcc extensions (needed for cygwin support) 2019-10-23 21:56:50 -07:00
Pavel Davydov
fdba724f07 Add comment with short issue description. (#545) 2019-10-23 21:56:50 -07:00
Pavel Davydov
a6e62aa28c Blacklist '-include' and '-include-pch' flags. (#545) 2019-10-23 21:56:50 -07:00
Daan De Meyer
7a6ceae500 Switch to -print-resource-dir (drop support for system clang 4.0) 2019-10-23 21:56:50 -07:00
Maxim Kot
b68b063abd UB fixed.
Forgotten return was removed.
2019-10-23 21:56:50 -07:00
Jacob Dufault
47aa9b8e23 Work on e2e tests 2019-10-23 21:56:50 -07:00
Jacob Dufault
98090c543d Minor type cleanup 2019-10-23 21:56:50 -07:00
DaanDeMeyer
b110f0f96c Change default cmake build type to Release 2019-10-23 21:56:50 -07:00
Chao Shen
eefaad79f2 Preprocessor keyword completion. 2019-10-23 21:56:50 -07:00
Patrick Reisert
9ba87673b8 Ignore cl's -showIncludes 2019-10-23 21:56:50 -07:00
Chao Shen
8da0172955 Fix missing include completions. 2019-10-23 21:56:50 -07:00
Jacob Dufault
2fc731c856 ipc.h -> method.h, rename some types 2019-10-23 21:56:50 -07:00
Jacob Dufault
e37a6c814b Remove global list of message ids.
Also do some naming cleanup. Also remove xmacros.
2019-10-23 21:56:50 -07:00
Jacob Dufault
ee87d6cb97 Fix some warnings due to missing returns 2019-10-23 21:56:50 -07:00
Boris Staletic
39fbd1a2d5 Make overridden flags persistent
didOpen can override flags from compilation database.
didSave was able to reset the flags back.
This makes sure that the overridden flags persist.
2019-10-23 21:56:50 -07:00
Jacob Dufault
38fbe89b4c Don't use an IterationLoop for main indexer.
This causes the indexer to exit.
2019-10-23 21:56:50 -07:00
Elliot Berman
23bf95b5e3 Flush sessions on textDocument/didOpen 2019-10-23 21:56:50 -07:00
Elliot Berman
702eec9f2a Undo changes to diagnostics engine and import pipeline
They didn't seem necessary
2019-10-23 21:56:50 -07:00
Elliot Berman
c636eae680 Flush all clang-complete sessions on workspace/didChangeConfiguration 2019-10-23 21:56:50 -07:00
Jacob Dufault
1fd0a1be94 Reduce queue lengths by running index updates as iteration loop
A single translation unit can create many index updates, so give
IndexMain_DoCreateIndexUpdate a chance to run a few times. This should also be
faster as it is more icache friendly.
2019-10-23 21:56:50 -07:00
Jacob Dufault
ef59e59f5b Ensure IndexMergeIndexUpdates always returns a bool 2019-10-23 21:56:50 -07:00
Boris Staletic
bf011fef71 Conditionally allow reindex on didChange 2019-10-23 21:56:50 -07:00
Jacob Dufault
4e76cdaaae Try to prevent long queue lengths. 2019-10-23 21:56:50 -07:00
Jacob Dufault
db7e25c542 Reformat 2019-10-23 21:56:50 -07:00
Jacob Dufault
af3c09d00d Restore include completion on # 2019-10-23 21:56:50 -07:00
Jacob Dufault
0b1cc52c58 Fix crash when dynamically adding completion item 2019-10-23 21:56:50 -07:00
Jacob Dufault
259d30ef8a Don't use std::mismatch. Unit tests crash on Windows. 2019-10-23 21:56:50 -07:00
Jacob Dufault
997bcdf05a Restore call to GetPlatformClangArguments 2019-10-23 21:56:50 -07:00
Jacob Dufault
fb304d5c95 Restore platform arguments 2019-10-23 21:56:50 -07:00
DaanDeMeyer
504cb8d7fd Remove leftover comment 2019-10-23 21:56:50 -07:00
Fangrui Song
90329e5453 Simplify ComputeGuessScore 2019-10-23 21:56:50 -07:00
Daan De Meyer
25094bc70d Add SHA256 hashes of LLVM downloads and check them when downloading LLVM 2019-10-23 21:56:50 -07:00
Boris Staletic
193d42ea78 Make CL mode detection fool-proof (#528) 2019-10-23 21:56:50 -07:00
Fangrui Song
2d1c990f1a Don't include system header files for #include " (#i") completion 2019-10-23 21:56:50 -07:00
DaanDeMeyer
282ef8ce74 [CMake] Remove byte hacks + add correct url's for different clang versions + abort for unsupported combinations (#532) 2019-10-23 21:56:50 -07:00
Fangrui Song
ad88f707f7 Simplify and optimize completion. 2019-10-23 21:56:50 -07:00
Fangrui Song
02542b1e69 Optimize FuzzyMatcher and add tests. 2019-10-23 21:56:50 -07:00
Boris Staletic
13cccda781 Add -idirafter ot kPathArgs (#529) 2019-10-23 21:56:50 -07:00
Fangrui Song
d7e0722ca6 Use clang+llvm-6.0.0-amd64-unknown-freebsd-10.tar.xz
before 6.0.0 it was named freebsd10
2019-10-23 21:56:50 -07:00
Fangrui Song
11293722cc textDocument/didOpen: add args to override project entry 2019-10-23 21:56:50 -07:00
DaanDeMeyer
ad3f990267 Add CMake as alternative build system (#526) 2019-10-23 21:56:50 -07:00
Fangrui Song
0997e4dcc3 Update tests and README 2019-10-23 21:56:50 -07:00
Fangrui Song
d571fed293 Fix skipped region in clang 6.0.0; add repology badge; remove -latomic 2019-10-23 21:56:50 -07:00
Fangrui Song
aa2910208f Fix g++ build 2019-10-23 21:56:50 -07:00
Fangrui Song
b2b5e57761 Variant of clangd fuzzy matcher 2019-10-23 21:55:32 -07:00
336 changed files with 23712 additions and 23682 deletions

View File

@ -1,49 +1,22 @@
version: "{build}"
image: Visual Studio 2017
platform: x64
clone_folder: C:\projects\cquery
os: Visual Studio 2017
platform:
- x64
build:
parallel: true # enable MSBuild parallel builds
verbosity: minimal
install:
- git submodule update --init
environment:
CLICOLOR_FORCE: 1
matrix:
- MSYSTEM: MINGW64
- MSYSTEM: MSVC
matrix:
fast_finish: true # set this flag to immediately finish build once one of the jobs fails.
allow_failures:
- platform: x64
- if not exist llvm.tar.xz appveyor DownloadFile "https://ziglang.org/deps/llvm+clang-7.0.0-win64-msvc-release.tar.xz" -FileName llvm.tar.xz
- 7z e -txz llvm.tar.xz
- 7z x llvm.tar
- git submodule update --init --recursive
build_script:
- ps: |
If ($Env:MSYSTEM -Eq "MSVC") {
$dir = "cquery-${env:appveyor_build_version}-win64"
cd C:\projects\cquery
python waf configure --msvc_version="msvc 15.0"
python waf build
mkdir "${dir}\build\release\bin" -ea 0
mkdir "${dir}\build\release\lib\LLVM-6.0.0-win64\lib\clang\6.0.0\"
copy "build\release\bin\*" "${dir}\build\release\bin"
copy -recurse "build\LLVM-6.0.0-win64\lib\clang\6.0.0\include" "${dir}\build\release\lib\LLVM-6.0.0-win64\lib\clang\6.0.0\"
7z a -tzip "C:\projects\cquery\${dir}.zip" "${dir}"
} Else {
C:\msys64\usr\bin\bash -lc @'
pacman -S --needed --noconfirm mingw-w64-x86_64-clang python
cd /c/projects/cquery
CXXFLAGS=-Wall /usr/bin/python waf configure build --llvm-config llvm-config 2>&1
'@
}
- set PATH=%PATH%;C:\msys64\%MSYSTEM%\bin
- build\release\bin\cquery --ci --log-all-to-stderr --test-unit
- IF "%MSYSTEM%"=="MSVC" build\release\bin\cquery --ci --log-all-to-stderr --test-index
- cmake -G"Visual Studio 15 2017 Win64" -H. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=C:\projects\ccls\llvm+clang-7.0.0-win64-msvc-release
- cmake --build build --target ccls --config Release
artifacts:
- path: 'cquery-*.zip'
cache:
- C:\projects\cquery\build\LLVM-6.0.0-win64.exe
- C:\projects\cquery\build\LLVM-6.0.0-win64\
- path: build\Release

View File

@ -1 +1,2 @@
BasedOnStyle: Chromium
BasedOnStyle: LLVM
ColumnLimit: 120

View File

@ -1,6 +0,0 @@
-std=c++11
-Ithird_party/rapidjson/include
-IC:/Program Files/LLVM/include
-std=c++11
-fms-compatibility
-fdelayed-template-parsing

7
.gitattributes vendored
View File

@ -1,7 +0,0 @@
# By default, use platform specific endings.
*.h text eol=auto
*.cpp text eol=auto
*.cc text eol=auto
# Tests must always be crlf
index_tests/** text eol=crlf

36
.github/ISSUE_TEMPLATE vendored Normal file
View File

@ -0,0 +1,36 @@
Here are some things you should try before filing a bug report:
+ For client issues related to [emacs-ccls](https://github.com/MaskRay/emacs-ccls) or [vscode-ccls](https://github.com/MaskRay/vscode-ccls), report in their own repository.
+ For build problems, check https://github.com/MaskRay/ccls/wiki/Build
+ Check https://github.com/MaskRay/ccls/wiki/Debugging
+ Check [the FAQ](https://github.com/MaskRay/ccls/wiki/FAQ) to see if your issue is mentioned.
If none of those help, remove this section and fill out the four sections in the template below.
---
### Observed behavior
Describe what happened. Any aids you can include (that you think could be relevant) are a tremendous help.
* `compile_commands.json` or `.ccls` ([wiki/Project-Setup](https://github.com/MaskRay/ccls/wiki/Project-Setup))
* Reduce to A minimal set of `.c` `.cc` `.h` `.hh` files that can still demonstrate the issue.
* Consider a screencast gif.
### Expected behavior
Describe what you expected to happen.
### Steps to reproduce
1. Select these example steps,
2. Delete them,
3. And replace them with precise steps to reproduce your issue.
### System information
* ccls version (`git describe --tags --long`):
* clang version:
* OS:
* Editor:
* Language client (and version):

37
.gitignore vendored
View File

@ -1,26 +1,11 @@
.cquery_cached_index
.DS_Store
.lock-waf*
.vs
.vscode/
.vscode/.ropeproject
.waf*
*.cquery
*.sln
*.swp
*.vcxproj
*.vcxproj.filters
*.vcxproj.user
**/*.pyc
build
cquery_diagnostics.log
cquery_log.txt
Debug
e2e_cache
foo
libcxx
vscode-extension.vsix
waf-*
waf2*
waf3*
x64
/*
!/.github/
!/index_tests/
!/src/
!/third_party/
!/.appveyor.yml
!/.clang-format
!/CMakeLists.txt
!/LICENSE
!/README.md
!/meow/

14
.gitmodules vendored
View File

@ -1,15 +1,3 @@
[submodule "third_party/rapidjson"]
path = third_party/rapidjson
url = https://github.com/miloyip/rapidjson
[submodule "third_party/doctest"]
path = third_party/doctest
url = https://github.com/onqtam/doctest
[submodule "third_party/sparsepp"]
path = third_party/sparsepp
url = https://github.com/greg7mdp/sparsepp
[submodule "third_party/loguru"]
path = third_party/loguru
url = https://github.com/emilk/loguru
[submodule "third_party/msgpack-c"]
path = third_party/msgpack-c
url = https://github.com/msgpack/msgpack-c
url = https://github.com/Tencent/rapidjson

2
.pep8
View File

@ -1,2 +0,0 @@
[pep8]
indent-size=2

View File

@ -1,166 +0,0 @@
dist: trusty
sudo: false
language: c++
env:
global:
- COMPILER=g++
# Default --recursive (rapidjson/thirdparty/gtest) is unnecessary
git:
submodules: false
depth: 1
before_install:
- git submodule update --init
addons:
apt:
sources: &apt_sources
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.5
- llvm-toolchain-trusty-5.0
compiler: clang
os: linux
cache:
directories:
- build/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-14.04/
- build/clang+llvm-6.0.0-x86_64-apple-darwin/
matrix:
fast_finish: true
include:
- env: COMPILER=g++-5
compiler: gcc
addons: &gcc5
apt:
packages: ["g++-5"]
sources: *apt_sources
- env: COMPILER=g++-7
compiler: gcc
addons: &gcc7
apt:
packages: ["g++-7"]
sources: *apt_sources
- env: COMPILER=clang++-3.5
addons: &clang35
apt:
packages: ["clang-3.5", "g++-7"]
sources: *apt_sources
- env: COMPILER=clang++-5.0
addons: &clang50
apt:
packages: ["clang-5.0", "g++-7"]
sources: *apt_sources
- env: COMPILER=clang++
osx_image: xcode9.1
os: osx
- env: COMPILER=g++-7
compiler: gcc
osx_image: xcode9.1
os: osx
allow_failures:
# macOS takes too long.
#- env: COMPILER=clang++
# osx_image: xcode9.1
# os: osx
#- env: COMPILER=g++-7
# compiler: gcc
# osx_image: xcode9.1
# os: osx
# gcc builds that should be fixed at some point
#- env: COMPILER=g++-5
# compiler: gcc
#- env: COMPILER=g++-6
# compiler: gcc
#- env: COMPILER=g++-7
# compiler: gcc
#- env: COMPILER=g++-5
# compiler: gcc
# osx_image: xcode9.1
# os: osx
#- env: COMPILER=g++-6
# compiler: gcc
# osx_image: xcode9.1
# os: osx
#- env: COMPILER=g++-7
# compiler: gcc
# osx_image: xcode9.1
# os: osx
install:
- |
if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
if [[ "${COMPILER}" == "g++-5" ]]; then
brew install gcc@5
brew link --overwrite gcc@5
fi
if [[ "${COMPILER}" == "g++-6" ]]; then
brew install gcc@6
brew link --overwrite gcc@6
fi
if [[ "${COMPILER}" == "g++-7" ]]; then
brew install gcc@7
brew link --overwrite gcc@7
fi
fi
- |
if [[ "${COMPILER}" == g++* ]]; then
export J="-j1"
fi
- export CXX="${COMPILER}"
before_script:
- ${CXX} --version
script:
- travis_retry ./waf configure
- ./waf build ${J}
- ./build/release/bin/cquery --ci --log-all-to-stderr --test-unit
- ./build/release/bin/cquery --ci --log-all-to-stderr --test-index
notifications:
email: false
irc:
channels:
- "ircs://chat.freenode.net:6697/#cquery"
template:
- "[ %{repository_slug}#%{commit}] %{result} on %{branch} by %{author} (%{build_url} )"
before_deploy:
#- zip -r build/cquery-$TRAVIS_TAG-$TRAVIS_OS_NAME.zip build/release/bin/ build/release/lib/clang+llvm-*/lib/libclang.* build/release/lib/clang+llvm-*/lib/clang/5.0.1/include/
- ci/before_deploy.sh
deploy:
provider: releases
api_key:
secure: Ahv4Wp1wveWILqp6HB8UmsXwwfZ103fuJV/u6W4oJFRpnbIXRCGFKaDR1Ql0hsHduKFd/76nNQGSVvNNuTXlWaK2n0bTu1EZ4VYmXk7Q7gn4ROP9XFrIZu0c9XKJ/bzehCLj3t6KT0R5MK5gQe+cBmx4S5uGsGG5/nM+GZpE1N4craRCh64UNXMvIx20sW4VQcgj1Ccrc/6Skb3HET7PKbY+IB/LXnaF3nM6V71LxKW2wlakBmzzaNatQ46QOcOCduY4edE8FqBs7yZ0eFktNZusmjiaZT12t0r1hVe0O8e0ER3u9/c3t+hbPUplMR2FAPBZXojgLVhSfFtBaj45T74oCIi0eUaDeS+Oxl6IzgyVho9RurOtaru3hLOVoaD9wR6lGhj6Nz/2Na3lOIorxHfAZ4OgUmluoFLCynO4ylMD03fMBGBshChnmYbrxLw0xLZP2005WUAj8JN64QOmFmLt3gV7TfVldSFHuwoZyESfkXPRM1Xn8RtgFi/89p4jtPtyBFLSaeDggCwfWEMfADCfJ/j8lXtAPdyEINoaKrxkH8qCPoMLNPXE7JhkP8L0Smdq4cFUEXg3wKWM2hXmWmh2Y25BAyh4qu9CrDPd5qqFcXMtyix4ZjmThLFs/oKYbbMUo4FQ5xT5dpt/VZOi4NpcAj0G/M3jWhu85tMdtTc=
#file: build/cquery-$TRAVIS_TAG-$TRAVIS_OS_NAME.zip
file: build/cquery-$TRAVIS_TAG-x86_64-apple-darwin.tar.xz
file: build/cquery-$TRAVIS_TAG-x86_64-unknown-linux-gnu.tar.xz
skip_cleanup: true
on:
repo: cquery-project/cquery
tags: true

View File

@ -1,15 +0,0 @@
def FlagsForFile( filename, **kwargs ):
return {
'flags': [
'-xc++',
'-std=c++11',
'-DLOGURU_WITH_STREAMS=1',
'-Isrc/',
'-Ithird_party/',
'-Ithird_party/doctest',
'-Ithird_party/rapidjson/include',
'-Ithird_party/sparsepp',
'-Ithird_party/loguru',
'-Ibuild/clang+llvm-4.0.0-x86_64-linux-gnu-ubuntu-14.04/include'
]
}

261
CMakeLists.txt Normal file
View File

@ -0,0 +1,261 @@
cmake_minimum_required(VERSION 3.8)
project(ccls LANGUAGES CXX C)
option(USE_SYSTEM_RAPIDJSON "Use system RapidJSON instead of the git submodule if exists" ON)
# Sources for the executable are specified at end of CMakeLists.txt
add_executable(ccls "")
### Default build type
set(DEFAULT_CMAKE_BUILD_TYPE Release)
# CMAKE_BUILD_TYPE is not available if a multi-configuration generator is used
# (eg Visual Studio generators)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to '${DEFAULT_CMAKE_BUILD_TYPE}' as none \
was specified.")
set(CMAKE_BUILD_TYPE ${DEFAULT_CMAKE_BUILD_TYPE}
CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE
PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)
endif()
### Compile options
# Enable C++17 (Required)
set_property(TARGET ccls PROPERTY CXX_STANDARD 17)
set_property(TARGET ccls PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ccls PROPERTY CXX_EXTENSIONS OFF)
# CMake sets MSVC for both MSVC and Clang(Windows)
if(MSVC)
# Common MSVC/Clang(Windows) options
target_compile_options(ccls PRIVATE
/nologo
/EHsc
/D_CRT_SECURE_NO_WARNINGS # don't try to use MSVC std replacements
/W3 # roughly -Wall
/wd4996 # ignore deprecated declaration
/wd4267 # ignores warning C4267
# (conversion from 'size_t' to 'type'),
# roughly -Wno-sign-compare
/wd4800
/wd4068 # Disable unknown pragma warning
/std:c++17
/Zc:__cplusplus
$<$<CONFIG:Debug>:/FS>
)
# relink system libs
target_link_libraries(ccls PRIVATE Mincore.lib)
else()
# Common GCC/Clang(Linux) options
target_compile_options(ccls PRIVATE
-Wall
-Wno-sign-compare
)
if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
target_compile_options(ccls PRIVATE -Wno-return-type -Wno-unused-result)
endif()
if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
target_compile_options(ccls PRIVATE
$<$<CONFIG:Debug>:-fno-limit-debug-info>)
endif()
endif()
### Libraries
find_package(Clang REQUIRED)
if(CLANG_LINK_CLANG_DYLIB)
target_link_libraries(ccls PRIVATE clang-cpp)
else()
target_link_libraries(ccls PRIVATE
clangIndex
clangFormat
clangTooling
clangToolingInclusions
clangToolingCore
clangFrontend
clangParse
clangSerialization
clangSema
clangAST
clangLex
clangDriver
clangBasic
)
endif()
if(LLVM_LINK_LLVM_DYLIB)
target_link_libraries(ccls PRIVATE LLVM)
else()
target_link_libraries(ccls PRIVATE LLVMOption LLVMSupport)
if(LLVM_VERSION_MAJOR GREATER_EQUAL 16) # llvmorg-16-init-15123-gf09cf34d0062
target_link_libraries(ccls PRIVATE LLVMTargetParser)
endif()
endif()
if(NOT LLVM_ENABLE_RTTI)
# releases.llvm.org libraries are compiled with -fno-rtti
# The mismatch between lib{clang,LLVM}* and ccls can make libstdc++ std::make_shared return nullptr
# _Sp_counted_ptr_inplace::_M_get_deleter
if(MSVC)
target_compile_options(ccls PRIVATE /GR-)
else()
target_compile_options(ccls PRIVATE -fno-rtti)
endif()
endif()
# Enable threading support
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(ccls PRIVATE Threads::Threads)
if(${CMAKE_SYSTEM_NAME} STREQUAL FreeBSD)
find_package(Backtrace REQUIRED)
target_link_libraries(ccls PRIVATE ${Backtrace_LIBRARIES})
# src/platform_posix.cc uses libthr
target_link_libraries(ccls PRIVATE thr)
endif()
if(LLVM_ENABLE_ZLIB)
find_package(ZLIB)
endif()
### Definitions
# Find Clang resource directory with Clang executable.
if(NOT CLANG_RESOURCE_DIR)
find_program(CLANG_EXECUTABLE clang)
if(NOT CLANG_EXECUTABLE)
message(FATAL_ERROR "clang executable not found.")
endif()
execute_process(
COMMAND ${CLANG_EXECUTABLE} -print-resource-dir
RESULT_VARIABLE CLANG_FIND_RESOURCE_DIR_RESULT
OUTPUT_VARIABLE CLANG_RESOURCE_DIR
ERROR_VARIABLE CLANG_FIND_RESOURCE_DIR_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(CLANG_FIND_RESOURCE_DIR_RESULT)
message(FATAL_ERROR "Error retrieving Clang resource directory with Clang \
executable. Output:\n ${CLANG_FIND_RESOURCE_DIR_ERROR}")
endif()
endif()
set_property(SOURCE src/utils.cc APPEND PROPERTY COMPILE_DEFINITIONS
CLANG_RESOURCE_DIRECTORY=R"\(${CLANG_RESOURCE_DIR}\)")
### Includes
if(USE_SYSTEM_RAPIDJSON)
set(RapidJSON_MIN_VERSION "1.1.0")
find_package(RapidJSON ${RapidJSON_MIN_VERSION} QUIET)
if(NOT DEFINED RapidJSON_INCLUDE_DIRS AND DEFINED RAPIDJSON_INCLUDE_DIRS)
set(RapidJSON_INCLUDE_DIRS "${RAPIDJSON_INCLUDE_DIRS}")
endif()
endif()
if(NOT RapidJSON_FOUND)
if(EXISTS "${CMAKE_SOURCE_DIR}/third_party/rapidjson/include")
message(STATUS "Using local RapidJSON")
set(RapidJSON_INCLUDE_DIRS third_party/rapidjson/include)
else()
message(STATUS "Plase initialize rapidJSON git submodule as currently installed version is to old:")
message(STATUS "git submodule init && git submodule update")
message(FATAL_ERROR "RapidJSON version is likely too old. See https://github.com/MaskRay/ccls/issues/455")
endif()
endif()
target_include_directories(ccls PRIVATE src)
foreach(include_dir third_party
${LLVM_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS} ${RapidJSON_INCLUDE_DIRS})
get_filename_component(include_dir_realpath ${include_dir} REALPATH)
# Don't add as SYSTEM if they are in CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES.
# It would reorder the system search paths and cause issues with libstdc++'s
# use of #include_next. See https://github.com/MaskRay/ccls/pull/417
if(NOT "${include_dir_realpath}" IN_LIST CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)
target_include_directories(ccls SYSTEM PRIVATE ${include_dir})
endif()
endforeach()
### Install
install(TARGETS ccls RUNTIME DESTINATION bin)
### Sources
target_sources(ccls PRIVATE third_party/siphash.cc)
target_sources(ccls PRIVATE
src/clang_tu.cc
src/config.cc
src/filesystem.cc
src/fuzzy_match.cc
src/main.cc
src/indexer.cc
src/log.cc
src/lsp.cc
src/message_handler.cc
src/pipeline.cc
src/platform_posix.cc
src/platform_win.cc
src/position.cc
src/project.cc
src/query.cc
src/sema_manager.cc
src/serializer.cc
src/test.cc
src/utils.cc
src/working_files.cc
)
target_sources(ccls PRIVATE
src/messages/ccls_call.cc
src/messages/ccls_info.cc
src/messages/ccls_inheritance.cc
src/messages/ccls_member.cc
src/messages/ccls_navigate.cc
src/messages/ccls_reload.cc
src/messages/ccls_vars.cc
src/messages/initialize.cc
src/messages/textDocument_code.cc
src/messages/textDocument_completion.cc
src/messages/textDocument_definition.cc
src/messages/textDocument_did.cc
src/messages/textDocument_foldingRange.cc
src/messages/textDocument_formatting.cc
src/messages/textDocument_document.cc
src/messages/textDocument_hover.cc
src/messages/textDocument_references.cc
src/messages/textDocument_rename.cc
src/messages/textDocument_signatureHelp.cc
src/messages/workspace.cc
)
### Obtain CCLS version information from Git
### This only happens when cmake is re-run!
if(NOT CCLS_VERSION)
execute_process(COMMAND git describe --tag --long HEAD
OUTPUT_VARIABLE CCLS_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
if(NOT CCLS_VERSION)
set(CCLS_VERSION "<unknown>")
endif()
endif()
set_property(SOURCE src/main.cc APPEND PROPERTY
COMPILE_DEFINITIONS CCLS_VERSION=\"${CCLS_VERSION}\")
set_property(SOURCE src/messages/initialize.cc APPEND PROPERTY
COMPILE_DEFINITIONS CCLS_VERSION=\"${CCLS_VERSION}\")

201
LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,42 +1,29 @@
# cquery
# ccls
[![Join the chat at https://gitter.im/cquery-project/Lobby](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cquery-project/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Telegram](https://img.shields.io/badge/telegram-@cclsp-blue.svg)](https://telegram.me/ccls_lsp)
[![Gitter](https://img.shields.io/badge/gitter-ccls--project-blue.svg?logo=gitter-white)](https://gitter.im/ccls-project/ccls)
cquery is a highly-scalable, low-latency language server for C/C++/Objective-C. It is tested
and designed for large code bases like
[Chromium](https://chromium.googlesource.com/chromium/src/). cquery provides
accurate and fast semantic analysis without interrupting workflow.
![Demo](https://ptpb.pw/GlSQ.png?raw=true)
cquery implements almost the entire language server protocol and provides
some extra features to boot:
ccls, which originates from [cquery](https://github.com/cquery-project/cquery), is a C/C++/Objective-C language server.
* code completion (with both signature help and snippets)
* finding definition/references
* type hierarchy (parent type, derived types, expandable tree view)
* finding base/derived methods/classes, call tree
* symbol rename
* document and global symbol search
* hover tooltips showing symbol type
* diagnostics
* code actions (clang FixIts)
* darken/fade code disabled by preprocessor
* #include auto-complete, undefined type include insertion, include quick-jump
(goto definition, document links)
* auto-implement functions without a definition
* semantic highlighting, including support for [rainbow semantic highlighting](https://medium.com/@evnbr/coding-in-color-3a6db2743a1e)
* [definition](src/messages/textDocument_definition.cc)/[references](src/messages/textDocument_references.cc), and other cross references
* cross reference extensions: `$ccls/call` `$ccls/inheritance` `$ccls/member` `$ccls/vars` ...
* formatting
* hierarchies: [call (caller/callee) hierarchy](src/messages/ccls_call.cc), [inheritance (base/derived) hierarchy](src/messages/ccls_inheritance.cc), [member hierarchy](src/messages/ccls_member.cc)
* [symbol rename](src/messages/textDocument_rename.cc)
* [document symbols](src/messages/textDocument_document.cc) and approximate search of [workspace symbol](src/messages/workspace.cc)
* [hover information](src/messages/textDocument_hover.cc)
* diagnostics and code actions (clang FixIts)
* semantic highlighting and preprocessor skipped regions
* semantic navigation: `$ccls/navigate`
# >>> [Getting started](https://github.com/jacobdufault/cquery/wiki/Getting-started) (CLICK HERE) <<<
It has a global view of the code base and support a lot of cross reference features, see [wiki/FAQ](../../wiki/FAQ).
It starts indexing the whole project (including subprojects if exist) parallelly when you open the first file, while the main thread can serve requests before the indexing is complete.
Saving files will incrementally update the index.
# Limitations
# >>> [Getting started](../../wiki/Home) (CLICK HERE) <<<
cquery is able to respond to queries quickly because it caches a huge amount of
information. When a request comes in, cquery just looks it up in the cache
without running many computations. As a result, there's a large memory overhead.
For example, a full index of Chrome will take about 10gb of memory. If you
exclude v8, webkit, and third_party, it goes down to about 6.5gb.
* [Build](../../wiki/Build)
* [FAQ](../../wiki/FAQ)
# License
MIT
ccls can index itself (~180MiB RSS when idle, noted on 2018-09-01), FreeBSD, glibc, Linux, LLVM (~1800MiB RSS), musl (~60MiB RSS), ... with decent memory footprint. See [wiki/Project-Setup](../../wiki/Project-Setup) for examples.

View File

@ -1,45 +0,0 @@
#!/usr/bin/env bash
root=$(cd "$(dirname "$0")/.."; pwd)
version=$(TZ=UTC date +v%Y%m%d)
cd "$root/build/release"
case $(uname -s) in
Darwin)
libclang=(lib/clang+llvm-*/lib/libclang.dylib)
strip_option="-x"
name=cquery-$version-x86_64-apple-darwin ;;
FreeBSD)
libclang=(lib/clang+llvm-*/lib/libclang.so.?)
strip_option="-s"
name=cquery-$version-x86_64-unknown-freebsd10 ;;
Linux)
libclang=(lib/clang+llvm-*/lib/libclang.so.?)
strip_option="-s"
name=cquery-$version-x86_64-unknown-linux-gnu ;;
*)
echo Unsupported >&2
exit 1 ;;
esac
pkg=$(mktemp -d)
mkdir "$pkg/$name"
rsync -rtLR bin "./${libclang[-1]}" ./lib/clang+llvm-*/lib/clang/*/include "$pkg/$name"
cd "$pkg"
strip "$strip_option" "$name/bin/cquery" "$name/${libclang[-1]}"
case $(uname -s) in
Darwin)
# https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/tar.1.html
# macOS's bsdtar is lack of flags to set uid/gid.
# First, we generate a list of file in mtree format.
tar -cf filelist --format=mtree --options="!all,time,mode,type" "$name"
# Then add a line "/set uid=0 gid=0" after the first line "#mtree".
awk '/#mtree/{print;print "/set uid=0 gid=0";next}1' filelist > newflielist
# Finally, use the list to generate the tarball.
tar -zcf "$root/build/$name.tar.gz" @newflielist ;;
Linux)
tar -Jcf "$root/build/$name.tar.xz" --owner 0 --group 0 $name ;;
*)
tar -Jcf "$root/build/$name.tar.xz" --uid 0 --gid 0 $name ;;
esac
rm -r "$pkg"

View File

@ -1 +0,0 @@
build/release/compile_commands.json

View File

@ -0,0 +1,4 @@
/*
OUTPUT:
{}
*/

View File

@ -0,0 +1,32 @@
class Foo;
class Foo;
class Foo {};
class Foo;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "3:7-3:10|3:1-3:13|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": ["1:7-1:10|1:1-1:10|1|-1", "2:7-2:10|2:1-2:10|1|-1", "4:7-4:10|4:1-4:10|1|-1"],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,92 @@
class Foo {
public:
Foo() {}
};
void foo() {
Foo f;
Foo* f2 = new Foo();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3385168158331140247,
"detailed_name": "Foo::Foo()",
"qual_name_offset": 0,
"short_name": "Foo",
"spell": "3:3-3:6|3:3-3:11|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["7:7-7:8|16676|-1", "8:17-8:20|16676|-1"]
}, {
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "6:6-6:9|6:1-9:2|2|-1",
"bases": [],
"vars": [10983126130596230582, 17165811951126099095],
"callees": ["7:7-7:8|3385168158331140247|3|16676", "7:7-7:8|3385168158331140247|3|16676", "8:17-8:20|3385168158331140247|3|16676", "8:17-8:20|3385168158331140247|3|16676"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-4:2|2|-1",
"bases": [],
"funcs": [3385168158331140247],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [10983126130596230582, 17165811951126099095],
"uses": ["3:3-3:6|4|-1", "7:3-7:6|4|-1", "8:3-8:6|4|-1", "8:17-8:20|4|-1"]
}],
"usr2var": [{
"usr": 10983126130596230582,
"detailed_name": "Foo f",
"qual_name_offset": 4,
"short_name": "f",
"spell": "7:7-7:8|7:3-7:8|2|-1",
"type": 15041163540773201510,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 17165811951126099095,
"detailed_name": "Foo *f2",
"qual_name_offset": 5,
"short_name": "f2",
"hover": "Foo *f2 = new Foo()",
"spell": "8:8-8:10|8:3-8:22|2|-1",
"type": 15041163540773201510,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,99 @@
class Foo {
public:
Foo() {}
~Foo() {};
};
void foo() {
Foo f;
}
// TODO: Support destructors (notice how the dtor has no usages listed).
// - check if variable is a pointer. if so, do *not* insert dtor
// - check if variable is normal type. if so, insert dtor
// - scan for statements that look like dtors in function def handler
// - figure out some way to support w/ unique_ptrs?
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3385168158331140247,
"detailed_name": "Foo::Foo()",
"qual_name_offset": 0,
"short_name": "Foo",
"spell": "3:3-3:6|3:3-3:11|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["8:7-8:8|16676|-1"]
}, {
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "7:6-7:9|7:1-9:2|2|-1",
"bases": [],
"vars": [1893354193220338759],
"callees": ["8:7-8:8|3385168158331140247|3|16676", "8:7-8:8|3385168158331140247|3|16676"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 7440261702884428359,
"detailed_name": "Foo::~Foo() noexcept",
"qual_name_offset": 0,
"short_name": "~Foo",
"spell": "4:3-4:7|4:3-4:12|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-5:2|2|-1",
"bases": [],
"funcs": [3385168158331140247, 7440261702884428359],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [1893354193220338759],
"uses": ["3:3-3:6|4|-1", "4:4-4:7|4|-1", "8:3-8:6|4|-1"]
}],
"usr2var": [{
"usr": 1893354193220338759,
"detailed_name": "Foo f",
"qual_name_offset": 4,
"short_name": "f",
"spell": "8:7-8:8|8:3-8:8|2|-1",
"type": 15041163540773201510,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,91 @@
struct Type {
Type() {}
};
void Make() {
Type foo0;
auto foo1 = Type();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3957104924306079513,
"detailed_name": "void Make()",
"qual_name_offset": 5,
"short_name": "Make",
"spell": "5:6-5:10|5:1-8:2|2|-1",
"bases": [],
"vars": [449111627548814328, 17097499197730163115],
"callees": ["6:8-6:12|10530961286677896857|3|16676", "6:8-6:12|10530961286677896857|3|16676", "7:15-7:19|10530961286677896857|3|16676", "7:15-7:19|10530961286677896857|3|16676"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 10530961286677896857,
"detailed_name": "Type::Type()",
"qual_name_offset": 0,
"short_name": "Type",
"spell": "2:3-2:7|2:3-2:12|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["6:8-6:12|16676|-1", "7:15-7:19|16676|-1"]
}],
"usr2type": [{
"usr": 13487927231218873822,
"detailed_name": "struct Type {}",
"qual_name_offset": 7,
"short_name": "Type",
"spell": "1:8-1:12|1:1-3:2|2|-1",
"bases": [],
"funcs": [10530961286677896857],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [449111627548814328, 17097499197730163115],
"uses": ["2:3-2:7|4|-1", "6:3-6:7|4|-1", "7:15-7:19|4|-1"]
}],
"usr2var": [{
"usr": 449111627548814328,
"detailed_name": "Type foo0",
"qual_name_offset": 5,
"short_name": "foo0",
"spell": "6:8-6:12|6:3-6:12|2|-1",
"type": 13487927231218873822,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 17097499197730163115,
"detailed_name": "Type foo1",
"qual_name_offset": 5,
"short_name": "foo1",
"hover": "Type foo1 = Type()",
"spell": "7:8-7:12|7:3-7:21|2|-1",
"type": 13487927231218873822,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,51 @@
struct Foo {};
template<class T>
Foo::Foo() {}
/*
EXTRA_FLAGS:
-fms-compatibility
-fdelayed-template-parsing
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 17319723337446061757,
"detailed_name": "Foo::Foo::Foo()",
"qual_name_offset": 0,
"short_name": "Foo",
"spell": "4:6-4:9|4:1-4:11|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "1:8-1:11|1:1-1:14|2|-1",
"bases": [],
"funcs": [17319723337446061757],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["4:1-4:4|4|-1", "4:6-4:9|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,351 @@
#include "make_functions.h"
template <typename T, typename... Args>
T* MakeUnique(Args&&... args) {
return nullptr;
}
template <typename T, typename... Args>
T* maKE_NoRefs(Args... args) {
return nullptr;
}
void caller22() {
MakeUnique<Foobar>();
MakeUnique<Foobar>(1);
MakeUnique<Foobar>(1, new Bar(), nullptr);
maKE_NoRefs<Foobar>(1, new Bar(), nullptr);
}
// TODO: Eliminate the extra entries in the "types" array here. They come from
// the template function definitions.
// Foobar is defined in a separate file to ensure that we can attribute
// MakeUnique calls across translation units.
/*
OUTPUT: make_functions.h
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3765833212244435302,
"detailed_name": "Foobar::Foobar(int &&, Bar *, bool *)",
"qual_name_offset": 0,
"short_name": "Foobar",
"spell": "7:3-7:9|7:3-7:32|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 13028995015627606181,
"detailed_name": "Foobar::Foobar(int)",
"qual_name_offset": 0,
"short_name": "Foobar",
"spell": "6:3-6:9|6:3-6:17|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 13131778807733950299,
"detailed_name": "Foobar::Foobar()",
"qual_name_offset": 0,
"short_name": "Foobar",
"spell": "5:3-5:9|5:3-5:14|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 17321436359755983845,
"detailed_name": "Foobar::Foobar(int, Bar *, bool *)",
"qual_name_offset": 0,
"short_name": "Foobar",
"spell": "8:3-8:9|8:3-8:30|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 12993848456528750350,
"detailed_name": "struct Bar {}",
"qual_name_offset": 7,
"short_name": "Bar",
"spell": "1:8-1:11|1:1-1:14|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["7:17-7:20|4|-1", "8:15-8:18|4|-1"]
}, {
"usr": 14935975554338052500,
"detailed_name": "class Foobar {}",
"qual_name_offset": 6,
"short_name": "Foobar",
"spell": "3:7-3:13|3:1-9:2|2|-1",
"bases": [],
"funcs": [13131778807733950299, 13028995015627606181, 3765833212244435302, 17321436359755983845],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["5:3-5:9|4|-1", "6:3-6:9|4|-1", "7:3-7:9|4|-1", "8:3-8:9|4|-1"]
}],
"usr2var": []
}
OUTPUT: make_functions.cc
{
"includes": [{
"line": 0,
"resolved_path": "&make_functions.h"
}],
"skipped_ranges": [],
"usr2func": [{
"usr": 768523651983844320,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"vars": [2555873744476712860, 2555873744476712860, 2555873744476712860],
"callees": [],
"kind": 0,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 2532818908869373467,
"detailed_name": "T *maKE_NoRefs(Args ...args)",
"qual_name_offset": 3,
"short_name": "maKE_NoRefs",
"spell": "9:4-9:15|9:1-11:2|2|-1",
"bases": [],
"vars": [3908732770590594660],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["17:3-17:14|16420|-1"]
}, {
"usr": 2816883305867289955,
"detailed_name": "void caller22()",
"qual_name_offset": 5,
"short_name": "caller22",
"spell": "13:6-13:14|13:1-18:2|2|-1",
"bases": [],
"vars": [],
"callees": ["14:3-14:13|15793662558620604611|3|16420", "15:3-15:13|15793662558620604611|3|16420", "16:3-16:13|15793662558620604611|3|16420", "17:3-17:14|2532818908869373467|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 11138976705878544996,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"vars": [16395392342608151399],
"callees": [],
"kind": 0,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 11363675606380070883,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"vars": [180270746871803062, 180270746871803062, 180270746871803062],
"callees": [],
"kind": 0,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 15793662558620604611,
"detailed_name": "T *MakeUnique(Args &&...args)",
"qual_name_offset": 3,
"short_name": "MakeUnique",
"spell": "4:4-4:14|4:1-6:2|2|-1",
"bases": [],
"vars": [8463700030555379526],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["14:3-14:13|16420|-1", "15:3-15:13|16420|-1", "16:3-16:13|16420|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [180270746871803062],
"uses": []
}, {
"usr": 87,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [180270746871803062],
"uses": []
}, {
"usr": 12993848456528750350,
"detailed_name": "struct Bar {}",
"qual_name_offset": 7,
"short_name": "Bar",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["16:29-16:32|4|-1", "17:30-17:33|4|-1"]
}, {
"usr": 14935975554338052500,
"detailed_name": "class Foobar {}",
"qual_name_offset": 6,
"short_name": "Foobar",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["14:14-14:20|4|-1", "15:14-15:20|4|-1", "16:14-16:20|4|-1", "17:15-17:21|4|-1"]
}],
"usr2var": [{
"usr": 180270746871803062,
"detailed_name": "int args",
"qual_name_offset": 4,
"short_name": "args",
"spell": "9:24-9:28|9:16-9:28|1026|-1",
"type": 87,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 2555873744476712860,
"detailed_name": "int &&args",
"qual_name_offset": 6,
"short_name": "args",
"spell": "4:25-4:29|4:15-4:29|1026|-1",
"type": 0,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 3908732770590594660,
"detailed_name": "Args ...args",
"qual_name_offset": 8,
"short_name": "args",
"spell": "9:24-9:28|9:16-9:28|1026|-1",
"type": 0,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 8463700030555379526,
"detailed_name": "Args &&...args",
"qual_name_offset": 10,
"short_name": "args",
"spell": "4:25-4:29|4:15-4:29|1026|-1",
"type": 0,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16395392342608151399,
"detailed_name": "int &&args",
"qual_name_offset": 6,
"short_name": "args",
"spell": "4:25-4:29|4:15-4:29|1026|-1",
"type": 0,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,10 @@
struct Bar {};
class Foobar {
public:
Foobar() {}
Foobar(int) {}
Foobar(int&&, Bar*, bool*) {}
Foobar(int, Bar*, bool*) {}
};

View File

@ -0,0 +1,34 @@
class Foo;
class Foo;
class Foo {};
class Foo;
/*
// NOTE: Separate decl/definition are not supported for classes. See source
// for comments.
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "3:7-3:10|3:1-3:13|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": ["1:7-1:10|1:1-1:10|1|-1", "2:7-2:10|2:1-2:10|1|-1", "4:7-4:10|4:1-4:10|1|-1"],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,62 @@
class Foo {
int foo;
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [9736582033442720743],
"uses": []
}, {
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-3:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 9736582033442720743,
"R": 0
}],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 9736582033442720743,
"detailed_name": "int Foo::foo",
"qual_name_offset": 4,
"short_name": "foo",
"spell": "2:7-2:10|2:3-2:10|1026|-1",
"type": 53,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,61 @@
class Foo {
static int foo;
};
int Foo::foo;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [8942920329766232482, 8942920329766232482],
"uses": []
}, {
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-3:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["5:5-5:8|4|-1"]
}],
"usr2var": [{
"usr": 8942920329766232482,
"detailed_name": "static int Foo::foo",
"qual_name_offset": 11,
"short_name": "foo",
"spell": "5:10-5:13|5:1-5:13|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 5,
"storage": 2,
"declarations": ["2:14-2:17|2:3-2:17|1025|-1"],
"uses": []
}]
}
*/

View File

@ -0,0 +1,31 @@
void foo();
void foo();
void foo() {}
void foo();
/*
// Note: we always use the latest seen ("most local") definition/declaration.
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "3:6-3:9|3:1-3:14|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["1:6-1:9|1:1-1:11|1|-1", "2:6-2:9|2:1-2:11|1|-1", "4:6-4:9|4:1-4:11|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,71 @@
int foo(int, int);
int foo(int aa,
int bb);
int foo(int aaa, int bbb);
int foo(int a, int b) { return 0; }
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 2747674671862363334,
"detailed_name": "int foo(int, int)",
"qual_name_offset": 4,
"short_name": "foo",
"spell": "5:5-5:8|5:1-5:36|2|-1",
"bases": [],
"vars": [14555488990109936920, 10963664335057337329],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["1:5-1:8|1:1-1:18|1|-1", "2:5-2:8|2:1-3:16|1|-1", "4:5-4:8|4:1-4:26|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [14555488990109936920, 10963664335057337329],
"uses": []
}],
"usr2var": [{
"usr": 10963664335057337329,
"detailed_name": "int b",
"qual_name_offset": 4,
"short_name": "b",
"spell": "5:20-5:21|5:16-5:21|1026|-1",
"type": 53,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 14555488990109936920,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"spell": "5:13-5:14|5:9-5:14|1026|-1",
"type": 53,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,78 @@
class Foo {
void declonly();
virtual void purevirtual() = 0;
void def();
};
void Foo::def() {}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 4012226004228259562,
"detailed_name": "void Foo::declonly()",
"qual_name_offset": 5,
"short_name": "declonly",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:8-2:16|2:3-2:18|1025|-1"],
"derived": [],
"uses": []
}, {
"usr": 10939323144126021546,
"detailed_name": "virtual void Foo::purevirtual() = 0",
"qual_name_offset": 13,
"short_name": "purevirtual",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["3:16-3:27|3:3-3:33|1089|-1"],
"derived": [],
"uses": []
}, {
"usr": 15416083548883122431,
"detailed_name": "void Foo::def()",
"qual_name_offset": 5,
"short_name": "def",
"spell": "7:11-7:14|7:1-7:19|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": ["4:8-4:11|4:3-4:13|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-5:2|2|-1",
"bases": [],
"funcs": [4012226004228259562, 10939323144126021546, 15416083548883122431],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["7:6-7:9|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,81 @@
typedef unsigned char uint8_t;
enum class Foo : uint8_t {
A,
B = 20
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 2010430204259339553,
"detailed_name": "typedef unsigned char uint8_t",
"qual_name_offset": 22,
"short_name": "uint8_t",
"spell": "1:23-1:30|1:1-1:30|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 252,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 16985894625255407295,
"detailed_name": "enum class Foo : uint8_t {}",
"qual_name_offset": 11,
"short_name": "Foo",
"spell": "2:12-2:15|2:1-5:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 439339022761937396,
"R": -1
}, {
"L": 15962370213938840720,
"R": -1
}],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 439339022761937396,
"detailed_name": "Foo::A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "Foo::A = 0",
"spell": "3:3-3:4|3:3-3:4|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 10,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15962370213938840720,
"detailed_name": "Foo::B = 20",
"qual_name_offset": 0,
"short_name": "B",
"spell": "4:3-4:4|4:3-4:9|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 10,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,57 @@
enum Foo {
A,
B = 20
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 16985894625255407295,
"detailed_name": "enum Foo {}",
"qual_name_offset": 5,
"short_name": "Foo",
"spell": "1:6-1:9|1:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 439339022761937396,
"detailed_name": "A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "A = 0",
"spell": "2:3-2:4|2:3-2:4|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15962370213938840720,
"detailed_name": "B = 20",
"qual_name_offset": 0,
"short_name": "B",
"spell": "3:3-3:4|3:3-3:9|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,129 @@
enum Foo : int {
A,
B = 20
};
typedef int int32_t;
enum class E : int32_t {
E0,
E20 = 20
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 2986879766914123941,
"detailed_name": "enum class E : int32_t {}",
"qual_name_offset": 11,
"short_name": "E",
"spell": "8:12-8:13|8:1-11:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 16614320383091394267,
"R": -1
}, {
"L": 16847439761518576294,
"R": -1
}],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 14939241684006947339,
"detailed_name": "typedef int int32_t",
"qual_name_offset": 12,
"short_name": "int32_t",
"spell": "6:13-6:20|6:1-6:20|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 252,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 16985894625255407295,
"detailed_name": "enum Foo : int {}",
"qual_name_offset": 5,
"short_name": "Foo",
"spell": "1:6-1:9|1:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 439339022761937396,
"detailed_name": "A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "A = 0",
"spell": "2:3-2:4|2:3-2:4|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15962370213938840720,
"detailed_name": "B = 20",
"qual_name_offset": 0,
"short_name": "B",
"spell": "3:3-3:4|3:3-3:9|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16614320383091394267,
"detailed_name": "E::E0",
"qual_name_offset": 0,
"short_name": "E0",
"hover": "E::E0 = 0",
"spell": "9:3-9:5|9:3-9:5|1026|-1",
"type": 2986879766914123941,
"kind": 22,
"parent_kind": 10,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16847439761518576294,
"detailed_name": "E::E20 = 20",
"qual_name_offset": 0,
"short_name": "E20",
"spell": "10:3-10:6|10:3-10:11|1026|-1",
"type": 2986879766914123941,
"kind": 22,
"parent_kind": 10,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,78 @@
enum class Foo {
A,
B = 20
};
Foo x = Foo::A;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 16985894625255407295,
"detailed_name": "enum class Foo : int {}",
"qual_name_offset": 11,
"short_name": "Foo",
"spell": "1:12-1:15|1:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 439339022761937396,
"R": -1
}, {
"L": 15962370213938840720,
"R": -1
}],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [10677751717622394455],
"uses": ["6:1-6:4|4|-1", "6:9-6:12|4|-1"]
}],
"usr2var": [{
"usr": 439339022761937396,
"detailed_name": "Foo::A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "Foo::A = 0",
"spell": "2:3-2:4|2:3-2:4|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 10,
"storage": 0,
"declarations": [],
"uses": ["6:14-6:15|4|-1"]
}, {
"usr": 10677751717622394455,
"detailed_name": "Foo x",
"qual_name_offset": 4,
"short_name": "x",
"hover": "Foo x = Foo::A",
"spell": "6:5-6:6|6:1-6:15|2|-1",
"type": 16985894625255407295,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15962370213938840720,
"detailed_name": "Foo::B = 20",
"qual_name_offset": 0,
"short_name": "B",
"spell": "3:3-3:4|3:3-3:9|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 10,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

112
index_tests/foobar.cc Normal file
View File

@ -0,0 +1,112 @@
enum A {};
enum B {};
template<typename T>
struct Foo {
struct Inner {};
};
Foo<A>::Inner a;
Foo<B> b;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 6697181287623958829,
"detailed_name": "enum A {}",
"qual_name_offset": 5,
"short_name": "A",
"spell": "1:6-1:7|1:1-1:10|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["9:5-9:6|4|-1"]
}, {
"usr": 10528472276654770367,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "5:8-5:11|5:1-7:2|2|-1",
"bases": [],
"funcs": [],
"types": [13938528237873543349],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [12028309045033782423],
"uses": ["9:1-9:4|4|-1", "10:1-10:4|4|-1"]
}, {
"usr": 13892793056005362145,
"detailed_name": "enum B {}",
"qual_name_offset": 5,
"short_name": "B",
"spell": "2:6-2:7|2:1-2:10|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["10:5-10:6|4|-1"]
}, {
"usr": 13938528237873543349,
"detailed_name": "struct Foo::Inner {}",
"qual_name_offset": 7,
"short_name": "Inner",
"spell": "6:10-6:15|6:3-6:18|1026|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 23,
"declarations": [],
"derived": [],
"instances": [16721564935990383768],
"uses": ["9:9-9:14|4|-1"]
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "Foo<B> b",
"qual_name_offset": 7,
"short_name": "b",
"spell": "10:8-10:9|10:1-10:9|2|-1",
"type": 10528472276654770367,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "Foo<A>::Inner a",
"qual_name_offset": 14,
"short_name": "a",
"spell": "9:15-9:16|9:1-9:16|2|-1",
"type": 13938528237873543349,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,26 @@
void foo(int a, int b);
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 2747674671862363334,
"detailed_name": "void foo(int a, int b)",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["1:6-1:9|1:1-1:23|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,29 @@
void foo();
void foo() {}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "3:6-3:9|3:1-3:14|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["1:6-1:9|1:1-1:11|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,27 @@
void foo() {}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "1:6-1:9|1:1-1:14|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,47 @@
class Parent {};
class Derived : public Parent {};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 3866412049634585509,
"detailed_name": "class Parent {}",
"qual_name_offset": 6,
"short_name": "Parent",
"spell": "1:7-1:13|1:1-1:16|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["2:24-2:30|2052|-1"]
}, {
"usr": 10963370434658308541,
"detailed_name": "class Derived : public Parent {}",
"qual_name_offset": 6,
"short_name": "Derived",
"spell": "2:7-2:14|2:1-2:33|2|-1",
"bases": [3866412049634585509],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,109 @@
template<unsigned int C>
class Base1 {};
template<typename C>
class Base2 {};
template<unsigned int T>
class Derived1 : Base1<T> {};
template<typename T>
class Derived2 : Base2<T> {};
class Derived : Base1<3>, Base2<Derived>, Derived1<4>, Derived2<Derived> {};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 5863733211528032190,
"detailed_name": "class Derived1 : Base1<T> {}",
"qual_name_offset": 6,
"short_name": "Derived1",
"spell": "8:7-8:15|8:1-8:29|2|-1",
"bases": [11930058224338108382],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["13:43-13:51|2052|-1"]
}, {
"usr": 10651399730831737929,
"detailed_name": "class Derived2 : Base2<T> {}",
"qual_name_offset": 6,
"short_name": "Derived2",
"spell": "11:7-11:15|11:1-11:29|2|-1",
"bases": [11118288764693061434],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["13:56-13:64|2052|-1"]
}, {
"usr": 10963370434658308541,
"detailed_name": "class Derived : Base1<3>, Base2<Derived>, Derived1<4>, Derived2<Derived> {}",
"qual_name_offset": 6,
"short_name": "Derived",
"spell": "13:7-13:14|13:1-13:76|2|-1",
"bases": [11930058224338108382, 11118288764693061434, 5863733211528032190, 10651399730831737929],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["13:33-13:40|2052|-1", "13:65-13:72|2052|-1"]
}, {
"usr": 11118288764693061434,
"detailed_name": "class Base2 {}",
"qual_name_offset": 6,
"short_name": "Base2",
"spell": "5:7-5:12|5:1-5:15|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10651399730831737929, 10963370434658308541],
"instances": [],
"uses": ["11:18-11:23|2052|-1", "13:27-13:32|2052|-1"]
}, {
"usr": 11930058224338108382,
"detailed_name": "class Base1 {}",
"qual_name_offset": 6,
"short_name": "Base1",
"spell": "2:7-2:12|2:1-2:15|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [5863733211528032190, 10963370434658308541],
"instances": [],
"uses": ["8:18-8:23|2052|-1", "13:17-13:22|2052|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,83 @@
class Root {};
class MiddleA : public Root {};
class MiddleB : public Root {};
class Derived : public MiddleA, public MiddleB {};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 3897841498936210886,
"detailed_name": "class Root {}",
"qual_name_offset": 6,
"short_name": "Root",
"spell": "1:7-1:11|1:1-1:14|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [11863524815063131483, 14022569716337624303],
"instances": [],
"uses": ["2:24-2:28|2052|-1", "3:24-3:28|2052|-1"]
}, {
"usr": 10963370434658308541,
"detailed_name": "class Derived : public MiddleA, public MiddleB {}",
"qual_name_offset": 6,
"short_name": "Derived",
"spell": "4:7-4:14|4:1-4:50|2|-1",
"bases": [11863524815063131483, 14022569716337624303],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 11863524815063131483,
"detailed_name": "class MiddleA : public Root {}",
"qual_name_offset": 6,
"short_name": "MiddleA",
"spell": "2:7-2:14|2:1-2:31|2|-1",
"bases": [3897841498936210886],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["4:24-4:31|2052|-1"]
}, {
"usr": 14022569716337624303,
"detailed_name": "class MiddleB : public Root {}",
"qual_name_offset": 6,
"short_name": "MiddleB",
"spell": "3:7-3:14|3:1-3:31|2|-1",
"bases": [3897841498936210886],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["4:40-4:47|2052|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,80 @@
class Root {
virtual void foo();
};
class Derived : public Root {
void foo() override {}
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 6666242542855173890,
"detailed_name": "void Derived::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "5:8-5:11|5:3-5:25|5186|-1",
"bases": [9948027785633571339],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 9948027785633571339,
"detailed_name": "virtual void Root::foo()",
"qual_name_offset": 13,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:16-2:19|2:3-2:21|1089|-1"],
"derived": [6666242542855173890],
"uses": []
}],
"usr2type": [{
"usr": 3897841498936210886,
"detailed_name": "class Root {}",
"qual_name_offset": 6,
"short_name": "Root",
"spell": "1:7-1:11|1:1-3:2|2|-1",
"bases": [],
"funcs": [9948027785633571339],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["4:24-4:28|2052|-1"]
}, {
"usr": 10963370434658308541,
"detailed_name": "class Derived : public Root {}",
"qual_name_offset": 6,
"short_name": "Derived",
"spell": "4:7-4:14|4:1-6:2|2|-1",
"bases": [3897841498936210886],
"funcs": [6666242542855173890],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,45 @@
class IFoo {
virtual void foo() = 0;
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3277829753446788562,
"detailed_name": "virtual void IFoo::foo() = 0",
"qual_name_offset": 13,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:16-2:19|2:3-2:25|1089|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 9949214233977131946,
"detailed_name": "class IFoo {}",
"qual_name_offset": 6,
"short_name": "IFoo",
"spell": "1:7-1:11|1:1-3:2|2|-1",
"bases": [],
"funcs": [3277829753446788562],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,116 @@
struct Base0 {
virtual ~Base0() { }
};
struct Base1 {
virtual ~Base1() { }
};
struct Derived : Base0, Base1 {
~Derived() override { }
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 8401779086123965305,
"detailed_name": "virtual Base1::~Base1() noexcept",
"qual_name_offset": 8,
"short_name": "~Base1",
"spell": "5:11-5:17|5:3-5:23|1090|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 13164726294460837993,
"detailed_name": "Derived::~Derived() noexcept",
"qual_name_offset": 0,
"short_name": "~Derived",
"spell": "8:3-8:11|8:3-8:26|5186|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 16347272523198263017,
"detailed_name": "virtual Base0::~Base0() noexcept",
"qual_name_offset": 8,
"short_name": "~Base0",
"spell": "2:11-2:17|2:3-2:23|1090|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 10963370434658308541,
"detailed_name": "struct Derived : Base0, Base1 {}",
"qual_name_offset": 7,
"short_name": "Derived",
"spell": "7:8-7:15|7:1-9:2|2|-1",
"bases": [11628904180681204356, 15826803741381445676],
"funcs": [13164726294460837993],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["8:4-8:11|4|-1"]
}, {
"usr": 11628904180681204356,
"detailed_name": "struct Base0 {}",
"qual_name_offset": 7,
"short_name": "Base0",
"spell": "1:8-1:13|1:1-3:2|2|-1",
"bases": [],
"funcs": [16347272523198263017],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["2:12-2:17|4|-1", "7:18-7:23|2052|-1"]
}, {
"usr": 15826803741381445676,
"detailed_name": "struct Base1 {}",
"qual_name_offset": 7,
"short_name": "Base1",
"spell": "4:8-4:13|4:1-6:2|2|-1",
"bases": [],
"funcs": [8401779086123965305],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [10963370434658308541],
"instances": [],
"uses": ["5:12-5:17|4|-1", "7:25-7:30|2052|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,121 @@
void foo() {
int x;
auto dosomething = [&x](int y) {
++x;
++y;
};
dosomething(1);
dosomething(1);
dosomething(1);
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "1:6-1:9|1:1-12:2|2|-1",
"bases": [],
"vars": [12666114896600231317, 2981279427664991319],
"callees": ["9:14-9:15|17926497908620168464|3|16420", "10:14-10:15|17926497908620168464|3|16420", "11:14-11:15|17926497908620168464|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 17926497908620168464,
"detailed_name": "inline void foo()::(anon class)::operator()(int y) const",
"qual_name_offset": 12,
"short_name": "operator()",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["9:14-9:15|16420|-1", "10:14-10:15|16420|-1", "11:14-11:15|16420|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [12666114896600231317],
"uses": []
}, {
"usr": 14635009347499519042,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [2981279427664991319],
"uses": []
}],
"usr2var": [{
"usr": 2981279427664991319,
"detailed_name": "(lambda) dosomething",
"qual_name_offset": 9,
"short_name": "dosomething",
"hover": "(lambda) dosomething",
"spell": "4:8-4:19|4:3-7:4|2|-1",
"type": 14635009347499519042,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": ["9:3-9:14|4|-1", "10:3-10:14|4|-1", "11:3-11:14|4|-1"]
}, {
"usr": 12666114896600231317,
"detailed_name": "int x",
"qual_name_offset": 4,
"short_name": "x",
"spell": "2:7-2:8|2:3-2:8|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": ["4:24-4:25|4|-1", "5:7-5:8|28|-1"]
}, {
"usr": 12879188959314906706,
"detailed_name": "int y",
"qual_name_offset": 4,
"short_name": "y",
"spell": "4:31-4:32|4:27-4:32|2|-1",
"type": 0,
"kind": 253,
"parent_kind": 6,
"storage": 0,
"declarations": [],
"uses": ["6:7-6:8|28|-1"]
}]
}
*/

View File

@ -0,0 +1,95 @@
#define FOO(aaa, bbb) \
int a();\
int a() { return aaa + bbb; }
int make1() {
return 3;
}
const int make2 = 5;
FOO(make1(), make2);
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 9720930732776154610,
"detailed_name": "int a()",
"qual_name_offset": 4,
"short_name": "a",
"spell": "12:1-12:20|12:1-12:4|2|-1",
"bases": [],
"vars": [],
"callees": ["12:5-12:10|14400399977994209582|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["12:1-12:20|12:1-12:4|1|-1"],
"derived": [],
"uses": ["2:7-2:8|64|0", "3:7-3:8|64|0"]
}, {
"usr": 14400399977994209582,
"detailed_name": "int make1()",
"qual_name_offset": 4,
"short_name": "make1",
"spell": "6:5-6:10|6:1-8:2|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["12:5-12:10|16420|-1", "12:5-12:10|64|0"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [2878407290385495202],
"uses": []
}],
"usr2var": [{
"usr": 2878407290385495202,
"detailed_name": "const int make2",
"qual_name_offset": 10,
"short_name": "make2",
"hover": "const int make2 = 5",
"spell": "9:11-9:16|9:1-9:20|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": ["12:14-12:19|12|-1", "12:14-12:19|64|0"]
}, {
"usr": 14219599523415845943,
"detailed_name": "FOO",
"qual_name_offset": 0,
"short_name": "FOO",
"hover": "#define FOO(aaa, bbb) \\\n int a();\\\n int a() { return aaa + bbb; }",
"spell": "1:9-1:12|1:9-3:32|2|-1",
"type": 0,
"kind": 255,
"parent_kind": 1,
"storage": 0,
"declarations": [],
"uses": ["12:1-12:4|64|-1"]
}]
}
*/

106
index_tests/macros/foo.cc Normal file
View File

@ -0,0 +1,106 @@
#define A 5
#define DISALLOW(type) type(type&&) = delete;
struct Foo {
DISALLOW(Foo);
};
int x = A;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 13788753348312146871,
"detailed_name": "Foo::Foo(Foo &&) = delete",
"qual_name_offset": 0,
"short_name": "Foo",
"spell": "5:12-5:15|5:3-5:11|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["5:12-5:15|64|0"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [10677751717622394455],
"uses": []
}, {
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "4:8-4:11|4:1-6:2|2|-1",
"bases": [],
"funcs": [13788753348312146871],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["5:12-5:15|4|-1", "5:12-5:15|64|0"]
}],
"usr2var": [{
"usr": 1569772797058982873,
"detailed_name": "A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "#define A 5",
"spell": "1:9-1:10|1:9-1:12|2|-1",
"type": 0,
"kind": 255,
"parent_kind": 1,
"storage": 0,
"declarations": [],
"uses": ["8:9-8:10|64|-1"]
}, {
"usr": 4904139678698066671,
"detailed_name": "DISALLOW",
"qual_name_offset": 0,
"short_name": "DISALLOW",
"hover": "#define DISALLOW(type) type(type&&) = delete;",
"spell": "2:9-2:17|2:9-2:46|2|-1",
"type": 0,
"kind": 255,
"parent_kind": 1,
"storage": 0,
"declarations": [],
"uses": ["5:3-5:11|64|-1"]
}, {
"usr": 10677751717622394455,
"detailed_name": "int x",
"qual_name_offset": 4,
"short_name": "x",
"hover": "int x = A",
"spell": "8:5-8:6|8:1-8:10|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,49 @@
class Foo {
void foo();
};
/*
// NOTE: Lack of declaring_type in functions and funcs in Foo is okay, because
// those are processed when we find the definition for Foo::foo. Pure
// virtuals are treated specially and get added to the type immediately.
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 17922201480358737771,
"detailed_name": "void Foo::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:8-2:11|2:3-2:13|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-3:2|2|-1",
"bases": [],
"funcs": [17922201480358737771],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,48 @@
class Foo {
void foo() const;
};
void Foo::foo() const {}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 6446764306530590711,
"detailed_name": "void Foo::foo() const",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "5:11-5:14|5:1-5:25|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": ["2:8-2:11|2:3-2:19|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-3:2|2|-1",
"bases": [],
"funcs": [6446764306530590711],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["5:6-5:9|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,46 @@
class Foo {
void foo() {}
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 17922201480358737771,
"detailed_name": "void Foo::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "2:8-2:11|2:3-2:16|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-3:2|2|-1",
"bases": [],
"funcs": [17922201480358737771],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,87 @@
enum Foo {
#include "funky_enum.h"
};
/*
// TODO: In the future try to have better support for types defined across
// multiple files.
OUTPUT: funky_enum.h
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [],
"usr2var": [{
"usr": 439339022761937396,
"detailed_name": "A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "A = 0",
"comments": "This file cannot be built directory. It is included in an enum definition of\nanother file.",
"spell": "4:1-4:2|4:1-4:2|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 8524995777615948802,
"detailed_name": "C",
"qual_name_offset": 0,
"short_name": "C",
"hover": "C = 2",
"comments": "This file cannot be built directory. It is included in an enum definition of\nanother file.",
"spell": "6:1-6:2|6:1-6:2|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15962370213938840720,
"detailed_name": "B",
"qual_name_offset": 0,
"short_name": "B",
"hover": "B = 1",
"comments": "This file cannot be built directory. It is included in an enum definition of\nanother file.",
"spell": "5:1-5:2|5:1-5:2|1026|-1",
"type": 16985894625255407295,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
OUTPUT: funky_enum.cc
{
"includes": [{
"line": 1,
"resolved_path": "&funky_enum.h"
}],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 16985894625255407295,
"detailed_name": "enum Foo {}",
"qual_name_offset": 5,
"short_name": "Foo",
"spell": "1:6-1:9|1:1-3:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,6 @@
// This file cannot be built directory. It is included in an enum definition of
// another file.
A,
B,
C

View File

@ -0,0 +1,18 @@
#pragma once
struct Base {};
struct SameFileDerived : Base {};
using Foo0 = SameFileDerived;
template <typename T>
void Foo1() {}
template <typename T>
struct Foo2 {};
enum Foo3 { A, B, C };
int Foo4;
static int Foo5;

View File

@ -0,0 +1,235 @@
#include "header.h"
void Impl() {
Foo1<int>();
}
/*
OUTPUT: header.h
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 11650481237659640387,
"detailed_name": "void Foo1()",
"qual_name_offset": 5,
"short_name": "Foo1",
"spell": "10:6-10:10|10:1-10:15|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [2638219001294786365, 8395885290297540138],
"uses": []
}, {
"usr": 529393482671181129,
"detailed_name": "struct Foo2 {}",
"qual_name_offset": 7,
"short_name": "Foo2",
"spell": "13:8-13:12|13:1-13:15|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 619345544228965342,
"detailed_name": "using Foo0 = SameFileDerived",
"qual_name_offset": 6,
"short_name": "Foo0",
"spell": "7:7-7:11|7:1-7:29|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 16750616846959666305,
"kind": 252,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 4481210672785600703,
"detailed_name": "enum Foo3 {}",
"qual_name_offset": 5,
"short_name": "Foo3",
"spell": "15:6-15:10|15:1-15:22|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 8420119006782424779,
"detailed_name": "struct Base {}",
"qual_name_offset": 7,
"short_name": "Base",
"spell": "3:8-3:12|3:1-3:15|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [16750616846959666305],
"instances": [],
"uses": ["5:26-5:30|2052|-1"]
}, {
"usr": 16750616846959666305,
"detailed_name": "struct SameFileDerived : Base {}",
"qual_name_offset": 7,
"short_name": "SameFileDerived",
"spell": "5:8-5:23|5:1-5:33|2|-1",
"bases": [8420119006782424779],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["7:14-7:29|4|-1"]
}],
"usr2var": [{
"usr": 2638219001294786365,
"detailed_name": "int Foo4",
"qual_name_offset": 4,
"short_name": "Foo4",
"spell": "17:5-17:9|17:1-17:9|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 6141718166919284735,
"detailed_name": "A",
"qual_name_offset": 0,
"short_name": "A",
"hover": "A = 0",
"spell": "15:13-15:14|15:13-15:14|1026|-1",
"type": 4481210672785600703,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 7285646116511901840,
"detailed_name": "C",
"qual_name_offset": 0,
"short_name": "C",
"hover": "C = 2",
"spell": "15:19-15:20|15:19-15:20|1026|-1",
"type": 4481210672785600703,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 8395885290297540138,
"detailed_name": "static int Foo5",
"qual_name_offset": 11,
"short_name": "Foo5",
"spell": "18:12-18:16|18:1-18:16|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 2,
"declarations": [],
"uses": []
}, {
"usr": 17716334512218775320,
"detailed_name": "B",
"qual_name_offset": 0,
"short_name": "B",
"hover": "B = 1",
"spell": "15:16-15:17|15:16-15:17|1026|-1",
"type": 4481210672785600703,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
OUTPUT: impl.cc
{
"includes": [{
"line": 0,
"resolved_path": "&header.h"
}],
"skipped_ranges": [],
"usr2func": [{
"usr": 5817708529036841195,
"detailed_name": "void Impl()",
"qual_name_offset": 5,
"short_name": "Impl",
"spell": "3:6-3:10|3:1-5:2|2|-1",
"bases": [],
"vars": [],
"callees": ["4:3-4:7|11650481237659640387|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 11650481237659640387,
"detailed_name": "void Foo1()",
"qual_name_offset": 5,
"short_name": "Foo1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["4:3-4:7|16420|-1"]
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,3 @@
#pragma once
void header();

View File

@ -0,0 +1,70 @@
#include "simple_header.h"
void impl() {
header();
}
/*
OUTPUT: simple_header.h
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 16236105532929924676,
"detailed_name": "void header()",
"qual_name_offset": 5,
"short_name": "header",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["3:6-3:12|3:1-3:14|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
OUTPUT: simple_impl.cc
{
"includes": [{
"line": 0,
"resolved_path": "&simple_header.h"
}],
"skipped_ranges": [],
"usr2func": [{
"usr": 3373269392705484958,
"detailed_name": "void impl()",
"qual_name_offset": 5,
"short_name": "impl",
"spell": "3:6-3:10|3:1-5:2|2|-1",
"bases": [],
"vars": [],
"callees": ["4:3-4:9|16236105532929924676|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 16236105532929924676,
"detailed_name": "void header()",
"qual_name_offset": 5,
"short_name": "header",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["4:3-4:9|16420|-1"]
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,87 @@
#include "static.h"
void Buffer::CreateSharedBuffer() {}
/*
OUTPUT: static.h
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 14576076421851654759,
"detailed_name": "static void Buffer::CreateSharedBuffer()",
"qual_name_offset": 12,
"short_name": "CreateSharedBuffer",
"bases": [],
"vars": [],
"callees": [],
"kind": 254,
"parent_kind": 0,
"storage": 0,
"declarations": ["4:15-4:33|4:3-4:35|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 9411323049603567600,
"detailed_name": "struct Buffer {}",
"qual_name_offset": 7,
"short_name": "Buffer",
"spell": "3:8-3:14|3:1-5:2|2|-1",
"bases": [],
"funcs": [14576076421851654759],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
OUTPUT: static.cc
{
"includes": [{
"line": 0,
"resolved_path": "&static.h"
}],
"skipped_ranges": [],
"usr2func": [{
"usr": 14576076421851654759,
"detailed_name": "static void Buffer::CreateSharedBuffer()",
"qual_name_offset": 12,
"short_name": "CreateSharedBuffer",
"spell": "3:14-3:32|3:1-3:37|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 254,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 9411323049603567600,
"detailed_name": "struct Buffer {}",
"qual_name_offset": 7,
"short_name": "Buffer",
"bases": [],
"funcs": [14576076421851654759],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["3:6-3:12|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,5 @@
#pragma once
struct Buffer {
static void CreateSharedBuffer();
};

View File

@ -0,0 +1,28 @@
namespace {
void foo();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 5010253035933134245,
"detailed_name": "void (anon ns)::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:6-2:9|2:1-2:11|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,44 @@
namespace hello {
void foo(int a, int b);
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 18343102288837190527,
"detailed_name": "void hello::foo(int a, int b)",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:6-2:9|2:1-2:23|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 2029211996748007610,
"detailed_name": "namespace hello {}",
"qual_name_offset": 10,
"short_name": "hello",
"bases": [],
"funcs": [18343102288837190527],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:16|1:1-3:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,45 @@
namespace hello {
void foo() {}
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 243328841292951622,
"detailed_name": "void hello::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "2:6-2:9|2:1-2:14|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 2029211996748007610,
"detailed_name": "namespace hello {}",
"qual_name_offset": 10,
"short_name": "hello",
"bases": [],
"funcs": [243328841292951622],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:16|1:1-3:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,63 @@
namespace hello {
class Foo {
void foo();
};
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 10487325150128053272,
"detailed_name": "void hello::Foo::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["3:8-3:11|3:3-3:13|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 2029211996748007610,
"detailed_name": "namespace hello {}",
"qual_name_offset": 10,
"short_name": "hello",
"bases": [],
"funcs": [],
"types": [4508214972876735896],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:16|1:1-5:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 4508214972876735896,
"detailed_name": "class hello::Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "2:7-2:10|2:1-4:2|1026|-1",
"bases": [],
"funcs": [10487325150128053272],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,66 @@
namespace hello {
class Foo {
void foo();
};
void Foo::foo() {}
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 10487325150128053272,
"detailed_name": "void hello::Foo::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "6:11-6:14|6:1-6:19|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": ["3:8-3:11|3:3-3:13|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 2029211996748007610,
"detailed_name": "namespace hello {}",
"qual_name_offset": 10,
"short_name": "hello",
"bases": [],
"funcs": [],
"types": [4508214972876735896],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:16|1:1-7:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 4508214972876735896,
"detailed_name": "class hello::Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "2:7-2:10|2:1-4:2|1026|-1",
"bases": [],
"funcs": [10487325150128053272],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["6:6-6:9|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,64 @@
namespace hello {
class Foo {
void foo() {}
};
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 10487325150128053272,
"detailed_name": "void hello::Foo::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "3:8-3:11|3:3-3:16|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 2029211996748007610,
"detailed_name": "namespace hello {}",
"qual_name_offset": 10,
"short_name": "hello",
"bases": [],
"funcs": [],
"types": [4508214972876735896],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:16|1:1-5:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 4508214972876735896,
"detailed_name": "class hello::Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "2:7-2:10|2:1-4:2|1026|-1",
"bases": [],
"funcs": [10487325150128053272],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,162 @@
namespace foo {
namespace bar {
namespace baz {
int qux = 42;
}
}
}
namespace fbz = foo::bar::baz;
void func() {
int a = foo::bar::baz::qux;
int b = fbz::qux;
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 10818727483146447186,
"detailed_name": "void func()",
"qual_name_offset": 5,
"short_name": "func",
"spell": "11:6-11:10|11:1-14:2|2|-1",
"bases": [],
"vars": [6030927277961448585, 7657277353101371136],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [15042442838933090518, 6030927277961448585, 7657277353101371136],
"uses": []
}, {
"usr": 926793467007732869,
"detailed_name": "namespace foo {}",
"qual_name_offset": 10,
"short_name": "foo",
"bases": [],
"funcs": [],
"types": [17805385787823406700],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:14|1:1-7:2|1|-1"],
"derived": [17805385787823406700],
"instances": [],
"uses": ["9:17-9:20|4|-1", "12:11-12:14|4|-1"]
}, {
"usr": 11879713791858506216,
"detailed_name": "namespace fbz = foo::bar::baz",
"qual_name_offset": 10,
"short_name": "fbz",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 14450849931009540802,
"kind": 252,
"parent_kind": 0,
"declarations": ["9:11-9:14|9:1-9:30|1|-1"],
"derived": [],
"instances": [],
"uses": ["13:11-13:14|4|-1"]
}, {
"usr": 14450849931009540802,
"detailed_name": "namespace foo::bar::baz {}",
"qual_name_offset": 10,
"short_name": "baz",
"bases": [17805385787823406700],
"funcs": [],
"types": [],
"vars": [{
"L": 15042442838933090518,
"R": -1
}],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["3:20-3:23|3:10-5:11|1025|-1"],
"derived": [],
"instances": [],
"uses": ["9:27-9:30|4|-1", "12:21-12:24|4|-1"]
}, {
"usr": 17805385787823406700,
"detailed_name": "namespace foo::bar {}",
"qual_name_offset": 10,
"short_name": "bar",
"bases": [926793467007732869],
"funcs": [],
"types": [14450849931009540802],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["2:15-2:18|2:5-6:6|1025|-1"],
"derived": [14450849931009540802],
"instances": [],
"uses": ["9:22-9:25|4|-1", "12:16-12:19|4|-1"]
}],
"usr2var": [{
"usr": 6030927277961448585,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"hover": "int a = foo::bar::baz::qux",
"spell": "12:7-12:8|12:3-12:29|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 7657277353101371136,
"detailed_name": "int b",
"qual_name_offset": 4,
"short_name": "b",
"hover": "int b = fbz::qux",
"spell": "13:7-13:8|13:3-13:19|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15042442838933090518,
"detailed_name": "int foo::bar::baz::qux",
"qual_name_offset": 4,
"short_name": "qux",
"hover": "int foo::bar::baz::qux = 42",
"spell": "4:18-4:21|4:14-4:26|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": ["12:26-12:29|12|-1", "13:16-13:19|12|-1"]
}]
}
*/

View File

@ -0,0 +1,113 @@
namespace ns {
int Foo;
void Accept(int a) {}
}
void Runner() {
ns::Accept(ns::Foo);
using namespace ns;
Accept(Foo);
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 631910859630953711,
"detailed_name": "void Runner()",
"qual_name_offset": 5,
"short_name": "Runner",
"spell": "6:6-6:12|6:1-10:2|2|-1",
"bases": [],
"vars": [],
"callees": ["7:7-7:13|17328473273923617489|3|16420", "9:3-9:9|17328473273923617489|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 17328473273923617489,
"detailed_name": "void ns::Accept(int a)",
"qual_name_offset": 5,
"short_name": "Accept",
"spell": "3:8-3:14|3:3-3:24|1026|-1",
"bases": [],
"vars": [3649375698083002347],
"callees": [],
"kind": 12,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["7:7-7:13|16420|-1", "9:3-9:9|16420|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [12898699035586282159, 3649375698083002347],
"uses": []
}, {
"usr": 11072669167287398027,
"detailed_name": "namespace ns {}",
"qual_name_offset": 10,
"short_name": "ns",
"bases": [],
"funcs": [17328473273923617489],
"types": [],
"vars": [{
"L": 12898699035586282159,
"R": -1
}],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:13|1:1-4:2|1|-1"],
"derived": [],
"instances": [],
"uses": ["7:3-7:5|4|-1", "7:14-7:16|4|-1", "8:19-8:21|4|-1"]
}],
"usr2var": [{
"usr": 3649375698083002347,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"spell": "3:19-3:20|3:15-3:20|1026|-1",
"type": 53,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 12898699035586282159,
"detailed_name": "int ns::Foo",
"qual_name_offset": 4,
"short_name": "Foo",
"spell": "2:7-2:10|2:3-2:10|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": ["7:18-7:21|12|-1", "9:10-9:13|12|-1"]
}]
}
*/

View File

@ -0,0 +1,184 @@
@interface AClass
+ (void)test;
- (void)anInstanceMethod;
@property (nonatomic) int aProp;
@end
@implementation AClass
+ (void)test {}
- (void)anInstanceMethod {}
@end
int main(void)
{
AClass *instance = [AClass init];
[instance anInstanceMethod];
instance.aProp = 12;
}
/*
OUTPUT:
{
"includes": [],
"skipped_by_preprocessor": [],
"types": [{
"id": 0,
"usr": 11832280568361305387,
"detailed_name": "AClass",
"short_name": "AClass",
"kind": 7,
"spell": "7:17-7:23|-1|1|2",
"extent": "7:1-10:2|-1|1|0",
"parents": [],
"derived": [],
"types": [],
"funcs": [],
"vars": [],
"instances": [2],
"uses": ["14:3-14:9|-1|1|4", "14:23-14:29|-1|1|4"]
}, {
"id": 1,
"usr": 17,
"detailed_name": "",
"short_name": "",
"kind": 0,
"parents": [],
"derived": [],
"types": [],
"funcs": [],
"vars": [],
"instances": [0, 1],
"uses": []
}],
"funcs": [{
"id": 0,
"usr": 12775970426728664910,
"detailed_name": "AClass::test",
"short_name": "test",
"kind": 17,
"storage": 0,
"declarations": [{
"spelling": "2:11-2:15",
"extent": "2:3-2:16",
"content": "+ (void)test;",
"param_spellings": []
}],
"spell": "8:9-8:13|-1|1|2",
"extent": "8:1-8:16|-1|1|0",
"base": [],
"derived": [],
"locals": [],
"uses": [],
"callees": []
}, {
"id": 1,
"usr": 4096877434426330804,
"detailed_name": "AClass::anInstanceMethod",
"short_name": "anInstanceMethod",
"kind": 16,
"storage": 0,
"declarations": [{
"spelling": "3:11-3:27",
"extent": "3:3-3:28",
"content": "- (void)anInstanceMethod;",
"param_spellings": []
}],
"spell": "9:9-9:25|-1|1|2",
"extent": "9:1-9:28|-1|1|0",
"base": [],
"derived": [],
"locals": [],
"uses": ["15:13-15:29|4|3|64"],
"callees": []
}, {
"id": 2,
"usr": 12774569141855220778,
"detailed_name": "AClass::aProp",
"short_name": "aProp",
"kind": 16,
"storage": 0,
"declarations": [{
"spelling": "0:0-0:0",
"extent": "4:29-4:34",
"content": "aProp",
"param_spellings": []
}],
"extent": "4:29-4:34|-1|1|0",
"base": [],
"derived": [],
"locals": [],
"uses": [],
"callees": []
}, {
"id": 3,
"usr": 17992064398538597892,
"detailed_name": "AClass::setAProp:",
"short_name": "setAProp:",
"kind": 16,
"storage": 0,
"declarations": [{
"spelling": "0:0-0:0",
"extent": "4:29-4:34",
"content": "aProp",
"param_spellings": ["4:29-4:34"]
}],
"extent": "4:29-4:34|-1|1|0",
"base": [],
"derived": [],
"locals": [],
"uses": ["0:0-0:0|4|3|64"],
"callees": []
}, {
"id": 4,
"usr": 7033269674615638282,
"detailed_name": "int main()",
"short_name": "main",
"kind": 12,
"storage": 1,
"declarations": [],
"spell": "12:5-12:9|-1|1|2",
"extent": "12:1-17:2|-1|1|0",
"base": [],
"derived": [],
"locals": [],
"uses": [],
"callees": ["15:13-15:29|1|3|64", "0:0-0:0|3|3|64"]
}],
"vars": [{
"id": 0,
"usr": 14842397373703114213,
"detailed_name": "int AClass::aProp",
"short_name": "aProp",
"declarations": ["4:29-4:34|-1|1|1"],
"type": 1,
"uses": ["16:12-16:17|4|3|4"],
"kind": 19,
"storage": 0
}, {
"id": 1,
"usr": 17112602610366149042,
"detailed_name": "int AClass::_aProp",
"short_name": "_aProp",
"declarations": [],
"spell": "4:29-4:34|-1|1|2",
"extent": "4:29-4:34|-1|1|0",
"type": 1,
"uses": [],
"kind": 14,
"storage": 0
}, {
"id": 2,
"usr": 6849095699869081177,
"detailed_name": "AClass *instance",
"short_name": "instance",
"hover": "AClass *instance = [AClass init]",
"declarations": [],
"spell": "14:11-14:19|4|3|2",
"extent": "14:3-14:35|4|3|2",
"type": 0,
"uses": ["15:4-15:12|4|3|4", "16:3-16:11|4|3|4"],
"kind": 13,
"storage": 1
}]
}
*/

View File

@ -0,0 +1,92 @@
class Foo {
void operator()(int) { }
void operator()(bool);
int operator()(int a, int b);
};
Foo &operator += (const Foo&, const int&);
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3545323327609582678,
"detailed_name": "void Foo::operator()(bool)",
"qual_name_offset": 5,
"short_name": "operator()",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["3:8-3:16|3:3-3:24|1025|-1"],
"derived": [],
"uses": []
}, {
"usr": 3986818119971932909,
"detailed_name": "int Foo::operator()(int a, int b)",
"qual_name_offset": 4,
"short_name": "operator()",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["4:7-4:15|4:3-4:31|1025|-1"],
"derived": [],
"uses": []
}, {
"usr": 7874436189163837815,
"detailed_name": "void Foo::operator()(int)",
"qual_name_offset": 5,
"short_name": "operator()",
"spell": "2:8-2:18|2:3-2:27|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 8288368475529136092,
"detailed_name": "Foo &operator+=(const Foo &, const int &)",
"qual_name_offset": 5,
"short_name": "operator+=",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["7:6-7:14|7:1-7:42|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-5:2|2|-1",
"bases": [],
"funcs": [7874436189163837815, 3545323327609582678, 3986818119971932909],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["7:1-7:4|4|-1", "7:25-7:28|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,168 @@
#include "static_function_in_type.h"
namespace ns {
// static
void Foo::Register(Manager* m) {
}
}
/*
OUTPUT: static_function_in_type.h
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 17019747379608639279,
"detailed_name": "static void ns::Foo::Register(ns::Manager *)",
"qual_name_offset": 12,
"short_name": "Register",
"bases": [],
"vars": [],
"callees": [],
"kind": 254,
"parent_kind": 0,
"storage": 0,
"declarations": ["6:15-6:23|6:3-6:33|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 1972401196751872203,
"detailed_name": "class ns::Manager",
"qual_name_offset": 6,
"short_name": "Manager",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": ["3:7-3:14|3:1-3:14|1025|-1"],
"derived": [],
"instances": [],
"uses": ["6:24-6:31|4|-1"]
}, {
"usr": 11072669167287398027,
"detailed_name": "namespace ns {}",
"qual_name_offset": 10,
"short_name": "ns",
"bases": [],
"funcs": [],
"types": [1972401196751872203, 17262466801709381811],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:13|1:1-9:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 17262466801709381811,
"detailed_name": "struct ns::Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "5:8-5:11|5:1-7:2|1026|-1",
"bases": [],
"funcs": [17019747379608639279],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
OUTPUT: static_function_in_type.cc
{
"includes": [{
"line": 0,
"resolved_path": "&static_function_in_type.h"
}],
"skipped_ranges": [],
"usr2func": [{
"usr": 17019747379608639279,
"detailed_name": "static void ns::Foo::Register(ns::Manager *)",
"qual_name_offset": 12,
"short_name": "Register",
"spell": "5:11-5:19|5:1-6:2|1026|-1",
"comments": "static",
"bases": [],
"vars": [13569879755236306838],
"callees": [],
"kind": 254,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 1972401196751872203,
"detailed_name": "class ns::Manager",
"qual_name_offset": 6,
"short_name": "Manager",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [13569879755236306838],
"uses": ["5:20-5:27|4|-1"]
}, {
"usr": 11072669167287398027,
"detailed_name": "namespace ns {}",
"qual_name_offset": 10,
"short_name": "ns",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["3:11-3:13|3:1-7:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 17262466801709381811,
"detailed_name": "struct ns::Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"bases": [],
"funcs": [17019747379608639279],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["5:6-5:9|4|-1"]
}],
"usr2var": [{
"usr": 13569879755236306838,
"detailed_name": "ns::Manager *m",
"qual_name_offset": 13,
"short_name": "m",
"spell": "5:29-5:30|5:20-5:30|1026|-1",
"type": 1972401196751872203,
"kind": 253,
"parent_kind": 254,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,9 @@
namespace ns {
class Manager;
struct Foo {
static void Register(Manager*);
};
} // namespace ns

View File

@ -0,0 +1,28 @@
#ifndef FOO
#define FOO
#endif
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [],
"usr2var": [{
"usr": 14219599523415845943,
"detailed_name": "FOO",
"qual_name_offset": 0,
"short_name": "FOO",
"hover": "#define FOO",
"spell": "2:9-2:12|2:9-2:12|2|-1",
"type": 0,
"kind": 255,
"parent_kind": 1,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,25 @@
#ifdef FOOBAR
void hello();
#endif
#if false
#endif
#if defined(OS_FOO)
#endif
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": ["2:1-5:1", "6:1-11:1", "12:1-15:1"],
"usr2func": [],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,68 @@
template<class T>
class Template {};
struct Foo {
void Bar(Template<double>&);
};
void Foo::Bar(Template<double>&) {}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 8412238651648388423,
"detailed_name": "void Foo::Bar(Template<double> &)",
"qual_name_offset": 5,
"short_name": "Bar",
"spell": "8:11-8:14|8:1-8:36|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 23,
"storage": 0,
"declarations": ["5:8-5:11|5:3-5:30|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "4:8-4:11|4:1-6:2|2|-1",
"bases": [],
"funcs": [8412238651648388423],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["8:6-8:9|4|-1"]
}, {
"usr": 17107291254533526269,
"detailed_name": "class Template {}",
"qual_name_offset": 6,
"short_name": "Template",
"spell": "2:7-2:15|2:1-2:18|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["5:12-5:20|4|-1", "8:15-8:23|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,137 @@
namespace ns {
enum VarType {};
template<typename _>
struct Holder {
static constexpr VarType static_var = (VarType)0x0;
};
template<typename _>
const typename VarType Holder<_>::static_var;
int Foo = Holder<int>::static_var;
int Foo2 = Holder<int>::static_var;
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [12898699035586282159, 9008550860229740818],
"uses": []
}, {
"usr": 1532099849728741556,
"detailed_name": "enum ns::VarType {}",
"qual_name_offset": 5,
"short_name": "VarType",
"spell": "2:8-2:15|2:3-2:18|1026|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [4731849186641714451, 4731849186641714451],
"uses": ["6:22-6:29|4|-1", "6:44-6:51|4|-1", "10:18-10:25|4|-1"]
}, {
"usr": 11072669167287398027,
"detailed_name": "namespace ns {}",
"qual_name_offset": 10,
"short_name": "ns",
"bases": [],
"funcs": [],
"types": [1532099849728741556, 12688716854043726585],
"vars": [{
"L": 12898699035586282159,
"R": -1
}, {
"L": 9008550860229740818,
"R": -1
}],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:13|1:1-15:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 12688716854043726585,
"detailed_name": "struct ns::Holder {}",
"qual_name_offset": 7,
"short_name": "Holder",
"spell": "5:10-5:16|5:3-7:4|1026|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["10:26-10:32|4|-1", "13:13-13:19|4|-1", "14:14-14:20|4|-1"]
}],
"usr2var": [{
"usr": 4731849186641714451,
"detailed_name": "static constexpr ns::VarType ns::Holder::static_var",
"qual_name_offset": 29,
"short_name": "static_var",
"hover": "static constexpr ns::VarType ns::Holder::static_var = (VarType)0x0",
"spell": "10:37-10:47|9:3-10:47|1026|-1",
"type": 1532099849728741556,
"kind": 13,
"parent_kind": 23,
"storage": 2,
"declarations": ["6:30-6:40|6:5-6:55|1025|-1"],
"uses": ["13:26-13:36|12|-1", "14:27-14:37|12|-1"]
}, {
"usr": 9008550860229740818,
"detailed_name": "int ns::Foo2",
"qual_name_offset": 4,
"short_name": "Foo2",
"hover": "int ns::Foo2 = Holder<int>::static_var",
"spell": "14:7-14:11|14:3-14:37|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 12898699035586282159,
"detailed_name": "int ns::Foo",
"qual_name_offset": 4,
"short_name": "Foo",
"hover": "int ns::Foo = Holder<int>::static_var",
"spell": "13:7-13:10|13:3-13:36|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,110 @@
template <class T>
struct C {
T x;
void bar();
};
template <class T>
void foo() {
C<T> d;
d.x; // spelling range is empty, use cursor extent for range
d.bar(); // spelling range is empty, use cursor extent for range
auto e = new C<T>;
e->x; // `x` seems not exposed by libclang
e->bar(); // `bar` seems not exposed by libclang
}
/*
EXTRA_FLAGS:
-fms-extensions
-fms-compatibility
-fdelayed-template-parsing
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 6875364467121018690,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "8:6-8:9|8:1-8:11|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 8905286151237717330,
"detailed_name": "void C::bar()",
"qual_name_offset": 5,
"short_name": "bar",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["4:8-4:11|4:3-4:13|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 8402783583255987702,
"detailed_name": "struct C {}",
"qual_name_offset": 7,
"short_name": "C",
"spell": "2:8-2:9|2:1-5:2|2|-1",
"bases": [],
"funcs": [8905286151237717330],
"types": [],
"vars": [{
"L": 5866801090710377175,
"R": -1
}],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 14750650276757822712,
"detailed_name": "T",
"qual_name_offset": 0,
"short_name": "T",
"spell": "1:17-1:18|1:11-1:18|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 26,
"parent_kind": 5,
"declarations": [],
"derived": [],
"instances": [5866801090710377175],
"uses": []
}],
"usr2var": [{
"usr": 5866801090710377175,
"detailed_name": "T C::x",
"qual_name_offset": 2,
"short_name": "x",
"spell": "3:5-3:6|3:3-3:6|1026|-1",
"type": 14750650276757822712,
"kind": 8,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,119 @@
namespace ns {
template<typename T>
struct Foo {
template<typename R>
static int foo() {
return 3;
}
};
int a = Foo<int>::foo<float>();
int b = Foo<bool>::foo<double>();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 8221803074608342407,
"detailed_name": "static int ns::Foo::foo()",
"qual_name_offset": 11,
"short_name": "foo",
"spell": "5:16-5:19|5:5-7:6|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 254,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["10:21-10:24|36|-1", "11:22-11:25|36|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [15768138241775955040, 3182917058194750998],
"uses": []
}, {
"usr": 11072669167287398027,
"detailed_name": "namespace ns {}",
"qual_name_offset": 10,
"short_name": "ns",
"bases": [],
"funcs": [],
"types": [14042997404480181958],
"vars": [{
"L": 15768138241775955040,
"R": -1
}, {
"L": 3182917058194750998,
"R": -1
}],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:13|1:1-12:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 14042997404480181958,
"detailed_name": "struct ns::Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "3:10-3:13|3:3-8:4|1026|-1",
"bases": [],
"funcs": [8221803074608342407],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["10:11-10:14|4|-1", "11:11-11:14|4|-1"]
}],
"usr2var": [{
"usr": 3182917058194750998,
"detailed_name": "int ns::b",
"qual_name_offset": 4,
"short_name": "b",
"hover": "int ns::b = Foo<bool>::foo<double>()",
"spell": "11:7-11:8|11:3-11:35|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15768138241775955040,
"detailed_name": "int ns::a",
"qual_name_offset": 4,
"short_name": "a",
"hover": "int ns::a = Foo<int>::foo<float>()",
"spell": "10:7-10:8|10:3-10:33|1026|-1",
"type": 53,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,81 @@
namespace ns {
template<typename T>
class Foo {};
Foo<int> a;
Foo<bool> b;
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 11072669167287398027,
"detailed_name": "namespace ns {}",
"qual_name_offset": 10,
"short_name": "ns",
"bases": [],
"funcs": [],
"types": [14042997404480181958],
"vars": [{
"L": 15768138241775955040,
"R": -1
}, {
"L": 3182917058194750998,
"R": -1
}],
"alias_of": 0,
"kind": 3,
"parent_kind": 0,
"declarations": ["1:11-1:13|1:1-7:2|1|-1"],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 14042997404480181958,
"detailed_name": "class ns::Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "3:9-3:12|3:3-3:15|1026|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 3,
"declarations": [],
"derived": [],
"instances": [15768138241775955040, 3182917058194750998],
"uses": ["5:3-5:6|4|-1", "6:3-6:6|4|-1"]
}],
"usr2var": [{
"usr": 3182917058194750998,
"detailed_name": "Foo<bool> ns::b",
"qual_name_offset": 10,
"short_name": "b",
"spell": "6:13-6:14|6:3-6:14|1026|-1",
"type": 14042997404480181958,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15768138241775955040,
"detailed_name": "Foo<int> ns::a",
"qual_name_offset": 9,
"short_name": "a",
"spell": "5:12-5:13|5:3-5:13|1026|-1",
"type": 14042997404480181958,
"kind": 13,
"parent_kind": 3,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,422 @@
template<class T>
class function;
template<typename T, typename... Args>
class function<T(Args...)> {};
function<void(int)> f;
template<typename T> class allocator;
template<typename T, typename Alloc = allocator<T> >
class vector {
void clear();
};
template<typename T>
class vector<T*> {};
struct Z1 {};
template class vector<Z1>;
struct Z2 {};
template<>
class vector<Z2> {
void clear();
};
vector<char> vc;
vector<int*> vip;
vector<Z1> vz1;
vector<Z2> vz2;
enum Enum {
Enum0, Enum1
};
template <typename T, int I, Enum, int E>
void foo(T Value) {}
static const int kOnst = 7;
template <>
void foo<float, 9, Enum0, kOnst + 7>(float Value);
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3861597222587452538,
"detailed_name": "template<> void foo<float, 9, Enum0, 14>(float Value)",
"qual_name_offset": 16,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["43:6-43:9|42:1-43:50|1|-1"],
"derived": [],
"uses": []
}, {
"usr": 6113470698424012876,
"detailed_name": "void vector<Z2, allocator<Z2> >::clear()",
"qual_name_offset": 5,
"short_name": "clear",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["27:8-27:13|27:3-27:15|1025|-1"],
"derived": [],
"uses": []
}, {
"usr": 17498190318698490707,
"detailed_name": "void foo(T Value)",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "39:6-39:9|39:1-39:21|2|-1",
"bases": [],
"vars": [17826688417349629938],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 18107614608385228556,
"detailed_name": "void vector::clear()",
"qual_name_offset": 5,
"short_name": "clear",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["13:8-13:13|13:3-13:15|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [13914496963221806870],
"uses": []
}, {
"usr": 218068462278884837,
"detailed_name": "template <typename T, typename ...Args> class function<type-parameter-0-0 (type-parameter-0-1...)> {}",
"qual_name_offset": 46,
"short_name": "function",
"spell": "5:7-5:15|4:1-5:30|2|-1",
"bases": [15019211479263750068],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [2933643612409209903],
"uses": ["7:1-7:9|4|-1"]
}, {
"usr": 1663022413889915338,
"detailed_name": "template<> class vector<Z2, allocator<Z2>> {}",
"qual_name_offset": 17,
"short_name": "vector",
"spell": "26:7-26:13|25:1-28:2|2|-1",
"bases": [7440942986741176606],
"funcs": [6113470698424012876],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [15931696253641284761],
"uses": ["26:7-26:13|4|-1", "33:1-33:7|4|-1"]
}, {
"usr": 5760043510674081814,
"detailed_name": "struct Z1 {}",
"qual_name_offset": 7,
"short_name": "Z1",
"spell": "19:8-19:10|19:1-19:13|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["21:23-21:25|4|-1", "32:8-32:10|4|-1"]
}, {
"usr": 7440942986741176606,
"detailed_name": "class vector {}",
"qual_name_offset": 6,
"short_name": "vector",
"spell": "12:7-12:13|12:1-14:2|2|-1",
"bases": [],
"funcs": [18107614608385228556],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [16155717907537731864, 1663022413889915338],
"instances": [5792869548777559988],
"uses": ["17:7-17:13|4|-1", "21:16-21:22|4|-1", "30:1-30:7|4|-1", "32:1-32:7|4|-1"]
}, {
"usr": 9201299975592934124,
"detailed_name": "enum Enum {}",
"qual_name_offset": 5,
"short_name": "Enum",
"spell": "35:6-35:10|35:1-37:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 10124869160135436852,
"detailed_name": "struct Z2 {}",
"qual_name_offset": 7,
"short_name": "Z2",
"spell": "23:8-23:10|23:1-23:13|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["26:14-26:16|4|-1", "33:8-33:10|4|-1"]
}, {
"usr": 14111105212951082474,
"detailed_name": "T",
"qual_name_offset": 0,
"short_name": "T",
"spell": "38:20-38:21|38:11-38:21|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 26,
"parent_kind": 5,
"declarations": [],
"derived": [],
"instances": [17826688417349629938],
"uses": []
}, {
"usr": 15019211479263750068,
"detailed_name": "class function",
"qual_name_offset": 6,
"short_name": "function",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": ["2:7-2:15|2:1-2:15|1|-1"],
"derived": [218068462278884837],
"instances": [],
"uses": ["5:7-5:15|4|-1"]
}, {
"usr": 15440970074034693939,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [3566687051827176322],
"uses": []
}, {
"usr": 15695704394170757108,
"detailed_name": "class allocator",
"qual_name_offset": 6,
"short_name": "allocator",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": ["9:28-9:37|9:22-9:37|1|-1"],
"derived": [],
"instances": [],
"uses": ["11:39-11:48|4|-1"]
}, {
"usr": 16155717907537731864,
"detailed_name": "template <typename T> class vector<type-parameter-0-0 *, allocator<type-parameter-0-0 *>> {}",
"qual_name_offset": 28,
"short_name": "vector",
"spell": "17:7-17:13|16:1-17:20|2|-1",
"bases": [7440942986741176606],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [86949563628772958],
"uses": ["31:1-31:7|4|-1"]
}],
"usr2var": [{
"usr": 86949563628772958,
"detailed_name": "vector<int *> vip",
"qual_name_offset": 14,
"short_name": "vip",
"spell": "31:14-31:17|31:1-31:17|2|-1",
"type": 16155717907537731864,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 2933643612409209903,
"detailed_name": "function<void (int)> f",
"qual_name_offset": 21,
"short_name": "f",
"spell": "7:21-7:22|7:1-7:22|2|-1",
"type": 218068462278884837,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 3566687051827176322,
"detailed_name": "vector<Z1> vz1",
"qual_name_offset": 11,
"short_name": "vz1",
"spell": "32:12-32:15|32:1-32:15|2|-1",
"type": 15440970074034693939,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 4917621020431490070,
"detailed_name": "Enum1",
"qual_name_offset": 0,
"short_name": "Enum1",
"hover": "Enum1 = 1",
"spell": "36:10-36:15|36:10-36:15|1026|-1",
"type": 9201299975592934124,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 5792869548777559988,
"detailed_name": "vector<char> vc",
"qual_name_offset": 13,
"short_name": "vc",
"spell": "30:14-30:16|30:1-30:16|2|-1",
"type": 7440942986741176606,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 13914496963221806870,
"detailed_name": "static const int kOnst",
"qual_name_offset": 17,
"short_name": "kOnst",
"hover": "static const int kOnst = 7",
"spell": "41:18-41:23|41:1-41:27|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 2,
"declarations": [],
"uses": ["43:27-43:32|12|-1"]
}, {
"usr": 15477793821005285152,
"detailed_name": "Enum0",
"qual_name_offset": 0,
"short_name": "Enum0",
"hover": "Enum0 = 0",
"spell": "36:3-36:8|36:3-36:8|1026|-1",
"type": 9201299975592934124,
"kind": 22,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": ["43:20-43:25|4|-1"]
}, {
"usr": 15931696253641284761,
"detailed_name": "vector<Z2> vz2",
"qual_name_offset": 11,
"short_name": "vz2",
"spell": "33:12-33:15|33:1-33:15|2|-1",
"type": 1663022413889915338,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 17826688417349629938,
"detailed_name": "T Value",
"qual_name_offset": 2,
"short_name": "Value",
"spell": "39:12-39:17|39:10-39:17|1026|-1",
"type": 14111105212951082474,
"kind": 253,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,92 @@
template<class T>
class Template {
void Foo();
};
template<class T>
void Template<T>::Foo() {}
template<>
void Template<void>::Foo() {}
/*
// TODO: usage information on Template is bad.
// TODO: Foo() should have multiple definitions.
EXTRA_FLAGS:
-fms-compatibility
-fdelayed-template-parsing
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 6995843774014807426,
"detailed_name": "void Template<void>::Foo()",
"qual_name_offset": 5,
"short_name": "Foo",
"spell": "10:22-10:25|9:1-10:30|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 11994188353303124840,
"detailed_name": "void Template::Foo()",
"qual_name_offset": 5,
"short_name": "Foo",
"spell": "7:19-7:22|6:1-7:24|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 5,
"storage": 0,
"declarations": ["3:8-3:11|3:3-3:13|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 17107291254533526269,
"detailed_name": "class Template {}",
"qual_name_offset": 6,
"short_name": "Template",
"spell": "2:7-2:15|2:1-4:2|2|-1",
"bases": [],
"funcs": [11994188353303124840],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["7:6-7:14|4|-1", "10:6-10:14|4|-1"]
}, {
"usr": 17649312483543982122,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [6995843774014807426],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,94 @@
template<typename T>
struct Foo {
static int foo() {
return 3;
}
};
int a = Foo<int>::foo();
int b = Foo<bool>::foo();
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 8340731781048851399,
"detailed_name": "static int Foo::foo()",
"qual_name_offset": 11,
"short_name": "foo",
"spell": "3:14-3:17|3:3-5:4|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 254,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["8:19-8:22|36|-1", "9:20-9:23|36|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [16721564935990383768, 12028309045033782423],
"uses": []
}, {
"usr": 10528472276654770367,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "2:8-2:11|2:1-6:2|2|-1",
"bases": [],
"funcs": [8340731781048851399],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["8:9-8:12|4|-1", "9:9-9:12|4|-1"]
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "int b",
"qual_name_offset": 4,
"short_name": "b",
"hover": "int b = Foo<bool>::foo()",
"spell": "9:5-9:6|9:1-9:25|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"hover": "int a = Foo<int>::foo()",
"spell": "8:5-8:6|8:1-8:24|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,95 @@
template<typename T>
struct Foo {
template<typename R>
static int foo() {
return 3;
}
};
int a = Foo<int>::foo<float>();
int b = Foo<bool>::foo<double>();
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 9034026360701857235,
"detailed_name": "static int Foo::foo()",
"qual_name_offset": 11,
"short_name": "foo",
"spell": "4:14-4:17|4:3-6:4|1026|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 254,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["9:19-9:22|36|-1", "10:20-10:23|36|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [16721564935990383768, 12028309045033782423],
"uses": []
}, {
"usr": 10528472276654770367,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "2:8-2:11|2:1-7:2|2|-1",
"bases": [],
"funcs": [9034026360701857235],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["9:9-9:12|4|-1", "10:9-10:12|4|-1"]
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "int b",
"qual_name_offset": 4,
"short_name": "b",
"hover": "int b = Foo<bool>::foo<double>()",
"spell": "10:5-10:6|10:1-10:33|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"hover": "int a = Foo<int>::foo<float>()",
"spell": "9:5-9:6|9:1-9:31|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,131 @@
enum A {};
enum B {};
template<typename T>
struct Foo {
struct Inner {};
};
Foo<A>::Inner a;
Foo<B>::Inner b;
#if false
EnumDecl A
EnumDecl B
ClassTemplate Foo
TemplateTypeParameter T
StructDecl Inner
VarDecl a
TemplateRef Foo
TypeRef enum A
TypeRef struct Foo<enum A>::Inner
CallExpr Inner
VarDecl b
TemplateRef Foo
TypeRef enum B
TypeRef struct Foo<enum B>::Inner
CallExpr Inner
#endif
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": ["12:1-29:1"],
"usr2func": [],
"usr2type": [{
"usr": 6697181287623958829,
"detailed_name": "enum A {}",
"qual_name_offset": 5,
"short_name": "A",
"spell": "1:6-1:7|1:1-1:10|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["9:5-9:6|4|-1"]
}, {
"usr": 10528472276654770367,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "5:8-5:11|5:1-7:2|2|-1",
"bases": [],
"funcs": [],
"types": [13938528237873543349],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["9:1-9:4|4|-1", "10:1-10:4|4|-1"]
}, {
"usr": 13892793056005362145,
"detailed_name": "enum B {}",
"qual_name_offset": 5,
"short_name": "B",
"spell": "2:6-2:7|2:1-2:10|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["10:5-10:6|4|-1"]
}, {
"usr": 13938528237873543349,
"detailed_name": "struct Foo::Inner {}",
"qual_name_offset": 7,
"short_name": "Inner",
"spell": "6:10-6:15|6:3-6:18|1026|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 23,
"declarations": [],
"derived": [],
"instances": [16721564935990383768, 12028309045033782423],
"uses": ["9:9-9:14|4|-1", "10:9-10:14|4|-1"]
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "Foo<B>::Inner b",
"qual_name_offset": 14,
"short_name": "b",
"spell": "10:15-10:16|10:1-10:16|2|-1",
"type": 13938528237873543349,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "Foo<A>::Inner a",
"qual_name_offset": 14,
"short_name": "a",
"spell": "9:15-9:16|9:1-9:16|2|-1",
"type": 13938528237873543349,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,89 @@
template<typename T>
struct Foo {
static constexpr int var = 3;
};
int a = Foo<int>::var;
int b = Foo<bool>::var;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [13545144895171991916, 16721564935990383768, 12028309045033782423],
"uses": []
}, {
"usr": 10528472276654770367,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "2:8-2:11|2:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["6:9-6:12|4|-1", "7:9-7:12|4|-1"]
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "int b",
"qual_name_offset": 4,
"short_name": "b",
"hover": "int b = Foo<bool>::var",
"spell": "7:5-7:6|7:1-7:23|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 13545144895171991916,
"detailed_name": "static constexpr int Foo::var",
"qual_name_offset": 21,
"short_name": "var",
"hover": "static constexpr int Foo::var = 3",
"type": 53,
"kind": 13,
"parent_kind": 23,
"storage": 2,
"declarations": ["3:24-3:27|3:3-3:31|1025|-1"],
"uses": ["6:19-6:22|12|-1", "7:20-7:23|12|-1"]
}, {
"usr": 16721564935990383768,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"hover": "int a = Foo<int>::var",
"spell": "6:5-6:6|6:1-6:22|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,78 @@
template<typename T>
static int foo() {
return 3;
}
int a = foo<int>();
int b = foo<bool>();
// TODO: put template foo inside a namespace
// TODO: put template foo inside a template class inside a namespace
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 326583651986177228,
"detailed_name": "static int foo()",
"qual_name_offset": 11,
"short_name": "foo",
"spell": "2:12-2:15|2:1-4:2|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["6:9-6:12|36|-1", "7:9-7:12|36|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [16721564935990383768, 12028309045033782423],
"uses": []
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "int b",
"qual_name_offset": 4,
"short_name": "b",
"hover": "int b = foo<bool>()",
"spell": "7:5-7:6|7:1-7:20|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "int a",
"qual_name_offset": 4,
"short_name": "a",
"hover": "int a = foo<int>()",
"spell": "6:5-6:6|6:1-6:19|2|-1",
"type": 53,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,57 @@
template<typename T>
class Foo {};
Foo<int> a;
Foo<bool> b;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 10528472276654770367,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "2:7-2:10|2:1-2:13|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [16721564935990383768, 12028309045033782423],
"uses": ["4:1-4:4|4|-1", "5:1-5:4|4|-1"]
}],
"usr2var": [{
"usr": 12028309045033782423,
"detailed_name": "Foo<bool> b",
"qual_name_offset": 10,
"short_name": "b",
"spell": "5:11-5:12|5:1-5:12|2|-1",
"type": 10528472276654770367,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "Foo<int> a",
"qual_name_offset": 9,
"short_name": "a",
"spell": "4:10-4:11|4:1-4:11|2|-1",
"type": 10528472276654770367,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,132 @@
enum A {};
enum B {};
template<typename T>
T var = T();
A a = var<A>;
B b = var<B>;
// NOTE: libclang before 4.0 doesn't expose template usage on |var|.
#if false
EnumDecl A
EnumDecl B
UnexposedDecl var
VarDecl a
UnexposedExpr var
UnexposedExpr var
DeclRefExpr var
TypeRef enum A
UnexposedDecl var
VarDecl b
UnexposedExpr var
UnexposedExpr var
DeclRefExpr var
TypeRef enum B
UnexposedDecl var
#endif
/*
EXTRA_FLAGS:
-std=c++14
OUTPUT:
{
"includes": [],
"skipped_ranges": ["12:1-29:1"],
"usr2func": [],
"usr2type": [{
"usr": 6697181287623958829,
"detailed_name": "enum A {}",
"qual_name_offset": 5,
"short_name": "A",
"spell": "1:6-1:7|1:1-1:10|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [16721564935990383768],
"uses": ["7:1-7:2|4|-1", "7:11-7:12|4|-1"]
}, {
"usr": 11919899838872947844,
"detailed_name": "T",
"qual_name_offset": 0,
"short_name": "T",
"spell": "4:19-4:20|4:10-4:20|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 26,
"parent_kind": 5,
"declarations": [],
"derived": [],
"instances": [8096973118640070624],
"uses": []
}, {
"usr": 13892793056005362145,
"detailed_name": "enum B {}",
"qual_name_offset": 5,
"short_name": "B",
"spell": "2:6-2:7|2:1-2:10|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 10,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [12028309045033782423],
"uses": ["8:1-8:2|4|-1", "8:11-8:12|4|-1"]
}],
"usr2var": [{
"usr": 8096973118640070624,
"detailed_name": "T var",
"qual_name_offset": 2,
"short_name": "var",
"hover": "T var = T()",
"spell": "5:3-5:6|5:1-5:12|2|-1",
"type": 11919899838872947844,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": ["7:7-7:10|12|-1", "8:7-8:10|12|-1"]
}, {
"usr": 12028309045033782423,
"detailed_name": "B b",
"qual_name_offset": 2,
"short_name": "b",
"hover": "B b = var<B>",
"spell": "8:3-8:4|8:1-8:13|2|-1",
"type": 13892793056005362145,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 16721564935990383768,
"detailed_name": "A a",
"qual_name_offset": 2,
"short_name": "a",
"hover": "A a = var<A>",
"spell": "7:3-7:4|7:1-7:13|2|-1",
"type": 6697181287623958829,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,134 @@
union vector3 {
struct { float x, y, z; };
float v[3];
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 82,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [3348817847649945564, 4821094820988543895, 15292551660437765731],
"uses": []
}, {
"usr": 1428566502523368801,
"detailed_name": "anon struct",
"qual_name_offset": 0,
"short_name": "anon struct",
"spell": "2:3-2:9|2:3-2:28|1026|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 3348817847649945564,
"R": 0
}, {
"L": 4821094820988543895,
"R": 32
}, {
"L": 15292551660437765731,
"R": 64
}],
"alias_of": 0,
"kind": 23,
"parent_kind": 5,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}, {
"usr": 17937907487590875128,
"detailed_name": "union vector3 {}",
"qual_name_offset": 6,
"short_name": "vector3",
"spell": "1:7-1:14|1:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [1428566502523368801],
"vars": [{
"L": 1963212417280098348,
"R": 0
}, {
"L": 3348817847649945564,
"R": 0
}, {
"L": 4821094820988543895,
"R": 32
}, {
"L": 15292551660437765731,
"R": 64
}],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 1963212417280098348,
"detailed_name": "float vector3::v[3]",
"qual_name_offset": 6,
"short_name": "v",
"spell": "3:9-3:10|3:3-3:13|1026|-1",
"type": 0,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 3348817847649945564,
"detailed_name": "float vector3::(anon struct)::x",
"qual_name_offset": 6,
"short_name": "x",
"spell": "2:18-2:19|2:12-2:19|1026|-1",
"type": 82,
"kind": 8,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 4821094820988543895,
"detailed_name": "float vector3::(anon struct)::y",
"qual_name_offset": 6,
"short_name": "y",
"spell": "2:21-2:22|2:12-2:22|1026|-1",
"type": 82,
"kind": 8,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 15292551660437765731,
"detailed_name": "float vector3::(anon struct)::z",
"qual_name_offset": 6,
"short_name": "z",
"spell": "2:24-2:25|2:12-2:25|1026|-1",
"type": 82,
"kind": 8,
"parent_kind": 23,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,44 @@
typedef int (func)(const int *a, const int *b);
static func g;
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 8105378401105136463,
"detailed_name": "static int g(const int *, const int *)",
"qual_name_offset": 11,
"short_name": "g",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:13-2:14|2:1-2:14|1|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 10383876566159302459,
"detailed_name": "typedef int (func)(const int *, const int *)",
"qual_name_offset": 12,
"short_name": "func",
"spell": "1:14-1:18|1:1-1:47|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 252,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["2:8-2:12|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,94 @@
union Foo {
int a;
bool b;
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [],
"usr2type": [{
"usr": 37,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [8804696910588009104],
"uses": []
}, {
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [9529311430721959843],
"uses": []
}, {
"usr": 8501689086387244262,
"detailed_name": "union Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 9529311430721959843,
"R": 0
}, {
"L": 8804696910588009104,
"R": 0
}],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 8804696910588009104,
"detailed_name": "bool Foo::b",
"qual_name_offset": 5,
"short_name": "b",
"spell": "3:8-3:9|3:3-3:9|1026|-1",
"type": 37,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 9529311430721959843,
"detailed_name": "int Foo::a",
"qual_name_offset": 4,
"short_name": "a",
"spell": "2:7-2:8|2:3-2:8|1026|-1",
"type": 53,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,129 @@
union Foo {
int a : 5;
bool b : 3;
};
Foo f;
void act(Foo*) {
f.a = 3;
}
/*
// TODO: instantiations on Foo should include parameter?
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 13982179977217945200,
"detailed_name": "void act(Foo *)",
"qual_name_offset": 5,
"short_name": "act",
"spell": "8:6-8:9|8:1-10:2|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 37,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [8804696910588009104],
"uses": []
}, {
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [9529311430721959843],
"uses": []
}, {
"usr": 8501689086387244262,
"detailed_name": "union Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "1:7-1:10|1:1-4:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 9529311430721959843,
"R": 0
}, {
"L": 8804696910588009104,
"R": 0
}],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [2933643612409209903],
"uses": ["6:1-6:4|4|-1", "8:10-8:13|4|-1"]
}],
"usr2var": [{
"usr": 2933643612409209903,
"detailed_name": "Foo f",
"qual_name_offset": 4,
"short_name": "f",
"spell": "6:5-6:6|6:1-6:6|2|-1",
"type": 8501689086387244262,
"kind": 13,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"uses": ["9:3-9:4|4|-1"]
}, {
"usr": 8804696910588009104,
"detailed_name": "bool Foo::b : 3",
"qual_name_offset": 5,
"short_name": "b",
"spell": "3:8-3:9|3:3-3:13|1026|-1",
"type": 37,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": []
}, {
"usr": 9529311430721959843,
"detailed_name": "int Foo::a : 5",
"qual_name_offset": 4,
"short_name": "a",
"spell": "2:7-2:8|2:3-2:12|1026|-1",
"type": 53,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": ["9:5-9:6|20|-1"]
}]
}
*/

View File

@ -0,0 +1,67 @@
void called() {}
struct Foo {
Foo();
};
Foo::Foo() {
called();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 468307235068920063,
"detailed_name": "void called()",
"qual_name_offset": 5,
"short_name": "called",
"spell": "1:6-1:12|1:1-1:17|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["8:3-8:9|16420|-1"]
}, {
"usr": 3385168158331140247,
"detailed_name": "Foo::Foo()",
"qual_name_offset": 0,
"short_name": "Foo",
"spell": "7:6-7:9|7:1-9:2|1026|-1",
"bases": [],
"vars": [],
"callees": ["8:3-8:9|468307235068920063|3|16420"],
"kind": 9,
"parent_kind": 23,
"storage": 0,
"declarations": ["4:3-4:6|4:3-4:8|1025|-1"],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "3:8-3:11|3:1-5:2|2|-1",
"bases": [],
"funcs": [3385168158331140247],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["4:3-4:6|4|-1", "7:1-7:4|4|-1", "7:6-7:9|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,60 @@
#define MACRO_CALL(e) e
bool called(bool a, bool b);
void caller() {
MACRO_CALL(called(true, true));
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 3787803219955606747,
"detailed_name": "bool called(bool a, bool b)",
"qual_name_offset": 5,
"short_name": "called",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["3:6-3:12|3:1-3:28|1|-1"],
"derived": [],
"uses": ["6:14-6:20|16420|-1", "6:14-6:20|64|0"]
}, {
"usr": 11404881820527069090,
"detailed_name": "void caller()",
"qual_name_offset": 5,
"short_name": "caller",
"spell": "5:6-5:12|5:1-7:2|2|-1",
"bases": [],
"vars": [],
"callees": ["6:14-6:20|3787803219955606747|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": [{
"usr": 16326993795872073150,
"detailed_name": "MACRO_CALL",
"qual_name_offset": 0,
"short_name": "MACRO_CALL",
"hover": "#define MACRO_CALL(e) e",
"spell": "1:9-1:19|1:9-1:24|2|-1",
"type": 0,
"kind": 255,
"parent_kind": 1,
"storage": 0,
"declarations": [],
"uses": ["6:3-6:13|64|-1"]
}]
}
*/

View File

@ -0,0 +1,81 @@
void called();
template <typename T>
void caller() {
called();
}
void foo() {
caller<int>();
}
/*
// NOTE: without caller<int>() instantation caller() is never visited so
// called() is never referenced.
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 468307235068920063,
"detailed_name": "void called()",
"qual_name_offset": 5,
"short_name": "called",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["1:6-1:12|1:1-1:14|1|-1"],
"derived": [],
"uses": ["5:3-5:9|16420|-1"]
}, {
"usr": 2459767597003442547,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"vars": [],
"callees": ["5:3-5:9|468307235068920063|3|16420"],
"kind": 0,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"spell": "8:6-8:9|8:1-10:2|2|-1",
"bases": [],
"vars": [],
"callees": ["9:3-9:9|10177235824697315808|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 10177235824697315808,
"detailed_name": "void caller()",
"qual_name_offset": 5,
"short_name": "caller",
"spell": "4:6-4:12|4:1-6:2|2|-1",
"bases": [],
"vars": [],
"callees": ["5:3-5:9|468307235068920063|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["9:3-9:9|16420|-1"]
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,81 @@
struct Wrapper {
Wrapper(int i);
};
int called() { return 1; }
Wrapper caller() {
return called();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 468307235068920063,
"detailed_name": "int called()",
"qual_name_offset": 4,
"short_name": "called",
"spell": "5:5-5:11|5:1-5:27|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["8:10-8:16|16420|-1"]
}, {
"usr": 10544127002917214589,
"detailed_name": "Wrapper::Wrapper(int i)",
"qual_name_offset": 0,
"short_name": "Wrapper",
"bases": [],
"vars": [],
"callees": [],
"kind": 9,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:3-2:10|2:3-2:17|1025|-1"],
"derived": [],
"uses": ["8:10-8:16|16676|-1"]
}, {
"usr": 11404881820527069090,
"detailed_name": "Wrapper caller()",
"qual_name_offset": 8,
"short_name": "caller",
"spell": "7:9-7:15|7:1-9:2|2|-1",
"bases": [],
"vars": [],
"callees": ["8:10-8:16|10544127002917214589|3|16676", "8:10-8:16|468307235068920063|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [{
"usr": 13611487872560323389,
"detailed_name": "struct Wrapper {}",
"qual_name_offset": 7,
"short_name": "Wrapper",
"spell": "1:8-1:15|1:1-3:2|2|-1",
"bases": [],
"funcs": [10544127002917214589],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["2:3-2:10|4|-1", "7:1-7:8|4|-1"]
}],
"usr2var": []
}
*/

View File

@ -0,0 +1,77 @@
void consume(void (*)()) {}
void used() {}
void user() {
void (*x)() = &used;
consume(&used);
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 5264867802674151787,
"detailed_name": "void used()",
"qual_name_offset": 5,
"short_name": "used",
"spell": "3:6-3:10|3:1-3:15|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["6:18-6:22|132|-1", "7:12-7:16|132|-1"]
}, {
"usr": 9376923949268137283,
"detailed_name": "void user()",
"qual_name_offset": 5,
"short_name": "user",
"spell": "5:6-5:10|5:1-8:2|2|-1",
"bases": [],
"vars": [16088407831770615719],
"callees": ["6:18-6:22|5264867802674151787|3|132", "6:18-6:22|5264867802674151787|3|132", "7:3-7:10|12924914488846929470|3|16420", "7:12-7:16|5264867802674151787|3|132"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 12924914488846929470,
"detailed_name": "void consume(void (*)())",
"qual_name_offset": 5,
"short_name": "consume",
"spell": "1:6-1:13|1:1-1:28|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["7:3-7:10|16420|-1"]
}],
"usr2type": [],
"usr2var": [{
"usr": 16088407831770615719,
"detailed_name": "void (*x)()",
"qual_name_offset": 7,
"short_name": "x",
"hover": "void (*x)() = &used",
"spell": "6:10-6:11|6:3-6:22|2|-1",
"type": 0,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,78 @@
struct Foo {
void Used();
};
void user() {
auto x = &Foo::Used;
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 9376923949268137283,
"detailed_name": "void user()",
"qual_name_offset": 5,
"short_name": "user",
"spell": "5:6-5:10|5:1-7:2|2|-1",
"bases": [],
"vars": [4636142131003982569],
"callees": ["6:18-6:22|18417145003926999463|3|132", "6:18-6:22|18417145003926999463|3|132"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 18417145003926999463,
"detailed_name": "void Foo::Used()",
"qual_name_offset": 5,
"short_name": "Used",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:8-2:12|2:3-2:14|1025|-1"],
"derived": [],
"uses": ["6:18-6:22|132|-1"]
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "1:8-1:11|1:1-3:2|2|-1",
"bases": [],
"funcs": [18417145003926999463],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": ["6:13-6:16|4|-1"]
}],
"usr2var": [{
"usr": 4636142131003982569,
"detailed_name": "void (Foo::*)() x",
"qual_name_offset": 16,
"short_name": "x",
"hover": "void (Foo::*)() x = &Foo::Used",
"spell": "6:8-6:9|6:3-6:22|2|-1",
"type": 0,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,45 @@
void called() {}
void caller() {
called();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 468307235068920063,
"detailed_name": "void called()",
"qual_name_offset": 5,
"short_name": "called",
"spell": "1:6-1:12|1:1-1:17|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["3:3-3:9|16420|-1"]
}, {
"usr": 11404881820527069090,
"detailed_name": "void caller()",
"qual_name_offset": 5,
"short_name": "caller",
"spell": "2:6-2:12|2:1-4:2|2|-1",
"bases": [],
"vars": [],
"callees": ["3:3-3:9|468307235068920063|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,78 @@
struct Foo {
void Used();
};
void user() {
Foo* f = nullptr;
f->Used();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 9376923949268137283,
"detailed_name": "void user()",
"qual_name_offset": 5,
"short_name": "user",
"spell": "5:6-5:10|5:1-8:2|2|-1",
"bases": [],
"vars": [14045150712868309451],
"callees": ["7:6-7:10|18417145003926999463|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 18417145003926999463,
"detailed_name": "void Foo::Used()",
"qual_name_offset": 5,
"short_name": "Used",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:8-2:12|2:3-2:14|1025|-1"],
"derived": [],
"uses": ["7:6-7:10|16420|-1"]
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "1:8-1:11|1:1-3:2|2|-1",
"bases": [],
"funcs": [18417145003926999463],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [14045150712868309451],
"uses": ["6:3-6:6|4|-1"]
}],
"usr2var": [{
"usr": 14045150712868309451,
"detailed_name": "Foo *f",
"qual_name_offset": 5,
"short_name": "f",
"hover": "Foo *f = nullptr",
"spell": "6:8-6:9|6:3-6:19|2|-1",
"type": 15041163540773201510,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": ["7:3-7:4|12|-1"]
}]
}
*/

View File

@ -0,0 +1,82 @@
static int helper() {
return 5;
}
class Foo {
int x = helper();
};
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 9630503130605430498,
"detailed_name": "static int helper()",
"qual_name_offset": 11,
"short_name": "helper",
"spell": "1:12-1:18|1:1-3:2|2|-1",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": ["6:11-6:17|36|-1"]
}],
"usr2type": [{
"usr": 53,
"detailed_name": "",
"qual_name_offset": 0,
"short_name": "",
"bases": [],
"funcs": [],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 0,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [4220150017963593039],
"uses": []
}, {
"usr": 15041163540773201510,
"detailed_name": "class Foo {}",
"qual_name_offset": 6,
"short_name": "Foo",
"spell": "5:7-5:10|5:1-7:2|2|-1",
"bases": [],
"funcs": [],
"types": [],
"vars": [{
"L": 4220150017963593039,
"R": 0
}],
"alias_of": 0,
"kind": 5,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [],
"uses": []
}],
"usr2var": [{
"usr": 4220150017963593039,
"detailed_name": "int Foo::x",
"qual_name_offset": 4,
"short_name": "x",
"hover": "int Foo::x = helper()",
"spell": "6:7-6:8|6:3-6:19|1026|-1",
"type": 53,
"kind": 8,
"parent_kind": 5,
"storage": 0,
"declarations": [],
"uses": []
}]
}
*/

View File

@ -0,0 +1,44 @@
void foo();
void usage() {
foo();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 4259594751088586730,
"detailed_name": "void foo()",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": ["1:6-1:9|1:1-1:11|1|-1"],
"derived": [],
"uses": ["4:3-4:6|16420|-1"]
}, {
"usr": 6767773193109753523,
"detailed_name": "void usage()",
"qual_name_offset": 5,
"short_name": "usage",
"spell": "3:6-3:11|3:1-5:2|2|-1",
"bases": [],
"vars": [],
"callees": ["4:3-4:6|4259594751088586730|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}],
"usr2type": [],
"usr2var": []
}
*/

View File

@ -0,0 +1,77 @@
struct Foo {
void foo();
};
void usage() {
Foo* f = nullptr;
f->foo();
}
/*
OUTPUT:
{
"includes": [],
"skipped_ranges": [],
"usr2func": [{
"usr": 6767773193109753523,
"detailed_name": "void usage()",
"qual_name_offset": 5,
"short_name": "usage",
"spell": "5:6-5:11|5:1-8:2|2|-1",
"bases": [],
"vars": [16229832321010999607],
"callees": ["7:6-7:9|17922201480358737771|3|16420"],
"kind": 12,
"parent_kind": 0,
"storage": 0,
"declarations": [],
"derived": [],
"uses": []
}, {
"usr": 17922201480358737771,
"detailed_name": "void Foo::foo()",
"qual_name_offset": 5,
"short_name": "foo",
"bases": [],
"vars": [],
"callees": [],
"kind": 6,
"parent_kind": 0,
"storage": 0,
"declarations": ["2:8-2:11|2:3-2:13|1025|-1"],
"derived": [],
"uses": ["7:6-7:9|16420|-1"]
}],
"usr2type": [{
"usr": 15041163540773201510,
"detailed_name": "struct Foo {}",
"qual_name_offset": 7,
"short_name": "Foo",
"spell": "1:8-1:11|1:1-3:2|2|-1",
"bases": [],
"funcs": [17922201480358737771],
"types": [],
"vars": [],
"alias_of": 0,
"kind": 23,
"parent_kind": 0,
"declarations": [],
"derived": [],
"instances": [16229832321010999607],
"uses": ["6:3-6:6|4|-1"]
}],
"usr2var": [{
"usr": 16229832321010999607,
"detailed_name": "Foo *f",
"qual_name_offset": 5,
"short_name": "f",
"hover": "Foo *f = nullptr",
"spell": "6:8-6:9|6:3-6:19|2|-1",
"type": 15041163540773201510,
"kind": 13,
"parent_kind": 12,
"storage": 0,
"declarations": [],
"uses": ["7:3-7:4|12|-1"]
}]
}
*/

Some files were not shown because too many files have changed in this diff Show More