self-hosted: parse variable declarations with types
This commit is contained in:
parent
53d58684a6
commit
f951bcf01b
@ -914,12 +914,19 @@ const Parser = struct {
|
|||||||
continue;
|
continue;
|
||||||
},
|
},
|
||||||
State.VarDeclEq => |var_decl| {
|
State.VarDeclEq => |var_decl| {
|
||||||
var_decl.eq_token = %return self.eatToken(Token.Id.Equal);
|
const token = self.getNextToken();
|
||||||
stack.append(State { .ExpectToken = Token.Id.Semicolon }) %% unreachable;
|
if (token.id == Token.Id.Equal) {
|
||||||
%return stack.append(State {
|
var_decl.eq_token = token;
|
||||||
.Expression = removeNullCast(&var_decl.init_node),
|
stack.append(State { .ExpectToken = Token.Id.Semicolon }) %% unreachable;
|
||||||
});
|
%return stack.append(State {
|
||||||
continue;
|
.Expression = removeNullCast(&var_decl.init_node),
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (token.id == Token.Id.Semicolon) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return self.parseError(token, "expected '=' or ';', found {}", @tagName(token.id));
|
||||||
},
|
},
|
||||||
State.ExpectToken => |token_id| {
|
State.ExpectToken => |token_id| {
|
||||||
_ = %return self.eatToken(token_id);
|
_ = %return self.eatToken(token_id);
|
||||||
@ -1345,6 +1352,7 @@ const Parser = struct {
|
|||||||
Text: []const u8,
|
Text: []const u8,
|
||||||
Expression: &AstNode,
|
Expression: &AstNode,
|
||||||
AddrOfExprBit: &AstNodeAddrOfExpr,
|
AddrOfExprBit: &AstNodeAddrOfExpr,
|
||||||
|
VarDeclAlign: &AstNodeVarDecl,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn renderSource(self: &Parser, stream: &std.io.OutStream, root_node: &AstNodeRoot) -> %void {
|
pub fn renderSource(self: &Parser, stream: &std.io.OutStream, root_node: &AstNodeRoot) -> %void {
|
||||||
@ -1417,16 +1425,27 @@ const Parser = struct {
|
|||||||
%return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));
|
%return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));
|
||||||
%return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token));
|
%return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token));
|
||||||
|
|
||||||
%return stream.print(" = ");
|
%return stack.append(RenderState { .VarDeclAlign = var_decl });
|
||||||
|
if (var_decl.type_node) |type_node| {
|
||||||
%return stack.append(RenderState { .Text = ";\n" });
|
%return stream.print(": ");
|
||||||
if (var_decl.init_node) |init_node| {
|
%return stack.append(RenderState { .Expression = type_node });
|
||||||
%return stack.append(RenderState { .Expression = init_node });
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
RenderState.VarDeclAlign => |var_decl| {
|
||||||
|
if (var_decl.align_node != null) {
|
||||||
|
@panic("TODO");
|
||||||
|
}
|
||||||
|
%return stack.append(RenderState { .Text = ";\n" });
|
||||||
|
if (var_decl.init_node) |init_node| {
|
||||||
|
%return stream.print(" = ");
|
||||||
|
%return stack.append(RenderState { .Expression = init_node });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
RenderState.ParamDecl => |base| {
|
RenderState.ParamDecl => |base| {
|
||||||
const param_decl = @fieldParentPtr(AstNodeParamDecl, "base", base);
|
const param_decl = @fieldParentPtr(AstNodeParamDecl, "base", base);
|
||||||
if (param_decl.comptime_token) |comptime_token| {
|
if (param_decl.comptime_token) |comptime_token| {
|
||||||
@ -1597,6 +1616,15 @@ test "zig fmt" {
|
|||||||
\\pub const a = b;
|
\\pub const a = b;
|
||||||
\\var a = b;
|
\\var a = b;
|
||||||
\\pub var a = b;
|
\\pub var a = b;
|
||||||
|
\\const a: i32 = b;
|
||||||
|
\\pub const a: i32 = b;
|
||||||
|
\\var a: i32 = b;
|
||||||
|
\\pub var a: i32 = b;
|
||||||
|
\\
|
||||||
|
);
|
||||||
|
|
||||||
|
testCanonical(
|
||||||
|
\\extern var foo: c_int;
|
||||||
\\
|
\\
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user