From 2d1c76344c3a6794164bae98b44988419a13932d Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 12 Nov 2018 13:36:05 +0300 Subject: [PATCH] Store presence of spread operator for value argument in stubs --- .../jetbrains/kotlin/psi/KtLambdaArgument.kt | 6 +- .../jetbrains/kotlin/psi/KtValueArgument.java | 23 +++++- .../kotlin/psi/stubs/KotlinStubVersions.kt | 2 +- .../kotlin/psi/stubs/StubInterfaces.kt | 4 + .../stubs/elements/KtStubElementTypes.java | 8 +- .../elements/KtValueArgumentElementType.kt | 31 ++++++++ .../stubs/impl/KotlinValueArgumentStubImpl.kt | 20 +++++ idea/testData/stubs/AnnotationValues.expected | 74 ++++++++++++------- idea/testData/stubs/AnnotationValues.kt | 13 +++- .../stubs/AnnotationWithValue.expected | 4 +- idea/testData/stubs/Contracts.expected | 2 +- idea/testData/stubs/DynamicType.expected | 4 +- idea/testData/stubs/TypeAnnotation.expected | 4 +- 13 files changed, 147 insertions(+), 48 deletions(-) create mode 100644 compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentElementType.kt create mode 100644 compiler/psi/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinValueArgumentStubImpl.kt diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtLambdaArgument.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtLambdaArgument.kt index bb49f747a6f..6685a1f092e 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtLambdaArgument.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtLambdaArgument.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.psi import com.intellij.lang.ASTNode -import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub +import org.jetbrains.kotlin.psi.stubs.KotlinValueArgumentStub import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes class KtLambdaArgument : KtValueArgument, LambdaArgument { - constructor(node: ASTNode) : super(node) {} + constructor(node: ASTNode) : super(node) - constructor(stub: KotlinPlaceHolderStub) : super(stub, KtStubElementTypes.LAMBDA_ARGUMENT) {} + constructor(stub: KotlinValueArgumentStub) : super(stub, KtStubElementTypes.LAMBDA_ARGUMENT) {} override fun getLambdaExpression(): KtLambdaExpression? = getArgumentExpression()?.unpackFunctionLiteral() } diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtValueArgument.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtValueArgument.java index 6ee3afea5fc..c34ca24a830 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtValueArgument.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtValueArgument.java @@ -19,24 +19,25 @@ package org.jetbrains.kotlin.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.source.tree.LeafPsiElement; +import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub; -import org.jetbrains.kotlin.psi.stubs.elements.KtPlaceHolderStubElementType; +import org.jetbrains.kotlin.psi.stubs.KotlinValueArgumentStub; import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; -public class KtValueArgument extends KtElementImplStub> implements ValueArgument { +public class KtValueArgument extends KtElementImplStub> implements ValueArgument { public KtValueArgument(@NotNull ASTNode node) { super(node); } - public KtValueArgument(@NotNull KotlinPlaceHolderStub stub) { + public KtValueArgument(@NotNull KotlinValueArgumentStub stub) { super(stub, KtStubElementTypes.VALUE_ARGUMENT); } - protected KtValueArgument(KotlinPlaceHolderStub stub, KtPlaceHolderStubElementType nodeType) { + protected KtValueArgument(KotlinValueArgumentStub stub, IStubElementType nodeType) { super(stub, nodeType); } @@ -96,10 +97,24 @@ public class KtValueArgument extends KtElementImplStub { fun isObjectLiteral(): Boolean } +interface KotlinValueArgumentStub : KotlinPlaceHolderStub { + fun isSpread(): Boolean +} + interface KotlinAnnotationEntryStub : StubElement { fun getShortName(): String? fun hasValueArguments(): Boolean diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java index 123fe4a1608..4f0199e4997 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java @@ -104,11 +104,11 @@ public interface KtStubElementTypes { KtPlaceHolderStubElementType VALUE_ARGUMENT_LIST = new KtValueArgumentListElementType("VALUE_ARGUMENT_LIST"); - KtPlaceHolderStubElementType VALUE_ARGUMENT = - new KtPlaceHolderStubElementType<>("VALUE_ARGUMENT", KtValueArgument.class); + KtValueArgumentElementType VALUE_ARGUMENT = + new KtValueArgumentElementType<>("VALUE_ARGUMENT", KtValueArgument.class); - KtPlaceHolderStubElementType LAMBDA_ARGUMENT = - new KtPlaceHolderStubElementType<>("LAMBDA_ARGUMENT", KtLambdaArgument.class); + KtValueArgumentElementType LAMBDA_ARGUMENT = + new KtValueArgumentElementType<>("LAMBDA_ARGUMENT", KtLambdaArgument.class); KtPlaceHolderStubElementType VALUE_ARGUMENT_NAME = new KtPlaceHolderStubElementType<>("VALUE_ARGUMENT_NAME", KtValueArgumentName.class); diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentElementType.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentElementType.kt new file mode 100644 index 00000000000..ce27f065e47 --- /dev/null +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentElementType.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.stubs.elements + +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubInputStream +import com.intellij.psi.stubs.StubOutputStream +import org.jetbrains.kotlin.psi.KtValueArgument +import org.jetbrains.kotlin.psi.stubs.KotlinValueArgumentStub +import org.jetbrains.kotlin.psi.stubs.impl.KotlinValueArgumentStubImpl + +class KtValueArgumentElementType(debugName: String, psiClass: Class) : + KtStubElementType, T>(debugName, psiClass, KotlinValueArgumentStub::class.java) { + + override fun createStub(psi: T, parentStub: StubElement?): KotlinValueArgumentStub { + return KotlinValueArgumentStubImpl(parentStub, this, psi.isSpread) + } + + override fun serialize(stub: KotlinValueArgumentStub, dataStream: StubOutputStream) { + dataStream.writeBoolean(stub.isSpread()) + } + + override fun deserialize(dataStream: StubInputStream, parentStub: StubElement?): KotlinValueArgumentStub { + val isSpread = dataStream.readBoolean() + return KotlinValueArgumentStubImpl(parentStub, this, isSpread) + } +} diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinValueArgumentStubImpl.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinValueArgumentStubImpl.kt new file mode 100644 index 00000000000..097ade8fbbe --- /dev/null +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinValueArgumentStubImpl.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.stubs.impl + +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import org.jetbrains.kotlin.psi.KtValueArgument +import org.jetbrains.kotlin.psi.stubs.KotlinValueArgumentStub +import org.jetbrains.kotlin.psi.stubs.elements.KtValueArgumentElementType + +class KotlinValueArgumentStubImpl( + parent: StubElement?, + elementType: KtValueArgumentElementType, + private val isSpread: Boolean +) : KotlinPlaceHolderStubImpl(parent, elementType), KotlinValueArgumentStub { + override fun isSpread(): Boolean = isSpread +} \ No newline at end of file diff --git a/idea/testData/stubs/AnnotationValues.expected b/idea/testData/stubs/AnnotationValues.expected index 3396509354e..c788cd3f3d4 100644 --- a/idea/testData/stubs/AnnotationValues.expected +++ b/idea/testData/stubs/AnnotationValues.expected @@ -58,27 +58,27 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=Simple] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] INTEGER_CONSTANT[kind=INTEGER_CONSTANT, value=12] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] INTEGER_CONSTANT[kind=INTEGER_CONSTANT, value=12L] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] INTEGER_CONSTANT[kind=INTEGER_CONSTANT, value=12] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] FLOAT_CONSTANT[kind=FLOAT_CONSTANT, value=3.3] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=f] FLOAT_CONSTANT[kind=FLOAT_CONSTANT, value=3.3F] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=c] CHARACTER_CONSTANT[kind=CHARACTER_CONSTANT, value='a'] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=b1] BOOLEAN_CONSTANT[kind=BOOLEAN_CONSTANT, value=true] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=b2] BOOLEAN_CONSTANT[kind=BOOLEAN_CONSTANT, value=false] @@ -108,12 +108,12 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=StringLiteral] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] STRING_TEMPLATE LITERAL_STRING_TEMPLATE_ENTRY[text=some] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] STRING_TEMPLATE - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] STRING_TEMPLATE LITERAL_STRING_TEMPLATE_ENTRY[text=H] SHORT_STRING_TEMPLATE_ENTRY[text=$CONSTANT] @@ -147,13 +147,13 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=EnumLiteral] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] REFERENCE_EXPRESSION[referencedName=E1] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION[referencedName=E] REFERENCE_EXPRESSION[referencedName=E2] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=e3] DOT_QUALIFIED_EXPRESSION @@ -178,11 +178,11 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=VarArg] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] INTEGER_CONSTANT[kind=INTEGER_CONSTANT, value=1] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] INTEGER_CONSTANT[kind=INTEGER_CONSTANT, value=2] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] INTEGER_CONSTANT[kind=INTEGER_CONSTANT, value=3] CLASS[fqName=test.Arrays, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=Arrays, superNames=[]] MODIFIER_LIST[annotation] @@ -220,12 +220,12 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=Arrays] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT - VALUE_ARGUMENT - VALUE_ARGUMENT - VALUE_ARGUMENT - VALUE_ARGUMENT - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] CLASS[fqName=test.ClassLiteral, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=ClassLiteral, superNames=[]] MODIFIER_LIST[annotation] PRIMARY_CONSTRUCTOR @@ -256,9 +256,9 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=ClassLiteral] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT - VALUE_ARGUMENT - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] + VALUE_ARGUMENT[isSpread=false] TYPE_PARAMETER_LIST TYPE_PARAMETER[fqName=null, isInVariance=false, isOutVariance=false, name=T] CLASS[fqName=test.Nested, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=Nested, superNames=[]] @@ -293,9 +293,27 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=Outer] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] STRING_TEMPLATE LITERAL_STRING_TEMPLATE_ENTRY[text=value] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=nested] + CLASS[fqName=test.ArraysSpread, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=ArraysSpread, superNames=[]] + MODIFIER_LIST[annotation] + PRIMARY_CONSTRUCTOR + VALUE_PARAMETER_LIST + VALUE_PARAMETER[fqName=test.ArraysSpread.ia, hasDefaultValue=false, hasValOrVar=true, isMutable=false, name=ia] + MODIFIER_LIST[vararg] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Int] + CLASS[fqName=test.WithSpreadOperatorArrays, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=WithSpreadOperatorArrays, superNames=[]] + MODIFIER_LIST[] + ANNOTATION_ENTRY[hasValueArguments=true, shortName=ArraysSpread] + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=ArraysSpread] + VALUE_ARGUMENT_LIST + VALUE_ARGUMENT[isSpread=true] diff --git a/idea/testData/stubs/AnnotationValues.kt b/idea/testData/stubs/AnnotationValues.kt index 5f40ea3a350..21eb707a235 100644 --- a/idea/testData/stubs/AnnotationValues.kt +++ b/idea/testData/stubs/AnnotationValues.kt @@ -117,4 +117,15 @@ annotation class Outer( ) @Outer("value", nested = Nested(12, "nested value")) -class WithNested \ No newline at end of file +class WithNested + +// ============================== + +annotation class ArraysSpread( + vararg val ia: Int +) + +@ArraysSpread( + *[1, 2, 3] +) +class WithSpreadOperatorArrays \ No newline at end of file diff --git a/idea/testData/stubs/AnnotationWithValue.expected b/idea/testData/stubs/AnnotationWithValue.expected index 9736b6b08e4..eaf268d6eae 100644 --- a/idea/testData/stubs/AnnotationWithValue.expected +++ b/idea/testData/stubs/AnnotationWithValue.expected @@ -21,9 +21,9 @@ PsiJetFileStubImpl[package=] USER_TYPE REFERENCE_EXPRESSION[referencedName=Test] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] STRING_TEMPLATE - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] VALUE_ARGUMENT_NAME REFERENCE_EXPRESSION[referencedName=other] STRING_TEMPLATE diff --git a/idea/testData/stubs/Contracts.expected b/idea/testData/stubs/Contracts.expected index 985864a0ac6..a6a6afc0822 100644 --- a/idea/testData/stubs/Contracts.expected +++ b/idea/testData/stubs/Contracts.expected @@ -7,7 +7,7 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=Suppress] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] STRING_TEMPLATE LITERAL_STRING_TEMPLATE_ENTRY[text=INVISIBLE_MEMBER] PACKAGE_DIRECTIVE diff --git a/idea/testData/stubs/DynamicType.expected b/idea/testData/stubs/DynamicType.expected index 7c2af95b4de..438ffb82477 100644 --- a/idea/testData/stubs/DynamicType.expected +++ b/idea/testData/stubs/DynamicType.expected @@ -35,11 +35,11 @@ PsiJetFileStubImpl[package=] USER_TYPE REFERENCE_EXPRESSION[referencedName=Target] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION[referencedName=AnnotationTarget] REFERENCE_EXPRESSION[referencedName=TYPE] - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION[referencedName=AnnotationTarget] REFERENCE_EXPRESSION[referencedName=TYPE_PARAMETER] diff --git a/idea/testData/stubs/TypeAnnotation.expected b/idea/testData/stubs/TypeAnnotation.expected index c461d742ec4..01abc1b0027 100644 --- a/idea/testData/stubs/TypeAnnotation.expected +++ b/idea/testData/stubs/TypeAnnotation.expected @@ -34,7 +34,7 @@ PsiJetFileStubImpl[package=] USER_TYPE REFERENCE_EXPRESSION[referencedName=b] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION[referencedName=E] REFERENCE_EXPRESSION[referencedName=E1] @@ -55,7 +55,7 @@ PsiJetFileStubImpl[package=] USER_TYPE REFERENCE_EXPRESSION[referencedName=b] VALUE_ARGUMENT_LIST - VALUE_ARGUMENT + VALUE_ARGUMENT[isSpread=false] DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION[referencedName=E] REFERENCE_EXPRESSION[referencedName=E2]