private static SourceSpec fromDescriptorPattern(String source, String kind) {
        String declaring = null;
        String name = null;
        String signature;
        int start = -1;
        int end;
        //
        end = source.indexOf("#");
        if (end >= 0) {
            start = end;
        }
        //
        end = source.indexOf(".");
        if (end >= 0) {
            declaring = source.substring(start < 0 ? 0 : (start + 1), end);
            start = end;
        }
        //
        end = source.indexOf(":");
        if (end >= 0) {
            name = source.substring(start < 0 ? 0 : (start + 1), end);
            start = end;
        }
        //
        signature = source.substring(start < 0 ? 0 : (start + 1));
        Object[] ts = Type.signatureToTypes(signature);

        String signatureSig = "L" + declaring + ";";
        return new SourceSpec(
                Kind.valueOf(kind),
                (Type) ts[0],
                Type.forSignature(signatureSig),
                name,
                (Type[]) ts[1]);
    }
This is a parser for custom aop pointcut expression.
<p>
Such as <pre>int android.util.Log.d(java.lang.String,java.lang.String)</pre>
plugin/src/main/groovy/com/didichuxing/tools/droidassist/spec/SourceSpec.java