mirror of
https://github.com/dlang-community/D-Scanner.git
synced 2025-04-29 14:50:01 +03:00
Some parser fixes for DCD
This commit is contained in:
parent
2cc5152a68
commit
270cd6d9a1
5 changed files with 30 additions and 19 deletions
|
@ -489,7 +489,7 @@ class XMLPrinter : ASTVisitor
|
||||||
override void visit(ForeachStatement foreachStatement)
|
override void visit(ForeachStatement foreachStatement)
|
||||||
{
|
{
|
||||||
output.writeln("<foreachStatement type=\"", getTokenValue(
|
output.writeln("<foreachStatement type=\"", getTokenValue(
|
||||||
foreachStatement.foreachType), "\">");
|
foreachStatement.type), "\">");
|
||||||
output.writeln("</foreachStatement>");
|
output.writeln("</foreachStatement>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
main.d
2
main.d
|
@ -123,7 +123,7 @@ int main(string[] args)
|
||||||
}
|
}
|
||||||
else if (tokenCount)
|
else if (tokenCount)
|
||||||
{
|
{
|
||||||
printTokenCount(stdout, tokens, to!size_t(f.size));
|
printTokenCount(stdout, tokens);
|
||||||
}
|
}
|
||||||
else if (syntaxCheck)
|
else if (syntaxCheck)
|
||||||
{
|
{
|
||||||
|
|
11
stats.d
11
stats.d
|
@ -6,6 +6,7 @@
|
||||||
module stats;
|
module stats;
|
||||||
|
|
||||||
import std.stdio;
|
import std.stdio;
|
||||||
|
import std.algorithm;
|
||||||
import stdx.d.lexer;
|
import stdx.d.lexer;
|
||||||
|
|
||||||
pure nothrow bool isLineOfCode(TokenType t)
|
pure nothrow bool isLineOfCode(TokenType t)
|
||||||
|
@ -29,15 +30,9 @@ pure nothrow bool isLineOfCode(TokenType t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void printTokenCount(Tokens)(File output, ref Tokens tokens, size_t fileSize)
|
void printTokenCount(Tokens)(File output, ref Tokens tokens)
|
||||||
{
|
{
|
||||||
ulong count;
|
output.writefln("%d", tokens.count!(a => true));
|
||||||
while(!tokens.empty)
|
|
||||||
{
|
|
||||||
tokens.popFront();
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
output.writefln("%d", count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void printLineCount(Tokens)(File output, ref Tokens tokens)
|
void printLineCount(Tokens)(File output, ref Tokens tokens)
|
||||||
|
|
|
@ -1194,6 +1194,7 @@ public:
|
||||||
/** */ ExpressionStatement test;
|
/** */ ExpressionStatement test;
|
||||||
/** */ Expression increment;
|
/** */ Expression increment;
|
||||||
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
|
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
|
||||||
|
/** */ size_t startIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -1202,14 +1203,16 @@ class ForeachStatement : ASTNode
|
||||||
public:
|
public:
|
||||||
override void accept(ASTVisitor visitor)
|
override void accept(ASTVisitor visitor)
|
||||||
{
|
{
|
||||||
mixin (visitIfNotNull!(foreachTypeList, low, high,
|
mixin (visitIfNotNull!(foreachType, foreachTypeList, low, high,
|
||||||
statementNoCaseNoDefault));
|
statementNoCaseNoDefault));
|
||||||
}
|
}
|
||||||
/** */ TokenType foreachType;
|
/** */ TokenType type;
|
||||||
/** */ ForeachTypeList foreachTypeList;
|
/** */ ForeachTypeList foreachTypeList;
|
||||||
|
/** */ ForeachType foreachType;
|
||||||
/** */ Expression low;
|
/** */ Expression low;
|
||||||
/** */ Expression high;
|
/** */ Expression high;
|
||||||
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
|
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
|
||||||
|
/** */ size_t startIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -1429,6 +1432,7 @@ public:
|
||||||
/** */ Expression expression;
|
/** */ Expression expression;
|
||||||
/** */ DeclarationOrStatement thenStatement;
|
/** */ DeclarationOrStatement thenStatement;
|
||||||
/** */ DeclarationOrStatement elseStatement;
|
/** */ DeclarationOrStatement elseStatement;
|
||||||
|
/** */ size_t startIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -2852,6 +2856,7 @@ public:
|
||||||
|
|
||||||
/** */ Expression expression;
|
/** */ Expression expression;
|
||||||
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
|
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
|
||||||
|
/** */ size_t startIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
|
@ -2142,6 +2142,7 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
|
||||||
mixin(traceEnterAndExit!(__FUNCTION__));
|
mixin(traceEnterAndExit!(__FUNCTION__));
|
||||||
auto node = new ForStatement;
|
auto node = new ForStatement;
|
||||||
if (expect(TokenType.for_) is null) return null;
|
if (expect(TokenType.for_) is null) return null;
|
||||||
|
node.startIndex = current().startIndex;
|
||||||
if (expect(TokenType.lParen) is null) return null;
|
if (expect(TokenType.lParen) is null) return null;
|
||||||
|
|
||||||
if (currentIs(TokenType.semicolon))
|
if (currentIs(TokenType.semicolon))
|
||||||
|
@ -2174,17 +2175,19 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
|
||||||
ForeachStatement parseForeachStatement()
|
ForeachStatement parseForeachStatement()
|
||||||
{
|
{
|
||||||
mixin(traceEnterAndExit!(__FUNCTION__));
|
mixin(traceEnterAndExit!(__FUNCTION__));
|
||||||
auto node = new ForeachStatement;
|
ForeachStatement node = new ForeachStatement;
|
||||||
if (currentIsOneOf(TokenType.foreach_, TokenType.foreach_reverse_))
|
if (currentIsOneOf(TokenType.foreach_, TokenType.foreach_reverse_))
|
||||||
node.foreachType = advance().type;
|
node.type = advance().type;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
error(`"foreach" or "foreach_reverse" expected`);
|
error(`"foreach" or "foreach_reverse" expected`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
node.startIndex = current().startIndex;
|
||||||
if (expect(TokenType.lParen) is null) return null;
|
if (expect(TokenType.lParen) is null) return null;
|
||||||
auto feType = parseForeachTypeList();
|
ForeachTypeList feType = parseForeachTypeList();
|
||||||
bool canBeRange = feType.items.length == 1;
|
bool canBeRange = feType.items.length == 1;
|
||||||
|
|
||||||
if (expect(TokenType.semicolon) is null) return null;
|
if (expect(TokenType.semicolon) is null) return null;
|
||||||
node.low = parseExpression();
|
node.low = parseExpression();
|
||||||
if (node.low is null) return null;
|
if (node.low is null) return null;
|
||||||
|
@ -2197,8 +2200,13 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
|
||||||
}
|
}
|
||||||
advance();
|
advance();
|
||||||
node.high = parseExpression();
|
node.high = parseExpression();
|
||||||
|
node.foreachType = feType.items[0];
|
||||||
if (node.high is null) return null;
|
if (node.high is null) return null;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
node.foreachTypeList = feType;
|
||||||
|
}
|
||||||
if (expect(TokenType.rParen) is null) return null;
|
if (expect(TokenType.rParen) is null) return null;
|
||||||
node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault();
|
node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault();
|
||||||
if (node.statementNoCaseNoDefault is null) return null;
|
if (node.statementNoCaseNoDefault is null) return null;
|
||||||
|
@ -2653,6 +2661,7 @@ body {} // six
|
||||||
mixin(traceEnterAndExit!(__FUNCTION__));
|
mixin(traceEnterAndExit!(__FUNCTION__));
|
||||||
auto node = new IfStatement;
|
auto node = new IfStatement;
|
||||||
if (expect(TokenType.if_) is null) return null;
|
if (expect(TokenType.if_) is null) return null;
|
||||||
|
node.startIndex = current().startIndex;
|
||||||
if (expect(TokenType.lParen) is null) return null;
|
if (expect(TokenType.lParen) is null) return null;
|
||||||
|
|
||||||
if (currentIs(TokenType.auto_))
|
if (currentIs(TokenType.auto_))
|
||||||
|
@ -2687,6 +2696,7 @@ body {} // six
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expect(TokenType.rParen) is null) return null;
|
if (expect(TokenType.rParen) is null) return null;
|
||||||
|
if (currentIs(TokenType.rBrace)) return node; // this line makes DCD better
|
||||||
node.thenStatement = parseDeclarationOrStatement();
|
node.thenStatement = parseDeclarationOrStatement();
|
||||||
if (currentIs(TokenType.else_))
|
if (currentIs(TokenType.else_))
|
||||||
{
|
{
|
||||||
|
@ -5854,6 +5864,7 @@ q{doStuff(5)}c;
|
||||||
mixin(traceEnterAndExit!(__FUNCTION__));
|
mixin(traceEnterAndExit!(__FUNCTION__));
|
||||||
auto node = new WhileStatement;
|
auto node = new WhileStatement;
|
||||||
expect(TokenType.while_);
|
expect(TokenType.while_);
|
||||||
|
node.startIndex = current().startIndex;
|
||||||
expect(TokenType.lParen);
|
expect(TokenType.lParen);
|
||||||
node.expression = parseExpression();
|
node.expression = parseExpression();
|
||||||
expect(TokenType.rParen);
|
expect(TokenType.rParen);
|
||||||
|
@ -6393,7 +6404,7 @@ private:
|
||||||
{
|
{
|
||||||
if (index >= tokens.length)
|
if (index >= tokens.length)
|
||||||
return false;
|
return false;
|
||||||
for (size_t i = 0; i != types.length; ++i)
|
for (size_t i = 0; (i < types.length) && ((index + i) < tokens.length); ++i)
|
||||||
{
|
{
|
||||||
if (tokens[index + i].type != types[i])
|
if (tokens[index + i].type != types[i])
|
||||||
return false;
|
return false;
|
||||||
|
@ -6461,9 +6472,9 @@ private:
|
||||||
void trace(lazy string message) {}
|
void trace(lazy string message) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
static immutable string BASIC_TYPE_CASE_RANGE = q{case bool_: .. case wchar_:};
|
enum string BASIC_TYPE_CASE_RANGE = q{case bool_: .. case wchar_:};
|
||||||
static immutable string LITERAL_CASE_RANGE = q{case doubleLiteral: .. case wstringLiteral:};
|
enum string LITERAL_CASE_RANGE = q{case doubleLiteral: .. case wstringLiteral:};
|
||||||
static immutable string SPECIAL_CASE_RANGE = q{case specialDate: .. case specialPrettyFunction:};
|
enum string SPECIAL_CASE_RANGE = q{case specialDate: .. case specialPrettyFunction:};
|
||||||
const(Token)[] tokens;
|
const(Token)[] tokens;
|
||||||
int suppressMessages;
|
int suppressMessages;
|
||||||
size_t index;
|
size_t index;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue