Parser: Disable joining complex tokens while parsing type references

#KT-8141 Fixed
This commit is contained in:
Alexey Sedunov
2015-06-19 14:43:29 +03:00
parent 0e9bcee0bc
commit 3266d8c29a
5 changed files with 375 additions and 35 deletions
@@ -1835,10 +1835,6 @@ public class JetParsing extends AbstractJetParsing {
// The extraRecoverySet is needed for the foo(bar<x, 1, y>(z)) case, to tell whether we should stop
// on expression-indicating symbols or not
private PsiBuilder.Marker parseTypeRefContents(TokenSet extraRecoverySet) {
// Disabling token merge is required for cases like
// Int?.(Foo) -> Bar
// we don't support this case now
// myBuilder.disableJoiningComplexTokens();
PsiBuilder.Marker typeRefMarker = mark();
parseAnnotations(ONLY_ESCAPED_REGULAR_ANNOTATIONS);
@@ -1898,7 +1894,11 @@ public class JetParsing extends AbstractJetParsing {
typeBeforeDot = false;
}
// Disabling token merge is required for cases like
// Int?.(Foo) -> Bar
myBuilder.disableJoiningComplexTokens();
typeRefMarker = parseNullableTypeSuffix(typeRefMarker);
myBuilder.restoreJoiningComplexTokensState();
if (typeBeforeDot && at(DOT)) {
// This is a receiver for a function type
@@ -1922,13 +1922,14 @@ public class JetParsing extends AbstractJetParsing {
functionType.done(FUNCTION_TYPE);
}
// myBuilder.restoreJoiningComplexTokensState();
return typeRefMarker;
}
@NotNull
PsiBuilder.Marker parseNullableTypeSuffix(@NotNull PsiBuilder.Marker typeRefMarker) {
while (at(QUEST)) {
// ?: is joined regardless of joining state
while (at(QUEST) && myBuilder.rawLookup(1) != COLON) {
PsiBuilder.Marker precede = typeRefMarker.precede();
advance(); // QUEST
typeRefMarker.done(NULLABLE_TYPE);