Previously, clang-format didn't understand lightweight
Objective-C generics, which have the form:
@interface Foo <KeyType, ValueTypeWithConstraint : Foo, AnotherValueTypeWithGenericConstraint: Bar<Baz>, ... > ...
The lightweight generic specifier list appears before the base
class, if present, but because it starts with < like the protocol
specifier list, UnwrappedLineParser was getting confused and
failed to parse interfaces with both generics and protocol lists:
@interface Foo <KeyType> : NSObject <NSCopying>
Since the parsed line would be incomplete, the format result
would be very confused (e.g., https://bugs.llvm.org/show_bug.cgi?id=24381).
This fixes the issue by explicitly parsing the ObjC lightweight
generic conformance list, so the line is fully parsed.
Fixes: https://bugs.llvm.org/show_bug.cgi?id=24381
Test Plan: New tests added. Ran tests with:
% make -j16 FormatTests && ./tools/clang/unittests/Format/FormatTests
The UnwrappedLineParser is very much about error recovery. Implemented like this, it will consume the rest of the file if someone forgets to add the closing ">", which can very easily happen when formatting in an editor while coding.
Are there things (e.g. semicolons and braces) that clearly point to this having happened so that clang-format can recover?