Put type arguments next to the type reference (to make every type and application)

This commit is contained in:
Andrey Breslav
2011-01-18 18:46:28 +03:00
parent 823f4ed6de
commit 04aa370fa6
39 changed files with 851 additions and 838 deletions
@@ -1206,6 +1206,8 @@ public class JetParsing extends AbstractJetParsing {
*/ */
public void parseUserType() { public void parseUserType() {
PsiBuilder.Marker type = mark(); PsiBuilder.Marker type = mark();
boolean typeClosed = false;
if (at(NAMESPACE_KEYWORD)) { if (at(NAMESPACE_KEYWORD)) {
advance(); // NAMESPACE_KEYWORD advance(); // NAMESPACE_KEYWORD
expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER)); expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER));
@@ -1213,22 +1215,32 @@ public class JetParsing extends AbstractJetParsing {
while (true) { while (true) {
expect(IDENTIFIER, "Type name expected", TokenSet.create(LT)); expect(IDENTIFIER, "Type name expected", TokenSet.create(LT));
parseTypeArgumentList(); PsiBuilder.Marker argsMarker = parseTypeArgumentList();
if (!at(DOT)) break; if (!at(DOT)) {
// For recovery reasons, we allow to write Foo<A>.Bar<F, B>.X, but we need to place
// the last argument list next to the reference, not a its child
if (argsMarker != null) {
type.doneBefore(REFERENCE_EXPRESSION, argsMarker);
typeClosed = true;
}
break;
}
type.done(REFERENCE_EXPRESSION); type.done(REFERENCE_EXPRESSION);
type = type.precede(); type = type.precede();
advance(); // DOT advance(); // DOT
} }
if (!typeClosed) {
type.done(REFERENCE_EXPRESSION); type.done(REFERENCE_EXPRESSION);
} }
}
/* /*
* (optionalProjection type){","} * (optionalProjection type){","}
*/ */
public void parseTypeArgumentList() { public PsiBuilder.Marker parseTypeArgumentList() {
if (!at(LT)) return; if (!at(LT)) return null;
PsiBuilder.Marker list = mark(); PsiBuilder.Marker list = mark();
@@ -1246,6 +1258,7 @@ public class JetParsing extends AbstractJetParsing {
myBuilder.restoreNewlinesState(); myBuilder.restoreNewlinesState();
list.done(TYPE_ARGUMENT_LIST); list.done(TYPE_ARGUMENT_LIST);
return list;
} }
/* /*