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 }