diff --git a/src/indexer.cc b/src/indexer.cc
index e9c422c3..cb5a7253 100644
--- a/src/indexer.cc
+++ b/src/indexer.cc
@@ -1008,7 +1008,26 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
         func->def.definition_extent = ResolveExtent(decl->cursor);
       }
       else {
-        func->declarations.push_back(decl_spelling);
+        IndexFunc::Declaration declaration;
+        declaration.spelling = decl_spelling;
+
+        /*
+        for (clang::Cursor arg : decl_cursor.get_arguments()) {
+          switch (arg.get_kind()) {
+            case CXCursor_ParmDecl: {
+              IndexFunc::DeclarationVariable decl_var;
+              decl_var.content = arg.get_display_name(); // FIXME/TODO: scan actual tokens.
+              decl_var.spelling = ResolveSpelling(arg.cx_cursor);
+              declaration.vars.push_back(decl_var);
+              break;
+            }
+            default:
+              break;
+          }
+        }
+        */
+
+        func->declarations.push_back(declaration);
       }
 
       // Emit definition data for the function. We do this even if it isn't a
@@ -1074,32 +1093,6 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
           clang_disposeOverriddenCursors(overridden);
         }
       }
-
-      // else {
-        // Add declaration.
-        // func_def->declarations.push_back(ResolveSpelling(decl->cursor));
-        /* TODO/FIXME: enable this block
-        IndexFunc::Declaration declaration;
-        declaration.extent = ResolveExtent(decl->cursor);
-
-        clang::Cursor cursor = decl->cursor;
-        for (clang::Cursor arg : cursor.get_arguments()) {
-          switch (arg.get_kind()) {
-            case CXCursor_ParmDecl: {
-              IndexFunc::DeclarationVariable decl_var;
-              // FIXME/TODO: scan actual tokens.
-              decl_var.extent_string = arg.get_display_name();
-              decl_var.spelling = ResolveSpelling(arg.cx_cursor);
-              declaration.vars.push_back(decl_var);
-              break;
-            }
-            default:
-              break;
-          }
-        }
-        func_def->declarations.push_back(declaration);
-        */
-      // }
       break;
     }
 
diff --git a/src/indexer.h b/src/indexer.h
index ba3844bc..01ed0983 100644
--- a/src/indexer.h
+++ b/src/indexer.h
@@ -316,8 +316,19 @@ struct IndexFunc {
 
   IndexFuncId id;
 
+  struct DeclarationVariable {
+    // Spelled name of the variable.
+    Range spelling;
+    // Full text (including type) of the variable.
+    std::string content;
+  };
+  struct Declaration {
+    Range spelling;
+    std::vector<DeclarationVariable> vars;
+  };
+
   // Places the function is forward-declared.
-  std::vector<Range> declarations;
+  std::vector<Declaration> declarations;
 
   // Methods which directly override this one.
   std::vector<IndexFuncId> derived;
@@ -339,6 +350,8 @@ struct IndexFunc {
   }
 };
 MAKE_HASHABLE(IndexFunc, t.def.usr);
+MAKE_REFLECT_STRUCT(IndexFunc::DeclarationVariable, spelling, content);
+MAKE_REFLECT_STRUCT(IndexFunc::Declaration, spelling, vars);
 
 template <typename TypeId,
           typename FuncId,
@@ -447,7 +460,7 @@ MAKE_REFLECT_STRUCT(IndexInclude, line, resolved_path);
 struct IndexFile {
   IdCache id_cache;
 
-  static constexpr int kCurrentVersion = 3;
+  static constexpr int kCurrentVersion = 4;
   int version = 0;
 
   std::string path;
diff --git a/src/query.cc b/src/query.cc
index a06aac15..329865b6 100644
--- a/src/query.cc
+++ b/src/query.cc
@@ -195,9 +195,10 @@ QueryFile::Def BuildFileDef(const IdMap& id_map, const IndexFile& indexed) {
       add_all_symbols(id_map.ToSymbol(func.id), func.def.definition_spelling.value());
     if (func.def.definition_extent.has_value())
       add_outline(id_map.ToSymbol(func.id), func.def.definition_extent.value());
-    for (Range decl : func.declarations) {
-      add_all_symbols(id_map.ToSymbol(func.id), decl);
-      add_outline(id_map.ToSymbol(func.id), decl);
+    for (const IndexFunc::Declaration& decl : func.declarations) {
+      // TODO: add more outline info?
+      add_all_symbols(id_map.ToSymbol(func.id), decl.spelling);
+      add_outline(id_map.ToSymbol(func.id), decl.spelling);
     }
     for (const IndexFuncRef& caller : func.callers) {
       if (caller.is_implicit) continue;
@@ -320,7 +321,6 @@ IdMap::IdMap(QueryDatabase* query_db, const IdCache& local_ids)
 QueryLocation IdMap::ToQuery(Range range) const {
   return QueryLocation(primary_file, range);
 }
-
 QueryTypeId IdMap::ToQuery(IndexTypeId id) const {
   assert(cached_type_ids_.find(id) != cached_type_ids_.end());
   return QueryTypeId(cached_type_ids_.find(id)->second);
@@ -337,6 +337,10 @@ QueryVarId IdMap::ToQuery(IndexVarId id) const {
 QueryFuncRef IdMap::ToQuery(IndexFuncRef ref) const {
   return QueryFuncRef(ToQuery(ref.id), ToQuery(ref.loc), ref.is_implicit);
 }
+QueryLocation IdMap::ToQuery(IndexFunc::Declaration decl) const {
+  // TODO: expose more than just QueryLocation.
+  return QueryLocation(primary_file, decl.spelling);
+}
 
 optional<QueryLocation> IdMap::ToQuery(optional<Range> range) const {
   if (!range)
@@ -363,6 +367,11 @@ optional<QueryFuncRef> IdMap::ToQuery(optional<IndexFuncRef> ref) const {
     return nullopt;
   return ToQuery(ref.value());
 }
+optional<QueryLocation> IdMap::ToQuery(optional<IndexFunc::Declaration> decl) const {
+  if (!decl)
+    return nullopt;
+  return ToQuery(decl.value());
+}
 
 template<typename In, typename Out>
 std::vector<Out> ToQueryTransform(const IdMap& id_map, const std::vector<In>& input) {
@@ -387,6 +396,9 @@ std::vector<QueryVarId> IdMap::ToQuery(std::vector<IndexVarId> ids) const {
 std::vector<QueryFuncRef> IdMap::ToQuery(std::vector<IndexFuncRef> refs) const {
   return ToQueryTransform<IndexFuncRef, QueryFuncRef>(*this, refs);
 }
+std::vector<QueryLocation> IdMap::ToQuery(std::vector<IndexFunc::Declaration> decls) const {
+  return ToQueryTransform<IndexFunc::Declaration, QueryLocation>(*this, decls);
+}
 
 SymbolIdx IdMap::ToSymbol(IndexTypeId id) const {
   return SymbolIdx(SymbolKind::Type, ToQuery(id).id);
diff --git a/src/query.h b/src/query.h
index 4869a842..3ed5e98c 100644
--- a/src/query.h
+++ b/src/query.h
@@ -315,16 +315,19 @@ struct IdMap {
   QueryFuncId ToQuery(IndexFuncId id) const;
   QueryVarId ToQuery(IndexVarId id) const;
   QueryFuncRef ToQuery(IndexFuncRef ref) const;
+  QueryLocation ToQuery(IndexFunc::Declaration decl) const;
   optional<QueryLocation> ToQuery(optional<Range> range) const;
   optional<QueryTypeId> ToQuery(optional<IndexTypeId> id) const;
   optional<QueryFuncId> ToQuery(optional<IndexFuncId> id) const;
   optional<QueryVarId> ToQuery(optional<IndexVarId> id) const;
   optional<QueryFuncRef> ToQuery(optional<IndexFuncRef> ref) const;
+  optional<QueryLocation> ToQuery(optional<IndexFunc::Declaration> decl) const;
   std::vector<QueryLocation> ToQuery(std::vector<Range> ranges) const;
   std::vector<QueryTypeId> ToQuery(std::vector<IndexTypeId> ids) const;
   std::vector<QueryFuncId> ToQuery(std::vector<IndexFuncId> ids) const;
   std::vector<QueryVarId> ToQuery(std::vector<IndexVarId> ids) const;
   std::vector<QueryFuncRef> ToQuery(std::vector<IndexFuncRef> refs) const;
+  std::vector<QueryLocation> ToQuery(std::vector<IndexFunc::Declaration> decls) const;
 
   SymbolIdx ToSymbol(IndexTypeId id) const;
   SymbolIdx ToSymbol(IndexFuncId id) const;
diff --git a/tests/declaration_vs_definition/func.cc b/tests/declaration_vs_definition/func.cc
index 6770e1b3..e46fb21c 100644
--- a/tests/declaration_vs_definition/func.cc
+++ b/tests/declaration_vs_definition/func.cc
@@ -12,7 +12,13 @@ OUTPUT:
       "usr": "c:@F@foo#",
       "short_name": "foo",
       "detailed_name": "void foo()",
-      "declarations": ["1:6-1:9", "2:6-2:9", "4:6-4:9"],
+      "declarations": [{
+          "spelling": "1:6-1:9"
+        }, {
+          "spelling": "2:6-2:9"
+        }, {
+          "spelling": "4:6-4:9"
+        }],
       "definition_spelling": "3:6-3:9",
       "definition_extent": "3:1-3:14"
     }]
diff --git a/tests/declaration_vs_definition/method.cc b/tests/declaration_vs_definition/method.cc
index e587903b..eb2f2329 100644
--- a/tests/declaration_vs_definition/method.cc
+++ b/tests/declaration_vs_definition/method.cc
@@ -24,21 +24,27 @@ OUTPUT:
       "usr": "c:@S@Foo@F@declonly#",
       "short_name": "declonly",
       "detailed_name": "void Foo::declonly()",
-      "declarations": ["2:8-2:16"],
+      "declarations": [{
+          "spelling": "2:8-2:16"
+        }],
       "declaring_type": 0
     }, {
       "id": 1,
       "usr": "c:@S@Foo@F@purevirtual#",
       "short_name": "purevirtual",
       "detailed_name": "void Foo::purevirtual()",
-      "declarations": ["3:16-3:27"],
+      "declarations": [{
+          "spelling": "3:16-3:27"
+        }],
       "declaring_type": 0
     }, {
       "id": 2,
       "usr": "c:@S@Foo@F@def#",
       "short_name": "def",
       "detailed_name": "void Foo::def()",
-      "declarations": ["4:8-4:11"],
+      "declarations": [{
+          "spelling": "4:8-4:11"
+        }],
       "definition_spelling": "7:11-7:14",
       "definition_extent": "7:1-7:19",
       "declaring_type": 0
diff --git a/tests/function_declaration.cc b/tests/function_declaration.cc
index 90dd7e40..5e2fe791 100644
--- a/tests/function_declaration.cc
+++ b/tests/function_declaration.cc
@@ -8,7 +8,9 @@ OUTPUT:
       "usr": "c:@F@foo#I#I#",
       "short_name": "foo",
       "detailed_name": "void foo(int, int)",
-      "declarations": ["1:6-1:9"]
+      "declarations": [{
+          "spelling": "1:6-1:9"
+        }]
     }]
 }
 */
diff --git a/tests/function_declaration_definition.cc b/tests/function_declaration_definition.cc
index 669c5575..971f732f 100644
--- a/tests/function_declaration_definition.cc
+++ b/tests/function_declaration_definition.cc
@@ -10,7 +10,9 @@ OUTPUT:
       "usr": "c:@F@foo#",
       "short_name": "foo",
       "detailed_name": "void foo()",
-      "declarations": ["1:6-1:9"],
+      "declarations": [{
+          "spelling": "1:6-1:9"
+        }],
       "definition_spelling": "3:6-3:9",
       "definition_extent": "3:1-3:14"
     }]
diff --git a/tests/inheritance/function_override.cc b/tests/inheritance/function_override.cc
index 7119dc9c..d23104ec 100644
--- a/tests/inheritance/function_override.cc
+++ b/tests/inheritance/function_override.cc
@@ -34,7 +34,9 @@ OUTPUT:
       "usr": "c:@S@Root@F@foo#",
       "short_name": "foo",
       "detailed_name": "void Root::foo()",
-      "declarations": ["2:16-2:19"],
+      "declarations": [{
+          "spelling": "2:16-2:19"
+        }],
       "declaring_type": 0,
       "derived": [1]
     }, {
diff --git a/tests/method_declaration.cc b/tests/method_declaration.cc
index 81cbe4b5..edf7b4cd 100644
--- a/tests/method_declaration.cc
+++ b/tests/method_declaration.cc
@@ -24,7 +24,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@foo#",
       "short_name": "foo",
       "detailed_name": "void Foo::foo()",
-      "declarations": ["2:8-2:11"],
+      "declarations": [{
+          "spelling": "2:8-2:11"
+        }],
       "declaring_type": 0
     }]
 }
diff --git a/tests/method_definition.cc b/tests/method_definition.cc
index 94fd1daa..58061d8d 100644
--- a/tests/method_definition.cc
+++ b/tests/method_definition.cc
@@ -22,7 +22,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@foo#",
       "short_name": "foo",
       "detailed_name": "void Foo::foo()",
-      "declarations": ["2:8-2:11"],
+      "declarations": [{
+          "spelling": "2:8-2:11"
+        }],
       "definition_spelling": "5:11-5:14",
       "definition_extent": "5:1-5:19",
       "declaring_type": 0
diff --git a/tests/multi_file/simple_impl.cc b/tests/multi_file/simple_impl.cc
index 3fd49025..47306405 100644
--- a/tests/multi_file/simple_impl.cc
+++ b/tests/multi_file/simple_impl.cc
@@ -12,7 +12,9 @@ OUTPUT: simple_header.h
       "usr": "c:@F@header#",
       "short_name": "header",
       "detailed_name": "void header()",
-      "declarations": ["3:6-3:12"]
+      "declarations": [{
+          "spelling": "3:6-3:12"
+        }]
     }]
 }
 OUTPUT: simple_impl.cc
diff --git a/tests/multi_file/static.cc b/tests/multi_file/static.cc
index c3725660..784b2276 100644
--- a/tests/multi_file/static.cc
+++ b/tests/multi_file/static.cc
@@ -20,7 +20,9 @@ OUTPUT: static.h
       "usr": "c:@S@Buffer@F@CreateSharedBuffer#S",
       "short_name": "CreateSharedBuffer",
       "detailed_name": "void Buffer::CreateSharedBuffer()",
-      "declarations": ["4:15-4:33"],
+      "declarations": [{
+          "spelling": "4:15-4:33"
+        }],
       "declaring_type": 0
     }]
 }
diff --git a/tests/namespaces/anonymous_function.cc b/tests/namespaces/anonymous_function.cc
index c20ef5ef..7a25f0bc 100644
--- a/tests/namespaces/anonymous_function.cc
+++ b/tests/namespaces/anonymous_function.cc
@@ -10,7 +10,9 @@ OUTPUT:
       "usr": "c:anonymous_function.cc@aN@F@foo#",
       "short_name": "foo",
       "detailed_name": "void ::foo()",
-      "declarations": ["2:6-2:9"]
+      "declarations": [{
+          "spelling": "2:6-2:9"
+        }]
     }]
 }
 */
diff --git a/tests/namespaces/function_declaration.cc b/tests/namespaces/function_declaration.cc
index d7769c64..989662a2 100644
--- a/tests/namespaces/function_declaration.cc
+++ b/tests/namespaces/function_declaration.cc
@@ -10,7 +10,9 @@ OUTPUT:
       "usr": "c:@N@hello@F@foo#I#I#",
       "short_name": "foo",
       "detailed_name": "void hello::foo(int, int)",
-      "declarations": ["2:6-2:9"]
+      "declarations": [{
+          "spelling": "2:6-2:9"
+        }]
     }]
 }
 */
diff --git a/tests/namespaces/method_declaration.cc b/tests/namespaces/method_declaration.cc
index db5560aa..9c7fb93b 100644
--- a/tests/namespaces/method_declaration.cc
+++ b/tests/namespaces/method_declaration.cc
@@ -22,7 +22,9 @@ OUTPUT:
       "usr": "c:@N@hello@S@Foo@F@foo#",
       "short_name": "foo",
       "detailed_name": "void hello::Foo::foo()",
-      "declarations": ["3:8-3:11"],
+      "declarations": [{
+          "spelling": "3:8-3:11"
+        }],
       "declaring_type": 0
     }]
 }
diff --git a/tests/namespaces/method_definition.cc b/tests/namespaces/method_definition.cc
index abd93369..eafd7e3f 100644
--- a/tests/namespaces/method_definition.cc
+++ b/tests/namespaces/method_definition.cc
@@ -24,7 +24,9 @@ OUTPUT:
       "usr": "c:@N@hello@S@Foo@F@foo#",
       "short_name": "foo",
       "detailed_name": "void hello::Foo::foo()",
-      "declarations": ["3:8-3:11"],
+      "declarations": [{
+          "spelling": "3:8-3:11"
+        }],
       "definition_spelling": "6:11-6:14",
       "definition_extent": "6:1-6:19",
       "declaring_type": 0
diff --git a/tests/outline/outline2.cc b/tests/outline/outline2.cc
index 95145bd7..0da2ff68 100644
--- a/tests/outline/outline2.cc
+++ b/tests/outline/outline2.cc
@@ -47,7 +47,9 @@ OUTPUT:
       "usr": "c:@F@LoadCompilationEntriesFromDirectory#&1$@N@std@S@basic_string>#C#$@N@std@S@char_traits>#C#$@N@std@S@allocator>#C#",
       "short_name": "LoadCompilationEntriesFromDirectory",
       "detailed_name": "std::vector<CompilationEntry> LoadCompilationEntriesFromDirectory(const std::string &)",
-      "declarations": ["12:31-12:66"]
+      "declarations": [{
+          "spelling": "12:31-12:66"
+        }]
     }],
   "vars": [{
       "id": 0,
diff --git a/tests/templates/func_specialized_template_param.cc b/tests/templates/func_specialized_template_param.cc
index 42820435..ef725fd5 100644
--- a/tests/templates/func_specialized_template_param.cc
+++ b/tests/templates/func_specialized_template_param.cc
@@ -33,7 +33,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@Bar#&$@S@Template>#d#",
       "short_name": "Bar",
       "detailed_name": "void Foo::Bar(Template<double> &)",
-      "declarations": ["5:8-5:11"],
+      "declarations": [{
+          "spelling": "5:8-5:11"
+        }],
       "definition_spelling": "8:11-8:14",
       "definition_extent": "8:1-8:36",
       "declaring_type": 1
diff --git a/tests/templates/specialized_func_definition.cc b/tests/templates/specialized_func_definition.cc
index 33b34419..d6eb5b91 100644
--- a/tests/templates/specialized_func_definition.cc
+++ b/tests/templates/specialized_func_definition.cc
@@ -30,7 +30,11 @@ OUTPUT:
       "usr": "c:@ST>1#T@Template@F@Foo#",
       "short_name": "Foo",
       "detailed_name": "void Template::Foo()",
-      "declarations": ["3:8-3:11", "9:22-9:25"],
+      "declarations": [{
+          "spelling": "3:8-3:11"
+        }, {
+          "spelling": "9:22-9:25"
+        }],
       "definition_spelling": "7:19-7:22",
       "definition_extent": "6:1-7:24",
       "declaring_type": 0
diff --git a/tests/usage/func_called_from_constructor.cc b/tests/usage/func_called_from_constructor.cc
index 4b2aeff3..c704bbcc 100644
--- a/tests/usage/func_called_from_constructor.cc
+++ b/tests/usage/func_called_from_constructor.cc
@@ -34,7 +34,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@Foo#",
       "short_name": "Foo",
       "detailed_name": "void Foo::Foo()",
-      "declarations": ["4:3-4:6"],
+      "declarations": [{
+          "spelling": "4:3-4:6"
+        }],
       "definition_spelling": "7:6-7:9",
       "definition_extent": "7:1-9:2",
       "declaring_type": 0,
diff --git a/tests/usage/func_called_from_macro_argument.cc b/tests/usage/func_called_from_macro_argument.cc
index 1f1373e6..03dc714b 100644
--- a/tests/usage/func_called_from_macro_argument.cc
+++ b/tests/usage/func_called_from_macro_argument.cc
@@ -14,7 +14,9 @@ OUTPUT:
       "usr": "c:@F@called#b#b#",
       "short_name": "called",
       "detailed_name": "bool called(bool, bool)",
-      "declarations": ["3:6-3:12"],
+      "declarations": [{
+          "spelling": "3:6-3:12"
+        }],
       "callers": ["1@6:14-6:20"]
     }, {
       "id": 1,
diff --git a/tests/usage/func_called_from_template.cc b/tests/usage/func_called_from_template.cc
index 4b34b39a..0d480304 100644
--- a/tests/usage/func_called_from_template.cc
+++ b/tests/usage/func_called_from_template.cc
@@ -19,7 +19,9 @@ OUTPUT:
       "usr": "c:@F@called#",
       "short_name": "called",
       "detailed_name": "void called()",
-      "declarations": ["1:6-1:12"],
+      "declarations": [{
+          "spelling": "1:6-1:12"
+        }],
       "callers": ["1@5:3-5:9"]
     }, {
       "id": 1,
diff --git a/tests/usage/func_called_implicit_ctor.cc b/tests/usage/func_called_implicit_ctor.cc
index aa254030..437fd191 100644
--- a/tests/usage/func_called_implicit_ctor.cc
+++ b/tests/usage/func_called_implicit_ctor.cc
@@ -26,7 +26,9 @@ OUTPUT:
       "usr": "c:@S@Wrapper@F@Wrapper#I#",
       "short_name": "Wrapper",
       "detailed_name": "void Wrapper::Wrapper(int)",
-      "declarations": ["2:3-2:10"],
+      "declarations": [{
+          "spelling": "2:3-2:10"
+        }],
       "declaring_type": 0,
       "callers": ["~2@8:10-8:16"]
     }, {
diff --git a/tests/usage/func_usage_addr_method.cc b/tests/usage/func_usage_addr_method.cc
index 8d50398f..1a1fb4a3 100644
--- a/tests/usage/func_usage_addr_method.cc
+++ b/tests/usage/func_usage_addr_method.cc
@@ -25,7 +25,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@Used#",
       "short_name": "Used",
       "detailed_name": "void Foo::Used()",
-      "declarations": ["2:8-2:12"],
+      "declarations": [{
+          "spelling": "2:8-2:12"
+        }],
       "declaring_type": 0,
       "callers": ["1@6:18-6:22"]
     }, {
diff --git a/tests/usage/func_usage_call_method.cc b/tests/usage/func_usage_call_method.cc
index e6637294..601088dd 100644
--- a/tests/usage/func_usage_call_method.cc
+++ b/tests/usage/func_usage_call_method.cc
@@ -26,7 +26,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@Used#",
       "short_name": "Used",
       "detailed_name": "void Foo::Used()",
-      "declarations": ["2:8-2:12"],
+      "declarations": [{
+          "spelling": "2:8-2:12"
+        }],
       "declaring_type": 0,
       "callers": ["1@7:6-7:10"]
     }, {
diff --git a/tests/usage/func_usage_forward_decl_func.cc b/tests/usage/func_usage_forward_decl_func.cc
index 0d37c8bf..8e433ccb 100644
--- a/tests/usage/func_usage_forward_decl_func.cc
+++ b/tests/usage/func_usage_forward_decl_func.cc
@@ -11,7 +11,9 @@ OUTPUT:
       "usr": "c:@F@foo#",
       "short_name": "foo",
       "detailed_name": "void foo()",
-      "declarations": ["1:6-1:9"],
+      "declarations": [{
+          "spelling": "1:6-1:9"
+        }],
       "callers": ["1@4:3-4:6"]
     }, {
       "id": 1,
diff --git a/tests/usage/func_usage_forward_decl_method.cc b/tests/usage/func_usage_forward_decl_method.cc
index 1777937c..3f0538a8 100644
--- a/tests/usage/func_usage_forward_decl_method.cc
+++ b/tests/usage/func_usage_forward_decl_method.cc
@@ -25,7 +25,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@foo#",
       "short_name": "foo",
       "detailed_name": "void Foo::foo()",
-      "declarations": ["2:8-2:11"],
+      "declarations": [{
+          "spelling": "2:8-2:11"
+        }],
       "declaring_type": 0,
       "callers": ["1@7:6-7:9"]
     }, {
diff --git a/tests/usage/func_usage_template_func.cc b/tests/usage/func_usage_template_func.cc
index aecc9fce..5eba7686 100644
--- a/tests/usage/func_usage_template_func.cc
+++ b/tests/usage/func_usage_template_func.cc
@@ -14,7 +14,9 @@ OUTPUT:
       "usr": "c:@FT@>1#Taccept#t0.0#v#",
       "short_name": "accept",
       "detailed_name": "void accept(T)",
-      "declarations": ["2:6-2:12"],
+      "declarations": [{
+          "spelling": "2:6-2:12"
+        }],
       "callers": ["1@5:3-5:9", "1@6:3-6:9"]
     }, {
       "id": 1,
diff --git a/tests/usage/type_usage_as_template_parameter_complex.cc b/tests/usage/type_usage_as_template_parameter_complex.cc
index 06c7a904..40552e0a 100644
--- a/tests/usage/type_usage_as_template_parameter_complex.cc
+++ b/tests/usage/type_usage_as_template_parameter_complex.cc
@@ -131,7 +131,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@foo#",
       "short_name": "foo",
       "detailed_name": "unique_ptr<S1, S2> *Foo::foo()",
-      "declarations": ["65:23-65:26"],
+      "declarations": [{
+          "spelling": "65:23-65:26"
+        }],
       "definition_spelling": "79:26-79:29",
       "definition_extent": "79:1-79:51",
       "declaring_type": 3
diff --git a/tests/usage/type_usage_declare_param_prototype.cc b/tests/usage/type_usage_declare_param_prototype.cc
index 82280ec4..c955f8b6 100644
--- a/tests/usage/type_usage_declare_param_prototype.cc
+++ b/tests/usage/type_usage_declare_param_prototype.cc
@@ -22,7 +22,9 @@ OUTPUT:
       "usr": "c:@F@foo#*$@S@Foo#S0_#",
       "short_name": "foo",
       "detailed_name": "void foo(Foo *, Foo *)",
-      "declarations": ["3:6-3:9"],
+      "declarations": [{
+          "spelling": "3:6-3:9"
+        }],
       "definition_spelling": "4:6-4:9",
       "definition_extent": "4:1-4:26"
     }],
diff --git a/tests/usage/type_usage_on_return_type.cc b/tests/usage/type_usage_on_return_type.cc
index 875ea4f6..57c48e29 100644
--- a/tests/usage/type_usage_on_return_type.cc
+++ b/tests/usage/type_usage_on_return_type.cc
@@ -39,7 +39,11 @@ OUTPUT:
       "usr": "c:@F@foo#",
       "short_name": "foo",
       "detailed_name": "Type *foo()",
-      "declarations": ["3:7-3:10", "4:7-4:10"],
+      "declarations": [{
+          "spelling": "3:7-3:10"
+        }, {
+          "spelling": "4:7-4:10"
+        }],
       "definition_spelling": "5:7-5:10",
       "definition_extent": "5:1-5:15"
     }, {
@@ -47,7 +51,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@Get#I#",
       "short_name": "Get",
       "detailed_name": "Type *Foo::Get(int)",
-      "declarations": ["8:9-8:12"],
+      "declarations": [{
+          "spelling": "8:9-8:12"
+        }],
       "definition_spelling": "12:12-12:15",
       "definition_extent": "12:1-12:23",
       "declaring_type": 1
@@ -56,7 +62,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@Empty#",
       "short_name": "Empty",
       "detailed_name": "void Foo::Empty()",
-      "declarations": ["9:8-9:13"],
+      "declarations": [{
+          "spelling": "9:8-9:13"
+        }],
       "definition_spelling": "13:11-13:16",
       "definition_extent": "13:1-13:21",
       "declaring_type": 1
@@ -65,13 +73,17 @@ OUTPUT:
       "usr": "c:@F@external#",
       "short_name": "external",
       "detailed_name": "const Type &external()",
-      "declarations": ["15:20-15:28"]
+      "declarations": [{
+          "spelling": "15:20-15:28"
+        }]
     }, {
       "id": 4,
       "usr": "c:type_usage_on_return_type.cc@F@bar#",
       "short_name": "bar",
       "detailed_name": "Type *bar()",
-      "declarations": ["17:14-17:17"],
+      "declarations": [{
+          "spelling": "17:14-17:17"
+        }],
       "definition_spelling": "18:14-18:17",
       "definition_extent": "18:1-18:22"
     }]
diff --git a/tests/usage/type_usage_various.cc b/tests/usage/type_usage_various.cc
index bc31d216..2360921e 100644
--- a/tests/usage/type_usage_various.cc
+++ b/tests/usage/type_usage_various.cc
@@ -28,7 +28,9 @@ OUTPUT:
       "usr": "c:@S@Foo@F@make#",
       "short_name": "make",
       "detailed_name": "Foo *Foo::make()",
-      "declarations": ["2:8-2:12"],
+      "declarations": [{
+          "spelling": "2:8-2:12"
+        }],
       "definition_spelling": "5:11-5:15",
       "definition_extent": "5:1-8:2",
       "declaring_type": 0
diff --git a/tests/usage/usage_inside_of_call.cc b/tests/usage/usage_inside_of_call.cc
index 457061bc..fafc5670 100644
--- a/tests/usage/usage_inside_of_call.cc
+++ b/tests/usage/usage_inside_of_call.cc
@@ -32,14 +32,18 @@ OUTPUT:
       "usr": "c:@F@called#I#",
       "short_name": "called",
       "detailed_name": "void called(int)",
-      "declarations": ["1:6-1:12"],
+      "declarations": [{
+          "spelling": "1:6-1:12"
+        }],
       "callers": ["2@14:3-14:9"]
     }, {
       "id": 1,
       "usr": "c:@F@gen#",
       "short_name": "gen",
       "detailed_name": "int gen()",
-      "declarations": ["3:5-3:8"],
+      "declarations": [{
+          "spelling": "3:5-3:8"
+        }],
       "callers": ["2@14:14-14:17"]
     }, {
       "id": 2,
diff --git a/tests/usage/usage_inside_of_call_simple.cc b/tests/usage/usage_inside_of_call_simple.cc
index 8bb1470b..aa549307 100644
--- a/tests/usage/usage_inside_of_call_simple.cc
+++ b/tests/usage/usage_inside_of_call_simple.cc
@@ -14,7 +14,9 @@ OUTPUT:
       "usr": "c:@F@called#I#",
       "short_name": "called",
       "detailed_name": "void called(int)",
-      "declarations": ["1:6-1:12"],
+      "declarations": [{
+          "spelling": "1:6-1:12"
+        }],
       "callers": ["2@6:3-6:9"]
     }, {
       "id": 1,
diff --git a/tests/usage/var_usage_class_member.cc b/tests/usage/var_usage_class_member.cc
index 28d4ad30..a6f13a1e 100644
--- a/tests/usage/var_usage_class_member.cc
+++ b/tests/usage/var_usage_class_member.cc
@@ -36,14 +36,18 @@ OUTPUT:
       "usr": "c:@F@accept#I#",
       "short_name": "accept",
       "detailed_name": "void accept(int)",
-      "declarations": ["7:6-7:12"],
+      "declarations": [{
+          "spelling": "7:6-7:12"
+        }],
       "callers": ["2@14:3-14:9", "2@15:3-15:9", "2@17:3-17:9"]
     }, {
       "id": 1,
       "usr": "c:@F@accept#*I#",
       "short_name": "accept",
       "detailed_name": "void accept(int *)",
-      "declarations": ["8:6-8:12"],
+      "declarations": [{
+          "spelling": "8:6-8:12"
+        }],
       "callers": ["2@16:3-16:9"]
     }, {
       "id": 2,
diff --git a/tests/usage/var_usage_class_member_static.cc b/tests/usage/var_usage_class_member_static.cc
index 426d4628..32a179b7 100644
--- a/tests/usage/var_usage_class_member_static.cc
+++ b/tests/usage/var_usage_class_member_static.cc
@@ -25,7 +25,9 @@ OUTPUT:
       "usr": "c:@F@accept#I#",
       "short_name": "accept",
       "detailed_name": "void accept(int)",
-      "declarations": ["5:6-5:12"],
+      "declarations": [{
+          "spelling": "5:6-5:12"
+        }],
       "callers": ["1@8:3-8:9"]
     }, {
       "id": 1,