Commits

Slava Pestov committed 31272643768
AST: When performing qualified lookup of a member type, filter out non-types earlier With the previous resolveTypeInContext() patch, a few compiler crashers regressed with this problem, presumably because we were now performing lookups in more contexts than before. This is a class of problems where we would attempt a recursive validation: 1) Generic signature validation begins for type T 2) Name lookup in type context finds a non-type declaration D nested in T 3) Generic signature validation begins for D 4) The outer generic context of D is T, but T doesn't have a generic signature yet The right way to break such cycles is to implement the iterative decl checker design. However when the recursion is via name lookup, we can try to avoid the problem in the first place by not validating non-type declarations if the client requested a type-only lookup. Note that there is a small semantic change here, where programs that were previously rejected as invalid because of name clashes are now valid. It is arguable if we want to allow stuff like this or not: class A { func A(a: A) {} } or class Case {} enum Foo { case Case(Case) } However at the very least, the new behavior is better because it gives us an opportunity to add a diagnostic in the right place later. The old diagnostics were not very good, for example the second example just yields "use of undeclared type 'Case'". In other examples, the undeclared type diagnostic would come up multiple times, or we would generate a cryptic "type 'A' used within its own definition". As far as I understand, this should not change behavior of any existing valid code.