Merge pull request #183 from liranz/master

Some more location information and added declaration attributes into FunctionDeclaration scope
This commit is contained in:
Hackerpilot 2014-06-02 18:50:06 +00:00
commit 006528704d
2 changed files with 25 additions and 7 deletions

View File

@ -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;
}

View File

@ -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;
}