@@ -243,6 +243,8 @@ struct DefinitionElement
243243 string type;
244244 // /
245245 string [string ] attributes;
246+ // /
247+ int [2 ] range;
246248}
247249
248250private :
@@ -314,7 +316,8 @@ final class DefinitionFinder : ASTVisitor
314316{
315317 override void visit (const ClassDeclaration dec)
316318 {
317- definitions ~= makeDefinition(dec.name.text, dec.name.line, " c" , context);
319+ definitions ~= makeDefinition(dec.name.text, dec.name.line, " c" , context,
320+ [cast (int ) dec.structBody.startLocation, cast (int ) dec.structBody.endLocation]);
318321 auto c = context;
319322 context = ContextType([" class" : dec.name.text], " public" );
320323 dec.accept(this );
@@ -328,7 +331,8 @@ final class DefinitionFinder : ASTVisitor
328331 dec.accept(this );
329332 return ;
330333 }
331- definitions ~= makeDefinition(dec.name.text, dec.name.line, " s" , context);
334+ definitions ~= makeDefinition(dec.name.text, dec.name.line, " s" , context,
335+ [cast (int ) dec.structBody.startLocation, cast (int ) dec.structBody.endLocation]);
332336 auto c = context;
333337 context = ContextType([" struct" : dec.name.text], " public" );
334338 dec.accept(this );
@@ -337,7 +341,8 @@ final class DefinitionFinder : ASTVisitor
337341
338342 override void visit (const InterfaceDeclaration dec)
339343 {
340- definitions ~= makeDefinition(dec.name.text, dec.name.line, " i" , context);
344+ definitions ~= makeDefinition(dec.name.text, dec.name.line, " i" , context,
345+ [cast (int ) dec.structBody.startLocation, cast (int ) dec.structBody.endLocation]);
341346 auto c = context;
342347 context = ContextType([" interface:" : dec.name.text], context.access);
343348 dec.accept(this );
@@ -346,7 +351,8 @@ final class DefinitionFinder : ASTVisitor
346351
347352 override void visit (const TemplateDeclaration dec)
348353 {
349- auto def = makeDefinition(dec.name.text, dec.name.line, " T" , context);
354+ auto def = makeDefinition(dec.name.text, dec.name.line, " T" , context,
355+ [cast (int ) dec.startLocation, cast (int ) dec.endLocation]);
350356 def.attributes[" signature" ] = paramsToString(dec);
351357 definitions ~= def;
352358 auto c = context;
@@ -357,7 +363,9 @@ final class DefinitionFinder : ASTVisitor
357363
358364 override void visit (const FunctionDeclaration dec)
359365 {
360- auto def = makeDefinition(dec.name.text, dec.name.line, " f" , context);
366+ auto def = makeDefinition(dec.name.text, dec.name.line, " f" , context,
367+ [cast (int ) dec.functionBody.blockStatement.startLocation,
368+ cast (int ) dec.functionBody.blockStatement.endLocation]);
361369 def.attributes[" signature" ] = paramsToString(dec);
362370 if (dec.returnType ! is null )
363371 def.attributes[" return" ] = astToString(dec.returnType);
@@ -366,19 +374,24 @@ final class DefinitionFinder : ASTVisitor
366374
367375 override void visit (const Constructor dec)
368376 {
369- auto def = makeDefinition(" this" , dec.line, " f" , context);
377+ auto def = makeDefinition(" this" , dec.line, " f" , context,
378+ [cast (int ) dec.functionBody.blockStatement.startLocation,
379+ cast (int ) dec.functionBody.blockStatement.endLocation]);
370380 def.attributes[" signature" ] = paramsToString(dec);
371381 definitions ~= def;
372382 }
373383
374384 override void visit (const Destructor dec)
375385 {
376- definitions ~= makeDefinition(" ~this" , dec.line, " f" , context);
386+ definitions ~= makeDefinition(" ~this" , dec.line, " f" , context,
387+ [cast (int ) dec.functionBody.blockStatement.startLocation,
388+ cast (int ) dec.functionBody.blockStatement.endLocation]);
377389 }
378390
379391 override void visit (const EnumDeclaration dec)
380392 {
381- definitions ~= makeDefinition(dec.name.text, dec.name.line, " g" , context);
393+ definitions ~= makeDefinition(dec.name.text, dec.name.line, " g" , context,
394+ [cast (int ) dec.enumBody.startLocation, cast (int ) dec.enumBody.endLocation]);
382395 auto c = context;
383396 context = ContextType([" enum" : dec.name.text], context.access);
384397 dec.accept(this );
@@ -392,7 +405,8 @@ final class DefinitionFinder : ASTVisitor
392405 dec.accept(this );
393406 return ;
394407 }
395- definitions ~= makeDefinition(dec.name.text, dec.name.line, " u" , context);
408+ definitions ~= makeDefinition(dec.name.text, dec.name.line, " u" , context,
409+ [cast (int ) dec.structBody.startLocation, cast (int ) dec.structBody.endLocation]);
396410 auto c = context;
397411 context = ContextType([" union" : dec.name.text], context.access);
398412 dec.accept(this );
@@ -401,31 +415,36 @@ final class DefinitionFinder : ASTVisitor
401415
402416 override void visit (const AnonymousEnumMember mem)
403417 {
404- definitions ~= makeDefinition(mem.name.text, mem.name.line, " e" , context);
418+ definitions ~= makeDefinition(mem.name.text, mem.name.line, " e" , context,
419+ [cast (int ) mem.name.index, cast (int ) mem.name.index + cast (int ) mem.name.text.length]);
405420 }
406421
407422 override void visit (const EnumMember mem)
408423 {
409- definitions ~= makeDefinition(mem.name.text, mem.name.line, " e" , context);
424+ definitions ~= makeDefinition(mem.name.text, mem.name.line, " e" , context,
425+ [cast (int ) mem.name.index, cast (int ) mem.name.index + cast (int ) mem.name.text.length]);
410426 }
411427
412428 override void visit (const VariableDeclaration dec)
413429 {
414430 foreach (d; dec.declarators)
415- definitions ~= makeDefinition(d.name.text, d.name.line, " v" , context);
431+ definitions ~= makeDefinition(d.name.text, d.name.line, " v" , context,
432+ [cast (int ) d.name.index, cast (int ) d.name.index + cast (int ) d.name.text.length]);
416433 dec.accept(this );
417434 }
418435
419436 override void visit (const AutoDeclaration dec)
420437 {
421438 foreach (i; dec.parts.map! (a => a.identifier))
422- definitions ~= makeDefinition(i.text, i.line, " v" , context);
439+ definitions ~= makeDefinition(i.text, i.line, " v" , context,
440+ [cast (int ) i.index, cast (int ) i.index + cast (int ) i.text.length]);
423441 dec.accept(this );
424442 }
425443
426444 override void visit (const Invariant dec)
427445 {
428- definitions ~= makeDefinition(" invariant" , dec.line, " v" , context);
446+ definitions ~= makeDefinition(" invariant" , dec.line, " v" , context,
447+ [cast (int ) dec.index, cast (int ) dec.blockStatement.endLocation]);
429448 }
430449
431450 override void visit (const ModuleDeclaration dec)
@@ -503,21 +522,24 @@ final class DefinitionFinder : ASTVisitor
503522 // Old style alias
504523 if (dec.declaratorIdentifierList)
505524 foreach (i; dec.declaratorIdentifierList.identifiers)
506- definitions ~= makeDefinition(i.text, i.line, " a" , context);
525+ definitions ~= makeDefinition(i.text, i.line, " a" , context,
526+ [cast (int ) i.index, cast (int ) i.index + cast (int ) i.text.length]);
507527 dec.accept(this );
508528 }
509529
510530 override void visit (const AliasInitializer dec)
511531 {
512- definitions ~= makeDefinition(dec.name.text, dec.name.line, " a" , context);
532+ definitions ~= makeDefinition(dec.name.text, dec.name.line, " a" , context,
533+ [cast (int ) dec.name.index, cast (int ) dec.name.index + cast (int ) dec.name.text.length]);
513534
514535 dec.accept(this );
515536 }
516537
517538 override void visit (const AliasThisDeclaration dec)
518539 {
519540 auto name = dec.identifier;
520- definitions ~= makeDefinition(name.text, name.line, " a" , context);
541+ definitions ~= makeDefinition(name.text, name.line, " a" , context,
542+ [cast (int ) name.index, cast (int ) name.index + cast (int ) name.text.length]);
521543
522544 dec.accept(this );
523545 }
@@ -529,12 +551,13 @@ final class DefinitionFinder : ASTVisitor
529551 DefinitionElement[] definitions;
530552}
531553
532- DefinitionElement makeDefinition (string name, size_t line, string type, ContextType context)
554+ DefinitionElement makeDefinition (string name, size_t line, string type,
555+ ContextType context, int [2 ] range)
533556{
534557 string [string ] attr = context.attr;
535558 if (context.access.length)
536559 attr[" access" ] = context.access;
537- return DefinitionElement (name, cast (int ) line, type, attr);
560+ return DefinitionElement (name, cast (int ) line, type, attr, range );
538561}
539562
540563enum AccessState
0 commit comments