…through AWT215 and retire AWT217
AWT217 only restated CS7003 for a partially open [InjectProperty(typeof(...), name)] target, so it could only ever appear next to a compiler error, and it missed the one case C# accepts: typeof(Outer<>.Inner), which Roslyn marks unbound with arity 0 and which [InjectProperty] silently treated as an open entry matching every closing of Outer<T>.Inner, while [ImportService(typeof(...))] rejected it as AWT215.
Both typeof attributes now follow one rule: the argument must be a closed type or an unbound generic definition, and anything else, including null, is AWT215, which names the attribute. A partially open argument is recognised from syntax for both attributes, which also fixes [ImportService(typeof(Outer<int>.Inner<>))]: it was accepted next to CS7003 and only reported as an unused import (AWT176).
AWT217 never shipped (it was only listed as unshipped); its descriptor, docs section and tests are removed, and the id stays reserved and is never reused.
AWT217 only restated CS7003 for a partially open [InjectProperty(typeof(...), name)] target, so it could only ever appear next to a compiler error, and it missed the one case C# accepts: typeof(Outer<>.Inner), which Roslyn marks unbound with arity 0 and which [InjectProperty] silently treated as an open entry matching every closing of Outer.Inner, while [ImportService(typeof(...))] rejected it as AWT215.
Both typeof attributes now follow one rule: the argument must be a closed type or an unbound generic definition, and anything else, including null, is AWT215, which names the attribute. A partially open argument is recognised from syntax for both attributes, which also fixes [ImportService(typeof(Outer.Inner<>))]: it was accepted next to CS7003 and only reported as an unused import (AWT176).
AWT217 never shipped (it was only listed as unshipped); its descriptor, docs section and tests are removed, and the id stays reserved and is never reused.