Added alias declarations to modules, structs, classes, etc. Fixed issue #15
This commit is contained in:
parent
688fe8b599
commit
22a62bfe84
39
parser.d
39
parser.d
|
@ -272,7 +272,10 @@ Module parseModule(const Token[] tokens, string protection = "public", string[]
|
||||||
tokens.skipBlockStatement(index);
|
tokens.skipBlockStatement(index);
|
||||||
break;
|
break;
|
||||||
case TokenType.Alias:
|
case TokenType.Alias:
|
||||||
tokens.skipBlockStatement(index);
|
Alias a = parseAlias(tokens, index,
|
||||||
|
localProtection.empty() ? protection : localProtection,
|
||||||
|
attributes);
|
||||||
|
mod.aliases ~= a;
|
||||||
break;
|
break;
|
||||||
case TokenType.Import:
|
case TokenType.Import:
|
||||||
mod.imports ~= parseImports(tokens, index);
|
mod.imports ~= parseImports(tokens, index);
|
||||||
|
@ -511,9 +514,9 @@ in
|
||||||
}
|
}
|
||||||
body
|
body
|
||||||
{
|
{
|
||||||
++index;
|
|
||||||
Enum e = new Enum;
|
Enum e = new Enum;
|
||||||
e.line = tokens[index].lineNumber;
|
e.line = tokens[index].lineNumber;
|
||||||
|
++index;
|
||||||
string enumType;
|
string enumType;
|
||||||
|
|
||||||
if (tokens[index] == TokenType.LBrace)
|
if (tokens[index] == TokenType.LBrace)
|
||||||
|
@ -773,6 +776,7 @@ void parseStructBody(const Token[] tokens, ref size_t index, Struct st)
|
||||||
st.bodyEnd = tokens[index - 1].startIndex;
|
st.bodyEnd = tokens[index - 1].startIndex;
|
||||||
st.functions.insertInPlace(0, m.functions);
|
st.functions.insertInPlace(0, m.functions);
|
||||||
st.variables.insertInPlace(0, m.variables);
|
st.variables.insertInPlace(0, m.variables);
|
||||||
|
st.aliases.insertInPlace(0, m.aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -877,3 +881,34 @@ body
|
||||||
{
|
{
|
||||||
return parseInherits(tokens, ++index, protection, attributes);
|
return parseInherits(tokens, ++index, protection, attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse an alias declaration.
|
||||||
|
* Note that the language spec mentions a "AliasInitializerList" in the grammar,
|
||||||
|
* but there seems to be no example of this being used, nor has the compiler
|
||||||
|
* accepted any of my attempts to create one. Therefore, it's not supported here
|
||||||
|
*/
|
||||||
|
Alias parseAlias(const Token[] tokens, ref size_t index, string protection,
|
||||||
|
string[] attributes)
|
||||||
|
in
|
||||||
|
{
|
||||||
|
assert(tokens[index] == TokenType.Alias);
|
||||||
|
}
|
||||||
|
body
|
||||||
|
{
|
||||||
|
index++;
|
||||||
|
Alias a = new Alias;
|
||||||
|
a.aliasedType = parseTypeDeclaration(tokens, index);
|
||||||
|
a.attributes = attributes;
|
||||||
|
a.protection = protection;
|
||||||
|
if (tokens[index] == TokenType.Identifier)
|
||||||
|
{
|
||||||
|
a.name = tokens[index].value;
|
||||||
|
a.line = tokens[index].lineNumber;
|
||||||
|
skipBlockStatement(tokens, index);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
50
types.d
50
types.d
|
@ -33,7 +33,10 @@ unittest { assert(escapeJSON("abc\"def") == "abc\\\"def"); }
|
||||||
*/
|
*/
|
||||||
void writeJSONString(File f, const string name, const string value, uint indent = 0)
|
void writeJSONString(File f, const string name, const string value, uint indent = 0)
|
||||||
{
|
{
|
||||||
f.write(std.array.replicate(" ", indent), "\"", name, "\" : \"", escapeJSON(value), "\"");
|
if (value is null)
|
||||||
|
f.write(std.array.replicate(" ", indent), "\"", name, "\" : null");
|
||||||
|
else
|
||||||
|
f.write(std.array.replicate(" ", indent), "\"", name, "\" : \"", escapeJSON(value), "\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -98,6 +101,26 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias Declaration
|
||||||
|
*/
|
||||||
|
class Alias : Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
string aliasedType;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
override void printMembers(File f, uint indent = 0) const
|
||||||
|
{
|
||||||
|
super.printMembers(f, indent);
|
||||||
|
f.writeln(",");
|
||||||
|
writeJSONString(f, "aliasedType", aliasedType, indent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Varible declaration
|
* Varible declaration
|
||||||
*/
|
*/
|
||||||
|
@ -156,6 +179,9 @@ public:
|
||||||
/// List of member variables; may be empty
|
/// List of member variables; may be empty
|
||||||
Variable[] variables;
|
Variable[] variables;
|
||||||
|
|
||||||
|
/// List of aliases defined
|
||||||
|
Alias[] aliases;
|
||||||
|
|
||||||
/// Source code character position of the beginning of the struct body
|
/// Source code character position of the beginning of the struct body
|
||||||
size_t bodyStart;
|
size_t bodyStart;
|
||||||
|
|
||||||
|
@ -228,6 +254,15 @@ protected:
|
||||||
else
|
else
|
||||||
f.writeln();
|
f.writeln();
|
||||||
}
|
}
|
||||||
|
f.writeln(std.array.replicate(" ", indent), "],\n", std.array.replicate(" ", indent), "\"aliases\" : [");
|
||||||
|
foreach(i, al; aliases)
|
||||||
|
{
|
||||||
|
al.writeJSONTo(f, indent);
|
||||||
|
if (i + 1 < aliases.length)
|
||||||
|
f.writeln(",");
|
||||||
|
else
|
||||||
|
f.writeln();
|
||||||
|
}
|
||||||
f.write(std.array.replicate(" ", indent), "]");
|
f.write(std.array.replicate(" ", indent), "]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -405,6 +440,9 @@ public:
|
||||||
|
|
||||||
/// List of enums declared in this module
|
/// List of enums declared in this module
|
||||||
Enum[] enums;
|
Enum[] enums;
|
||||||
|
|
||||||
|
/// List of aliases declared in this module
|
||||||
|
Alias[] aliases;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -506,6 +544,15 @@ public:
|
||||||
else
|
else
|
||||||
f.writeln();
|
f.writeln();
|
||||||
}
|
}
|
||||||
|
f.writeln(" ],\n \"aliases\" : [");
|
||||||
|
foreach(i, a; aliases)
|
||||||
|
{
|
||||||
|
a.writeJSONTo(f, indent + 1);
|
||||||
|
if (i + 1 < aliases.length)
|
||||||
|
f.writeln(",");
|
||||||
|
else
|
||||||
|
f.writeln();
|
||||||
|
}
|
||||||
f.writeln(" ]\n}");
|
f.writeln(" ]\n}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,6 +601,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
immutable(string[][string]) typeProperties;
|
immutable(string[][string]) typeProperties;
|
||||||
immutable(string[]) floatProperties;
|
immutable(string[]) floatProperties;
|
||||||
immutable(string[]) integralProperties;
|
immutable(string[]) integralProperties;
|
||||||
|
|
Loading…
Reference in New Issue