Support definitely-not-null generic T!! types in Parsing and FE1.0
^KT-26245 In Progress
This commit is contained in:
committed by
TeamCityServer
parent
5a0b75bd89
commit
b9d2a1842a
@@ -75,6 +75,7 @@ public interface KtNodeTypes {
|
||||
IElementType FUNCTION_TYPE = KtStubElementTypes.FUNCTION_TYPE;
|
||||
IElementType FUNCTION_TYPE_RECEIVER = KtStubElementTypes.FUNCTION_TYPE_RECEIVER;
|
||||
IElementType NULLABLE_TYPE = KtStubElementTypes.NULLABLE_TYPE;
|
||||
IElementType DEFINITELY_NOT_NULL_TYPE = KtStubElementTypes.DEFINITELY_NOT_NULL_TYPE;
|
||||
IElementType TYPE_PROJECTION = KtStubElementTypes.TYPE_PROJECTION;
|
||||
|
||||
IElementType PROPERTY_ACCESSOR = KtStubElementTypes.PROPERTY_ACCESSOR;
|
||||
|
||||
@@ -2220,6 +2220,12 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
}
|
||||
|
||||
userType.done(USER_TYPE);
|
||||
|
||||
if (at(EXCLEXCL)) {
|
||||
PsiBuilder.Marker definitelyNotNull = userType.precede();
|
||||
advance(); // !!
|
||||
definitelyNotNull.done(DEFINITELY_NOT_NULL_TYPE);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean atParenthesizedMutableForPlatformTypes(int offset) {
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.psi
|
||||
|
||||
import com.intellij.lang.ASTNode
|
||||
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub
|
||||
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
|
||||
|
||||
class KtDefinitelyNotNullType : KtElementImplStub<KotlinPlaceHolderStub<KtDefinitelyNotNullType>>, KtTypeElement {
|
||||
constructor(node: ASTNode) : super(node)
|
||||
constructor(stub: KotlinPlaceHolderStub<KtDefinitelyNotNullType>) : super(stub, KtStubElementTypes.DEFINITELY_NOT_NULL_TYPE)
|
||||
|
||||
override fun getTypeArgumentsAsTypes(): List<KtTypeReference> {
|
||||
return this.innerType?.typeArgumentsAsTypes ?: emptyList()
|
||||
}
|
||||
|
||||
override fun <R, D> accept(visitor: KtVisitor<R, D>, data: D): R {
|
||||
return visitor.visitDefinitelyNotNullType(this, data)
|
||||
}
|
||||
|
||||
@get:IfNotParsed
|
||||
val innerType: KtTypeElement?
|
||||
get() = KtStubbedPsiUtil.getStubOrPsiChild(this, KtStubElementTypes.TYPE_ELEMENT_TYPES, KtTypeElement.ARRAY_FACTORY)
|
||||
|
||||
val modifierList: KtModifierList?
|
||||
get() = getStubOrPsiChild(KtStubElementTypes.MODIFIER_LIST)
|
||||
|
||||
val annotationEntries: List<KtAnnotationEntry>
|
||||
get() {
|
||||
return modifierList?.annotationEntries ?: emptyList()
|
||||
}
|
||||
}
|
||||
@@ -402,6 +402,10 @@ public class KtVisitor<R, D> extends PsiElementVisitor {
|
||||
return visitTypeElement(nullableType, data);
|
||||
}
|
||||
|
||||
public R visitDefinitelyNotNullType(@NotNull KtDefinitelyNotNullType definitelyNotNullType, D data) {
|
||||
return visitTypeElement(definitelyNotNullType, data);
|
||||
}
|
||||
|
||||
public R visitTypeProjection(@NotNull KtTypeProjection typeProjection, D data) {
|
||||
return visitKtElement(typeProjection, data);
|
||||
}
|
||||
|
||||
@@ -385,6 +385,10 @@ public class KtVisitorVoid extends KtVisitor<Void, Void> {
|
||||
super.visitNullableType(nullableType, null);
|
||||
}
|
||||
|
||||
public void visitDefinitelyNotNullType(@NotNull KtDefinitelyNotNullType definitelyNotNullType) {
|
||||
super.visitDefinitelyNotNullType(definitelyNotNullType, null);
|
||||
}
|
||||
|
||||
public void visitTypeProjection(@NotNull KtTypeProjection typeProjection) {
|
||||
super.visitTypeProjection(typeProjection, null);
|
||||
}
|
||||
@@ -972,6 +976,12 @@ public class KtVisitorVoid extends KtVisitor<Void, Void> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visitDefinitelyNotNullType(@NotNull KtDefinitelyNotNullType definitelyNotNullType, Void data) {
|
||||
visitDefinitelyNotNullType(definitelyNotNullType);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Void visitTypeProjection(@NotNull KtTypeProjection typeProjection, Void data) {
|
||||
visitTypeProjection(typeProjection);
|
||||
|
||||
@@ -79,6 +79,9 @@ public interface KtStubElementTypes {
|
||||
KtPlaceHolderStubElementType<KtNullableType> NULLABLE_TYPE =
|
||||
new KtPlaceHolderStubElementType<>("NULLABLE_TYPE", KtNullableType.class);
|
||||
|
||||
KtPlaceHolderStubElementType<KtDefinitelyNotNullType> DEFINITELY_NOT_NULL_TYPE =
|
||||
new KtPlaceHolderStubElementType<>("DEFINITELY_NOT_NULL_TYPE", KtDefinitelyNotNullType.class);
|
||||
|
||||
KtPlaceHolderStubElementType<KtTypeReference> TYPE_REFERENCE =
|
||||
new KtPlaceHolderStubElementType<>("TYPE_REFERENCE", KtTypeReference.class);
|
||||
|
||||
@@ -167,7 +170,7 @@ public interface KtStubElementTypes {
|
||||
|
||||
TokenSet SUPER_TYPE_LIST_ENTRIES = TokenSet.create(DELEGATED_SUPER_TYPE_ENTRY, SUPER_TYPE_CALL_ENTRY, SUPER_TYPE_ENTRY);
|
||||
|
||||
TokenSet TYPE_ELEMENT_TYPES = TokenSet.create(USER_TYPE, NULLABLE_TYPE, FUNCTION_TYPE, DYNAMIC_TYPE);
|
||||
TokenSet TYPE_ELEMENT_TYPES = TokenSet.create(USER_TYPE, NULLABLE_TYPE, FUNCTION_TYPE, DYNAMIC_TYPE, DEFINITELY_NOT_NULL_TYPE);
|
||||
|
||||
TokenSet INSIDE_DIRECTIVE_EXPRESSIONS = TokenSet.create(REFERENCE_EXPRESSION, DOT_QUALIFIED_EXPRESSION);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user