Added ad-hoc KtValueArgument.stringTemplateExpression

Use only stub stringTemplateExpression if it is present and don't use ast nodes as it could be unbounded

#KT-47034 Fixed
This commit is contained in:
Vladimir Dolzhenko
2021-06-10 21:14:32 +00:00
committed by Space
parent a383c1ce79
commit 2c8d583d8b
5 changed files with 123 additions and 10 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object JvmFileClassUtil {
val JVM_NAME: FqName = FqName("kotlin.jvm.JvmName")
@@ -99,9 +100,13 @@ object JvmFileClassUtil {
}
fun getLiteralStringFromAnnotation(annotation: KtAnnotationEntry): String? {
val argumentExpression = annotation.valueArguments.firstOrNull()?.getArgumentExpression() ?: return null
val stringTemplate = argumentExpression as? KtStringTemplateExpression ?: return null
val singleEntry = stringTemplate.entries.singleOrNull() as? KtLiteralStringTemplateEntry ?: return null
val stringTemplateExpression = annotation.valueArguments.firstOrNull()?.run {
when (this) {
is KtValueArgument -> stringTemplateExpression
else -> getArgumentExpression().safeAs<KtStringTemplateExpression>()
}
} ?: return null
val singleEntry = stringTemplateExpression.entries.singleOrNull() as? KtLiteralStringTemplateEntry ?: return null
return singleEntry.text
}
}
@@ -59,6 +59,10 @@ public class KtValueArgument extends KtElementImplStub<KotlinValueArgumentStub<?
KtStubElementTypes.STRING_TEMPLATE
);
private static final TokenSet STRING_TEMPLATE_EXPRESSIONS_TYPES = TokenSet.create(
KtStubElementTypes.STRING_TEMPLATE
);
@Override
@Nullable @IfNotParsed
public KtExpression getArgumentExpression() {
@@ -73,6 +77,19 @@ public class KtValueArgument extends KtElementImplStub<KotlinValueArgumentStub<?
return findChildByClass(KtExpression.class);
}
@Nullable
public KtStringTemplateExpression getStringTemplateExpression() {
KotlinPlaceHolderStub<? extends KtValueArgument> stub = getStub();
KtExpression expression;
if (stub != null) {
KtExpression[] stringTemplateExpressions = stub.getChildrenByType(STRING_TEMPLATE_EXPRESSIONS_TYPES, KtExpression.EMPTY_ARRAY);
expression = stringTemplateExpressions.length != 0 ? stringTemplateExpressions[0] : null;
} else {
expression = findChildByClass(KtExpression.class);
}
return expression instanceof KtStringTemplateExpression ? (KtStringTemplateExpression)expression : null;
}
@Override
@Nullable
public KtValueArgumentName getArgumentName() {