diff --git a/std/d/ast.d b/std/d/ast.d index 8549aa0..94e0e1d 100644 --- a/std/d/ast.d +++ b/std/d/ast.d @@ -469,6 +469,8 @@ public: } mixin OpEquals; /** */ AssignExpression[] items; + /** */ size_t startLocation; + /** */ size_t endLocation; } /// @@ -745,6 +747,8 @@ public: /** */ FunctionCallExpression functionCallExpression; /** */ ArgumentList argumentList; /** */ Token identifier; + /** */ size_t startLocation; + /** */ size_t endLocation; mixin OpEquals; } @@ -1527,6 +1531,7 @@ public: /** */ FunctionBody functionBody; /** */ MemberFunctionAttribute[] memberFunctionAttributes; /** */ string comment; + /** */ Attribute[] attributes; mixin OpEquals; } @@ -1978,6 +1983,8 @@ public: mixin (visitIfNotNull!(moduleName)); } /** */ IdentifierChain moduleName; + /** */ size_t startLocation; + /** */ size_t endLocation; mixin OpEquals; } diff --git a/std/d/parser.d b/std/d/parser.d index ad47494..a3e99d9 100644 --- a/std/d/parser.d +++ b/std/d/parser.d @@ -273,7 +273,11 @@ alias core.sys.posix.stdio.fileno fileno; ArgumentList parseArgumentList() { mixin(traceEnterAndExit!(__FUNCTION__)); - return parseCommaSeparatedRule!(ArgumentList, AssignExpression)(true); + size_t startLocation = current().index; + auto ret= parseCommaSeparatedRule!(ArgumentList, AssignExpression)(true); + ret.startLocation = startLocation; + ret.endLocation = current().index; + return ret; } /** @@ -717,7 +721,9 @@ alias core.sys.posix.stdio.fileno fileno; { mixin(traceEnterAndExit!(__FUNCTION__)); auto node = allocate!AtAttribute; - if (expect(tok!"@") is null) return null; + auto start = expect(tok!"@"); + if (start is null) return null; + node.startLocation = start.index; switch (current.type) { case tok!"identifier": @@ -735,6 +741,7 @@ alias core.sys.posix.stdio.fileno fileno; error(`"(", or identifier expected`); return null; } + node.endLocation = current().index; return node; } @@ -1783,7 +1790,7 @@ class ClassFive(A, B) : Super if (someTest()) {}}c; if (peekIs(tok!"=")) node.variableDeclaration = parseVariableDeclaration(null, true); else if (peekIs(tok!"(")) - node.functionDeclaration = parseFunctionDeclaration(null, true); + node.functionDeclaration = parseFunctionDeclaration(null, true, node.attributes); else goto type; } @@ -1804,7 +1811,7 @@ class ClassFive(A, B) : Super if (someTest()) {}}c; return null; } if (peekIs(tok!"(")) - node.functionDeclaration = parseFunctionDeclaration(type); + node.functionDeclaration = parseFunctionDeclaration(type, false, node.attributes); else node.variableDeclaration = parseVariableDeclaration(type); break; @@ -2533,7 +2540,7 @@ body {} // six * ($(RULE storageClass) | $(RULE _type)) $(LITERAL Identifier) $(RULE templateParameters) $(RULE parameters) $(RULE memberFunctionAttribute)* $(RULE constraint)? ($(RULE functionBody) | $(LITERAL ';')) * ;) */ - FunctionDeclaration parseFunctionDeclaration(Type type = null, bool isAuto = false) + FunctionDeclaration parseFunctionDeclaration(Type type = null, bool isAuto = false, Attribute[] attributes = null) { mixin(traceEnterAndExit!(__FUNCTION__)); auto node = allocate!FunctionDeclaration; @@ -2541,6 +2548,8 @@ body {} // six comment = null; MemberFunctionAttribute[] memberFunctionAttributes; + node.attributes = attributes; + if (isAuto) goto functionName; @@ -3601,9 +3610,11 @@ invariant() foo(); ModuleDeclaration parseModuleDeclaration() { auto node = allocate!ModuleDeclaration; - expect(tok!"module"); + auto start = expect(tok!"module"); node.moduleName = parseIdentifierChain(); - expect(tok!";"); + auto end = expect(tok!";"); + node.startLocation = start.index; + node.endLocation = end.index; return node; }