dmd/compiler/test/unit/parser/visibilitydeclaration_location.d
2022-12-25 06:32:05 +01:00

93 lines
1.6 KiB
D

module parser.visibilitydeclaration_location;
import dmd.frontend : parseModule;
import support : afterEach, beforeEach;
import dmd.attrib : VisibilityDeclaration;
import dmd.location;
import dmd.visitor : SemanticTimeTransitiveVisitor;
@beforeEach
void initializeFrontend()
{
import dmd.frontend : initDMD;
initDMD();
}
@afterEach
void deinitializeFrontend()
{
import dmd.frontend : deinitializeDMD;
deinitializeDMD();
}
extern (C++) class Visitor : SemanticTimeTransitiveVisitor
{
alias visit = typeof(super).visit;
Loc l;
override void visit(VisibilityDeclaration vd)
{
l = vd.loc;
}
}
immutable struct Test
{
/*
* The description of the unit test.
*
* This will go into the UDA attached to the `unittest` block.
*/
string description_;
/*
* The code to parse.
*
*/
string code_;
string code()
{
return code_;
}
string description()
{
return description_;
}
}
enum tests = [
Test("`public` symbol and curly braces on the next line", q{class C
{
public
{
void foo() {}
}
}}),
Test("`public` symbol and colon on the same line", q{class C
{
public:
void foo() {}
}}),
Test("`public` symbol and function declaration on the same line", q{class C
{
public void foo() {}
}}),
];
static foreach (test; tests)
{
@(test.description)
unittest
{
auto t = parseModule("test.d", test.code);
scope visitor = new Visitor;
t.module_.accept(visitor);
assert(visitor.l.linnum == 3);
assert(visitor.l.charnum == 5);
}
}