1 module contract.constexpr;
2 
3 
4 import contract;
5 import clang: Token;
6 
7 
8 @("variable.struct.static")
9 @safe unittest {
10 
11     const tu = parse(
12         Cpp(
13             q{
14                 struct Struct {
15                     static constexpr int constExprValue = 42;
16                     static const int constValue = 33;
17                     static int value;
18                 };
19             }
20         )
21     );
22 
23     tu.children.length.shouldEqual(1);
24 
25     const struct_ = tu.children[0];
26     printChildren(struct_);
27 
28     struct_.kind.shouldEqual(Cursor.Kind.StructDecl);
29     struct_.children.length.shouldEqual(3);
30 
31     const constexprVar = struct_.children[0]; printChildren(constexprVar);
32     constexprVar.kind.shouldEqual(Cursor.Kind.VarDecl);
33     constexprVar.type.kind.shouldEqual(Type.Kind.Int);
34     constexprVar.type.spelling.shouldEqual("const int");
35     constexprVar.type.isConstQualified.shouldBeTrue;
36     Token(Token.Kind.Keyword, "constexpr").should.be in constexprVar.tokens;
37     constexprVar.tokens[$-1].spelling.should == "42";
38     constexprVar.children.length.should == 1;
39 
40     const constExprIntLit = constexprVar.child(0);
41     constExprIntLit.shouldMatch(Cursor.Kind.IntegerLiteral, "");
42     constExprIntLit.type.shouldMatch(Type.Kind.Int, "int");
43     constExprIntLit.tokens.should == [Token(Token.Kind.Literal, "42")];
44 
45     const constVar = struct_.children[1]; printChildren(constVar);
46     constVar.kind.shouldEqual(Cursor.Kind.VarDecl);
47     constVar.type.kind.shouldEqual(Type.Kind.Int);
48     constVar.type.spelling.shouldEqual("const int");
49     constVar.type.isConstQualified.shouldBeTrue;
50     Token(Token.Kind.Keyword, "constexpr").should.not.be in constVar.tokens;
51     constVar.tokens[$-1].spelling.should == "33";
52     constVar.children.length.should == 1;
53 
54     const constIntLit = constVar.child(0);
55     constIntLit.shouldMatch(Cursor.Kind.IntegerLiteral, "");
56     constIntLit.type.shouldMatch(Type.Kind.Int, "int");
57     constIntLit.tokens.should == [Token(Token.Kind.Literal, "33")];
58 
59     const var = struct_.children[2]; printChildren(var);
60     var.kind.shouldEqual(Cursor.Kind.VarDecl);
61     var.type.kind.shouldEqual(Type.Kind.Int);
62     var.type.spelling.shouldEqual("int");
63     var.type.isConstQualified.shouldBeFalse;
64     Token(Token.Kind.Keyword, "constexpr").should.not.be in var.tokens;
65     var.children.length.should == 0;
66 }
67 
68 
69 @("variable.init.braces")
70 @safe unittest {
71 
72     const tu = parse(
73         Cpp(
74             q{
75                 constexpr int var{};
76             }
77         )
78     );
79 
80     tu.children.length.should == 1;
81     const var = tu.child(0);
82 
83     var.shouldMatch(Cursor.Kind.VarDecl, "var");
84     var.type.shouldMatch(Type.Kind.Int, "const int");
85     printChildren(var);
86     var.children.length.should == 1;
87 
88     const initList = var.child(0);
89     initList.shouldMatch(Cursor.Kind.InitListExpr, "");
90     initList.type.shouldMatch(Type.Kind.Int, "int");
91     initList.tokens.should == [
92         Token(Token.Kind.Punctuation, "{"),
93         Token(Token.Kind.Punctuation, "}")
94     ];
95     initList.children.length.should == 0;
96 }