From 593a4e2e39312daef00023f924a0c45af1cf082c Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Fri, 4 May 2018 20:46:10 +0200 Subject: [PATCH] fix issue 13741 - std.traits.moduleName does not work with functions that have parameters --- std/traits.d | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/std/traits.d b/std/traits.d index a2348e76711..9eb8e1c339d 100644 --- a/std/traits.d +++ b/std/traits.d @@ -489,12 +489,14 @@ template packageName(alias T) { import std.algorithm.searching : startsWith; + enum bool isNotFunc = !isSomeFunction!(T); + static if (__traits(compiles, parentOf!T)) enum parent = packageName!(parentOf!T); else enum string parent = null; - static if (T.stringof.startsWith("package ")) + static if (isNotFunc && T.stringof.startsWith("package ")) enum packageName = (parent.length ? parent ~ '.' : "") ~ T.stringof[8 .. $]; else static if (parent) enum packageName = parent; @@ -512,8 +514,7 @@ template packageName(alias T) { import std.array; - // Commented out because of dmd @@@BUG8922@@@ - // static assert(packageName!std == "std"); // this package (currently: "std.std") + static assert(packageName!std == "std"); static assert(packageName!(std.traits) == "std"); // this module static assert(packageName!packageName == "std"); // symbol in this module static assert(packageName!(std.array) == "std"); // other module from same package @@ -535,6 +536,24 @@ version (none) @safe unittest //Please uncomment me when changing packageName to static assert(packageName!Barrier == "core.sync"); } +/// +@safe unittest +{ + static assert(packageName!moduleName == "std"); +} + +@safe unittest // issue 13741 +{ + import std.ascii : isWhite; + static assert(packageName!(isWhite) == "std"); + + struct Foo{void opCall(int){}} + static assert(packageName!(Foo.opCall) == "std"); + + @property void function(int) vf; + static assert(packageName!(vf) == "std"); +} + /** * Get the module name (including package) for the given symbol. */ @@ -542,9 +561,13 @@ template moduleName(alias T) { import std.algorithm.searching : startsWith; - static assert(!T.stringof.startsWith("package "), "cannot get the module name for a package"); + enum bool isNotFunc = !isSomeFunction!(T); - static if (T.stringof.startsWith("module ")) + static if (isNotFunc) + static assert(!T.stringof.startsWith("package "), + "cannot get the module name for a package"); + + static if (isNotFunc && T.stringof.startsWith("module ")) { static if (__traits(compiles, packageName!T)) enum packagePrefix = packageName!T ~ '.'; @@ -582,6 +605,18 @@ template moduleName(alias T) static assert(moduleName!(X12287!int.i) == "std.traits"); } +@safe unittest // issue 13741 +{ + import std.ascii : isWhite; + static assert(moduleName!(isWhite) == "std.ascii"); + + struct Foo{void opCall(int){}} + static assert(moduleName!(Foo.opCall) == "std.traits"); + + @property void function(int) vf; + static assert(moduleName!(vf) == "std.traits"); +} + version (none) @safe unittest //Please uncomment me when changing moduleName to test global imports { import core.sync.barrier; // global import