A type pattern is one of
|TypeNamePattern||all types in TypeNamePattern|
|SubtypePattern||all types in SubtypePattern, a pattern with a +.|
|ArrayTypePattern||all types in ArrayTypePattern, a pattern with one or more s.|
|!TypePattern||all types not in TypePattern|
|TypePattern0 && TypePattern1||all types in both TypePattern0 and TypePattern1|
|TypePattern0 || TypePattern1||all types in either TypePattern0 or TypePattern1|
|( TypePattern )||all types in TypePattern|
where TypeNamePattern can either be a plain type name, the wildcard * (indicating all types), or an identifier with embedded * and .. wildcards.
An embedded * in an identifier matches any sequence of characters, but does not match the package (or inner-type) separator ".".
An embedded .. in an identifier matches any sequence of characters that starts and ends with the package (or inner-type) separator ".".