[BE IR] Skip comments for determining startOffset of declaration

This commit is contained in:
Dmitry Savvinov
2018-04-18 17:57:47 +03:00
committed by Dmitry Savvinov
parent 633f665b7f
commit 00036ba498
25 changed files with 267 additions and 169 deletions
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch
@@ -74,7 +74,7 @@ fun MemberScope.findSingleFunction(name: Name): FunctionDescriptor =
fun KotlinBuiltIns.findSingleFunction(name: Name): FunctionDescriptor =
builtInsPackageScope.findSingleFunction(name)
val PsiElement?.startOffsetOrUndefined get() = this?.startOffset ?: UNDEFINED_OFFSET
val PsiElement?.startOffsetOrUndefined get() = this?.startOffsetSkippingComments ?: UNDEFINED_OFFSET
val PsiElement?.endOffsetOrUndefined get() = this?.endOffset ?: UNDEFINED_OFFSET
val PropertyDescriptor.unwrappedGetMethod: FunctionDescriptor?
@@ -83,5 +83,5 @@ val PropertyDescriptor.unwrappedGetMethod: FunctionDescriptor?
val PropertyDescriptor.unwrappedSetMethod: FunctionDescriptor?
get() = if (this is SyntheticPropertyDescriptor) this.setMethod else setter
val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffset ?: UNDEFINED_OFFSET
val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffsetSkippingComments ?: UNDEFINED_OFFSET
val KtPureElement?.pureEndOffsetOrUndefined get() = this?.psiOrParent?.endOffset ?: UNDEFINED_OFFSET
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.psi.KtAnonymousInitializer
import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class AnonymousInitializerGenerator(
declarationGenerator: DeclarationGenerator
@@ -34,12 +34,12 @@ class AnonymousInitializerGenerator(
classDescriptor: ClassDescriptor
): IrDeclaration =
context.symbolTable.declareAnonymousInitializer(
ktAnonymousInitializer.startOffset, ktAnonymousInitializer.endOffset, IrDeclarationOrigin.DEFINED, classDescriptor
ktAnonymousInitializer.startOffsetSkippingComments, ktAnonymousInitializer.endOffset, IrDeclarationOrigin.DEFINED, classDescriptor
).buildWithScope { irAnonymousInitializer ->
val bodyGenerator = createBodyGenerator(irAnonymousInitializer.symbol)
val statementGenerator = bodyGenerator.createStatementGenerator()
val ktBody = ktAnonymousInitializer.body!!
val irBlockBody = IrBlockBodyImpl(ktBody.startOffset, ktBody.endOffset)
val irBlockBody = IrBlockBodyImpl(ktBody.startOffsetSkippingComments, ktBody.endOffset)
if (ktBody is KtBlockExpression) {
statementGenerator.generateStatements(ktBody.statements, irBlockBody)
} else {
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionWithCopy
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.intermediate.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -44,7 +44,7 @@ fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, recei
receiver?.let { generateReceiver(ktDefaultElement, receiver) }
fun StatementGenerator.generateReceiver(ktDefaultElement: KtElement, receiver: ReceiverValue): IntermediateValue =
generateReceiver(ktDefaultElement.startOffset, ktDefaultElement.endOffset, receiver)
generateReceiver(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, receiver)
fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffset: Int, receiver: ReceiverValue): IntermediateValue {
val irReceiverType = receiver.type.toIrType()
@@ -71,7 +71,7 @@ fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffse
generateExpression(receiver.expression)
is ClassValueReceiver ->
IrGetObjectValueImpl(
receiver.expression.startOffset, receiver.expression.endOffset, irReceiverType,
receiver.expression.startOffsetSkippingComments, receiver.expression.endOffset, irReceiverType,
context.symbolTable.referenceClass(receiver.classQualifier.descriptor as ClassDescriptor)
)
is ExtensionReceiver ->
@@ -132,7 +132,7 @@ private fun StatementGenerator.generateThisOrSuperReceiver(receiver: ReceiverVal
receiver as? ExpressionReceiver ?: throw AssertionError("'this' or 'super' receiver should be an expression receiver")
val ktReceiver = expressionReceiver.expression
return IrGetValueImpl(
ktReceiver.startOffset, ktReceiver.endOffset,
ktReceiver.startOffsetSkippingComments, ktReceiver.endOffset,
expressionReceiver.type.toIrType(),
context.symbolTable.referenceValueParameter(classDescriptor.thisAsReceiverParameter)
)
@@ -164,7 +164,7 @@ fun StatementGenerator.generateCallReceiver(
"Call for member imported from object $calleeDescriptor has non-null dispatch receiver $dispatchReceiver"
}
dispatchReceiverValue =
generateReceiverForCalleeImportedFromObject(ktDefaultElement.startOffset, ktDefaultElement.endOffset, calleeDescriptor)
generateReceiverForCalleeImportedFromObject(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, calleeDescriptor)
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
}
is TypeAliasConstructorDescriptor -> {
@@ -186,7 +186,7 @@ fun StatementGenerator.generateCallReceiver(
SimpleCallReceiver(dispatchReceiverValue, extensionReceiverValue)
extensionReceiverValue != null || dispatchReceiverValue != null ->
SafeCallReceiver(
this, ktDefaultElement.startOffset, ktDefaultElement.endOffset,
this, ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset,
extensionReceiverValue, dispatchReceiverValue, isAssignmentReceiver
)
else ->
@@ -218,7 +218,7 @@ fun StatementGenerator.generateVarargExpression(
}
val varargStartOffset = varargArgument.arguments.fold(Int.MAX_VALUE) { minStartOffset, argument ->
Math.min(minStartOffset, argument.asElement().startOffset)
Math.min(minStartOffset, argument.asElement().startOffsetSkippingComments)
}
val varargEndOffset = varargArgument.arguments.fold(Int.MIN_VALUE) { maxEndOffset, argument ->
Math.max(maxEndOffset, argument.asElement().endOffset)
@@ -235,7 +235,7 @@ fun StatementGenerator.generateVarargExpression(
val irVarargElement =
if (argument.getSpreadElement() != null)
IrSpreadElementImpl(
ktArgumentExpression.startOffset, ktArgumentExpression.endOffset,
ktArgumentExpression.startOffsetSkippingComments, ktArgumentExpression.endOffset,
generateExpression(ktArgumentExpression)
)
else
@@ -333,7 +333,7 @@ fun StatementGenerator.pregenerateExtensionInvokeCall(resolvedCall: ResolvedCall
call.callReceiver =
if (resolvedCall.call.isSafeCall())
SafeExtensionInvokeCallReceiver(
this, ktCallElement.startOffset, ktCallElement.endOffset,
this, ktCallElement.startOffsetSkippingComments, ktCallElement.endOffset,
call, functionReceiverValue, extensionInvokeReceiverValue
)
else
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.intermediate.*
import org.jetbrains.kotlin.psi2ir.unwrappedGetMethod
import org.jetbrains.kotlin.psi2ir.unwrappedSetMethod
@@ -76,7 +76,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
val irAssignmentReceiver = generateAssignmentReceiver(ktBaseExpression, origin)
return irAssignmentReceiver.assign { irLValue ->
irBlock(ktExpression.startOffset, ktExpression.endOffset, origin, irLValue.type) {
irBlock(ktExpression.startOffsetSkippingComments, ktExpression.endOffset, origin, irLValue.type) {
val opCall = statementGenerator.pregenerateCall(opResolvedCall)
opCall.setExplicitReceiverValue(irLValue)
val irOpCall = CallGenerator(statementGenerator).generateCall(ktExpression, opCall, origin)
@@ -92,7 +92,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
val irAssignmentReceiver = generateAssignmentReceiver(ktBaseExpression, origin)
return irAssignmentReceiver.assign { irLValue ->
irBlock(ktExpression.startOffset, ktExpression.endOffset, origin, irLValue.type) {
irBlock(ktExpression.startOffsetSkippingComments, ktExpression.endOffset, origin, irLValue.type) {
val temporary = irTemporary(irLValue.load())
val opCall = statementGenerator.pregenerateCall(opResolvedCall)
opCall.setExplicitReceiverValue(
@@ -116,7 +116,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
return when (descriptor) {
is SyntheticFieldDescriptor -> {
val receiverValue =
statementGenerator.generateBackingFieldReceiver(ktLeft.startOffset, ktLeft.endOffset, resolvedCall, descriptor)
statementGenerator.generateBackingFieldReceiver(ktLeft.startOffsetSkippingComments, ktLeft.endOffset, resolvedCall, descriptor)
createBackingFieldLValue(ktLeft, descriptor.propertyDescriptor, receiverValue, origin)
}
is LocalVariableDescriptor ->
@@ -124,7 +124,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
if (descriptor.isDelegated)
DelegatedLocalPropertyLValue(
context,
ktLeft.startOffset, ktLeft.endOffset,
ktLeft.startOffsetSkippingComments, ktLeft.endOffset,
descriptor.type.toIrType(),
descriptor.getter?.let { context.symbolTable.referenceDeclaredFunction(it) },
descriptor.setter?.let { context.symbolTable.referenceDeclaredFunction(it) },
@@ -148,7 +148,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
) =
VariableLValue(
context,
ktExpression.startOffset, ktExpression.endOffset,
ktExpression.startOffsetSkippingComments, ktExpression.endOffset,
context.symbolTable.referenceValue(descriptor),
descriptor.type.toIrType(),
origin
@@ -162,7 +162,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
): BackingFieldLValue =
BackingFieldLValue(
context,
ktExpression.startOffset, ktExpression.endOffset,
ktExpression.startOffsetSkippingComments, ktExpression.endOffset,
descriptor.type.toIrType(),
context.symbolTable.referenceField(descriptor),
receiverValue, origin
@@ -179,7 +179,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
val thisAsReceiverParameter = thisClass.thisAsReceiverParameter
val thisType = thisAsReceiverParameter.type.toIrType()
val irThis = IrGetValueImpl(
ktLeft.startOffset, ktLeft.endOffset,
ktLeft.startOffsetSkippingComments, ktLeft.endOffset,
thisType,
context.symbolTable.referenceValueParameter(thisAsReceiverParameter)
)
@@ -222,7 +222,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
AccessorPropertyLValue(
context,
scope,
ktExpression.startOffset, ktExpression.endOffset, origin,
ktExpression.startOffsetSkippingComments, ktExpression.endOffset, origin,
propertyIrType,
getterSymbol,
getterDescriptor,
@@ -236,7 +236,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
FieldPropertyLValue(
context,
scope,
ktExpression.startOffset, ktExpression.endOffset, origin,
ktExpression.startOffsetSkippingComments, ktExpression.endOffset, origin,
context.symbolTable.referenceField(descriptor),
propertyIrType,
propertyReceiver,
@@ -275,7 +275,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
return ArrayAccessAssignmentReceiver(
irArray, irIndexExpressions, indexedGetCall, indexedSetCall,
CallGenerator(statementGenerator),
ktLeft.startOffset, ktLeft.endOffset, origin
ktLeft.startOffsetSkippingComments, ktLeft.endOffset, origin
)
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset
import org.jetbrains.kotlin.psi.psiUtil.pureStartOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi.synthetics.findClassDescriptor
import org.jetbrains.kotlin.psi2ir.intermediate.VariableLValue
import org.jetbrains.kotlin.resolve.BindingContext
@@ -52,7 +53,7 @@ class BodyGenerator(
fun generateFunctionBody(ktBody: KtExpression): IrBody {
val statementGenerator = createStatementGenerator()
val irBlockBody = IrBlockBodyImpl(ktBody.startOffset, ktBody.endOffset)
val irBlockBody = IrBlockBodyImpl(ktBody.startOffsetSkippingComments, ktBody.endOffset)
if (ktBody is KtBlockExpression) {
statementGenerator.generateStatements(ktBody.statements, irBlockBody)
} else {
@@ -69,14 +70,14 @@ class BodyGenerator(
val statementGenerator = createStatementGenerator()
val ktBody = ktFun.bodyExpression!!
val irBlockBody = IrBlockBodyImpl(ktBody.startOffset, ktBody.endOffset)
val irBlockBody = IrBlockBodyImpl(ktBody.startOffsetSkippingComments, ktBody.endOffset)
for (ktParameter in ktFun.valueParameters) {
val ktDestructuringDeclaration = ktParameter.destructuringDeclaration ?: continue
val valueParameter = getOrFail(BindingContext.VALUE_PARAMETER, ktParameter)
val parameterValue = VariableLValue(
context,
ktDestructuringDeclaration.startOffset, ktDestructuringDeclaration.endOffset,
ktDestructuringDeclaration.startOffsetSkippingComments, ktDestructuringDeclaration.endOffset,
context.symbolTable.referenceValue(valueParameter),
valueParameter.type.toIrType(),
IrStatementOrigin.DESTRUCTURING_DECLARATION
@@ -94,9 +95,9 @@ class BodyGenerator(
} else {
irBlockBody.statements.add(
generateReturnExpression(
ktBody.startOffset, ktBody.endOffset,
ktBody.startOffsetSkippingComments, ktBody.endOffset,
IrGetObjectValueImpl(
ktBody.startOffset, ktBody.endOffset, context.irBuiltIns.unitType,
ktBody.startOffsetSkippingComments, ktBody.endOffset, context.irBuiltIns.unitType,
context.symbolTable.referenceClass(context.builtIns.unit)
)
)
@@ -134,7 +135,7 @@ class BodyGenerator(
fun generateSecondaryConstructorBody(ktConstructor: KtSecondaryConstructor): IrBody {
val irBlockBody = IrBlockBodyImpl(ktConstructor.startOffset, ktConstructor.endOffset)
val irBlockBody = IrBlockBodyImpl(ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset)
generateDelegatingConstructorCall(irBlockBody, ktConstructor)
@@ -164,7 +165,7 @@ class BodyGenerator(
val delegatingConstructorCall = statementGenerator.pregenerateCall(delegatingConstructorResolvedCall)
val irDelegatingConstructorCall = CallGenerator(statementGenerator).generateDelegatingConstructorCall(
ktDelegatingConstructorCall.startOffset, ktDelegatingConstructorCall.endOffset,
ktDelegatingConstructorCall.startOffsetSkippingComments, ktDelegatingConstructorCall.endOffset,
delegatingConstructorCall
)
irBlockBody.statements.add(irDelegatingConstructorCall)
@@ -197,14 +198,14 @@ class BodyGenerator(
}
fun generateSecondaryConstructorBodyWithNestedInitializers(ktConstructor: KtSecondaryConstructor): IrBody {
val irBlockBody = IrBlockBodyImpl(ktConstructor.startOffset, ktConstructor.endOffset)
val irBlockBody = IrBlockBodyImpl(ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset)
generateDelegatingConstructorCall(irBlockBody, ktConstructor)
val classDescriptor = getOrFail(BindingContext.CONSTRUCTOR, ktConstructor).containingDeclaration as ClassDescriptor
irBlockBody.statements.add(
IrInstanceInitializerCallImpl(
ktConstructor.startOffset, ktConstructor.endOffset,
ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset,
context.symbolTable.referenceClass(classDescriptor),
context.irBuiltIns.unitType
)
@@ -239,7 +240,7 @@ class BodyGenerator(
if (ktSuperTypeListEntry is KtSuperTypeCallEntry) {
val superConstructorCall = statementGenerator.pregenerateCall(getResolvedCall(ktSuperTypeListEntry)!!)
val irSuperConstructorCall = CallGenerator(statementGenerator).generateDelegatingConstructorCall(
ktSuperTypeListEntry.startOffset, ktSuperTypeListEntry.endOffset, superConstructorCall
ktSuperTypeListEntry.startOffsetSkippingComments, ktSuperTypeListEntry.endOffset, superConstructorCall
)
irBlockBody.statements.add(irSuperConstructorCall)
return
@@ -278,7 +279,7 @@ class BodyGenerator(
val enumConstructor = context.builtIns.enum.constructors.single()
irBlockBody.statements.add(
IrEnumConstructorCallImpl(
ktElement.startOffset, ktElement.endOffset,
ktElement.startOffsetSkippingComments, ktElement.endOffset,
context.irBuiltIns.unitType,
context.symbolTable.referenceConstructor(enumConstructor),
1 // kotlin.Enum<T> has a single type parameter
@@ -296,7 +297,7 @@ class BodyGenerator(
if (ktEnumEntry.declarations.isNotEmpty()) {
val enumEntryConstructor = enumEntryDescriptor.unsubstitutedPrimaryConstructor!!
return IrEnumConstructorCallImpl(
ktEnumEntry.startOffset, ktEnumEntry.endOffset,
ktEnumEntry.startOffsetSkippingComments, ktEnumEntry.endOffset,
context.irBuiltIns.unitType,
context.symbolTable.referenceConstructor(enumEntryConstructor),
0 // enums can't be generic
@@ -328,7 +329,7 @@ class BodyGenerator(
ktEnumEntry: KtEnumEntry
) =
CallGenerator(this).generateEnumConstructorSuperCall(
ktEnumEntry.startOffset, ktEnumEntry.endOffset,
ktEnumEntry.startOffsetSkippingComments, ktEnumEntry.endOffset,
pregenerateCall(constructorCall)
)
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrNull
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.deparenthesize
import org.jetbrains.kotlin.psi2ir.intermediate.defaultLoad
import org.jetbrains.kotlin.resolve.BindingContext
@@ -71,12 +71,12 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
): IrWhen {
if (irBranches.size == 1) {
val irBranch0 = irBranches[0]
return buildStatement(ktIf.startOffset, ktIf.endOffset) {
return buildStatement(ktIf.startOffsetSkippingComments, ktIf.endOffset) {
irIfThenMaybeElse(resultType, irBranch0.condition, irBranch0.result, irElseResult)
}
}
val irWhen = IrWhenImpl(ktIf.startOffset, ktIf.endOffset, resultType, IrStatementOrigin.WHEN)
val irWhen = IrWhenImpl(ktIf.startOffsetSkippingComments, ktIf.endOffset, resultType, IrStatementOrigin.WHEN)
irWhen.branches.addAll(irBranches)
@@ -108,7 +108,7 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
else -> context.irBuiltIns.unitType
}
val irWhen = IrWhenImpl(expression.startOffset, expression.endOffset, resultType, IrStatementOrigin.WHEN)
val irWhen = IrWhenImpl(expression.startOffsetSkippingComments, expression.endOffset, resultType, IrStatementOrigin.WHEN)
for (ktEntry in expression.entries) {
if (ktEntry.isElse) {
@@ -169,16 +169,16 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
private fun generateWhenBody(expression: KtWhenExpression, irSubject: IrVariable?, irWhen: IrWhen): IrExpression =
if (irSubject == null) {
if (irWhen.branches.isEmpty())
IrBlockImpl(expression.startOffset, expression.endOffset, context.irBuiltIns.unitType, IrStatementOrigin.WHEN)
IrBlockImpl(expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.unitType, IrStatementOrigin.WHEN)
else
irWhen
} else {
if (irWhen.branches.isEmpty()) {
val irBlock = IrBlockImpl(expression.startOffset, expression.endOffset, context.irBuiltIns.unitType, IrStatementOrigin.WHEN)
val irBlock = IrBlockImpl(expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.unitType, IrStatementOrigin.WHEN)
irBlock.statements.add(irSubject)
irBlock
} else {
val irBlock = IrBlockImpl(expression.startOffset, expression.endOffset, irWhen.type, IrStatementOrigin.WHEN)
val irBlock = IrBlockImpl(expression.startOffsetSkippingComments, expression.endOffset, irWhen.type, IrStatementOrigin.WHEN)
irBlock.statements.add(irSubject)
irBlock.statements.add(irWhen)
irBlock
@@ -206,7 +206,7 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
val irTypeOperand = typeOperand.toIrType()
val typeSymbol = irTypeOperand.classifierOrNull ?: throw AssertionError("Not a classifier type: $typeOperand")
val irInstanceOf = IrTypeOperatorCallImpl(
ktCondition.startOffset, ktCondition.endOffset,
ktCondition.startOffsetSkippingComments, ktCondition.endOffset,
context.irBuiltIns.booleanType,
IrTypeOperator.INSTANCEOF,
irTypeOperand, typeSymbol,
@@ -214,7 +214,7 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
)
return if (ktCondition.isNegated)
IrUnaryPrimitiveImpl(
ktCondition.startOffset, ktCondition.endOffset,
ktCondition.startOffsetSkippingComments, ktCondition.endOffset,
context.irBuiltIns.booleanType,
IrStatementOrigin.EXCL, context.irBuiltIns.booleanNotSymbol,
irInstanceOf
@@ -233,7 +233,7 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
irInCall
IrStatementOrigin.NOT_IN ->
IrUnaryPrimitiveImpl(
ktCondition.startOffset, ktCondition.endOffset,
ktCondition.startOffsetSkippingComments, ktCondition.endOffset,
context.irBuiltIns.booleanType,
IrStatementOrigin.EXCL, context.irBuiltIns.booleanNotSymbol,
irInCall
@@ -246,7 +246,7 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta
val ktExpression = ktCondition.expression
val irExpression = ktExpression!!.genExpr()
return OperatorExpressionGenerator(statementGenerator).generateEquality(
ktCondition.startOffset, ktCondition.endOffset, IrStatementOrigin.EQEQ,
ktCondition.startOffsetSkippingComments, ktCondition.endOffset, IrStatementOrigin.EQEQ,
irSubject.defaultLoad(), irExpression,
context.bindingContext[BindingContext.PRIMITIVE_NUMERIC_COMPARISON_INFO, ktExpression]
)
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.intermediate.*
import org.jetbrains.kotlin.psi2ir.unwrappedGetMethod
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
@@ -260,7 +260,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
}
fun CallGenerator.generateCall(ktElement: KtElement, call: CallBuilder, origin: IrStatementOrigin? = null) =
generateCall(ktElement.startOffset, ktElement.endOffset, call, origin)
generateCall(ktElement.startOffsetSkippingComments, ktElement.endOffset, call, origin)
fun CallGenerator.generateCall(irExpression: IrExpression, call: CallBuilder, origin: IrStatementOrigin? = null) =
generateCall(irExpression.startOffset, irExpression.endOffset, call, origin)
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.psi.KtPureClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset
import org.jetbrains.kotlin.psi.psiUtil.pureStartOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi.synthetics.SyntheticClassOrObjectDescriptor
import org.jetbrains.kotlin.psi.synthetics.findClassDescriptor
import org.jetbrains.kotlin.resolve.BindingContext
@@ -141,7 +141,7 @@ class ClassGenerator(
?: throw AssertionError("Unexpected supertype constructor for delegation: $superTypeConstructorDescriptor")
val delegateDescriptor = IrImplementingDelegateDescriptorImpl(irClass.descriptor, delegateType, superType)
val irDelegateField = context.symbolTable.declareField(
ktDelegateExpression.startOffset, ktDelegateExpression.endOffset,
ktDelegateExpression.startOffsetSkippingComments, ktDelegateExpression.endOffset,
IrDeclarationOrigin.DELEGATE,
delegateDescriptor, delegateDescriptor.type.toIrType(),
createBodyGenerator(irClass.symbol).generateExpressionBody(ktDelegateExpression)
@@ -385,7 +385,7 @@ class ClassGenerator(
fun generateEnumEntry(ktEnumEntry: KtEnumEntry): IrEnumEntry {
val enumEntryDescriptor = getOrFail(BindingContext.CLASS, ktEnumEntry)
return context.symbolTable.declareEnumEntry(
ktEnumEntry.startOffset,
ktEnumEntry.startOffsetSkippingComments,
ktEnumEntry.endOffset,
IrDeclarationOrigin.DEFINED,
enumEntryDescriptor
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.withScope
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.endOffsetOrUndefined
import org.jetbrains.kotlin.psi2ir.pureEndOffsetOrUndefined
import org.jetbrains.kotlin.psi2ir.pureStartOffsetOrUndefined
@@ -53,7 +53,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
generateTypeAliasDeclaration(ktDeclaration)
else ->
IrErrorDeclarationImpl(
ktDeclaration.startOffset, ktDeclaration.endOffset,
ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset,
getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktDeclaration)
)
}
@@ -82,7 +82,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
private fun generateTypeAliasDeclaration(ktDeclaration: KtTypeAlias): IrDeclaration =
IrTypeAliasImpl(
ktDeclaration.startOffset, ktDeclaration.endOffset, IrDeclarationOrigin.DEFINED,
ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset, IrDeclarationOrigin.DEFINED,
getOrFail(BindingContext.TYPE_ALIAS, ktDeclaration)
)
@@ -39,7 +39,7 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtPropertyDelegate
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.intermediate.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.KotlinType
@@ -56,7 +56,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val kPropertyType = getKPropertyTypeForDelegatedProperty(propertyDescriptor)
val irProperty = IrPropertyImpl(
ktProperty.startOffset, ktProperty.endOffset, IrDeclarationOrigin.DEFINED,
ktProperty.startOffsetSkippingComments, ktProperty.endOffset, IrDeclarationOrigin.DEFINED,
isDelegated = true,
descriptor = propertyDescriptor
).apply {
@@ -97,7 +97,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
generateBody: (IrFunction) -> IrBody
): IrSimpleFunction =
context.symbolTable.declareSimpleFunctionWithOverrides(
ktDelegate.startOffset, ktDelegate.endOffset,
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset,
IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR,
accessorDescriptor
).buildWithScope { irAccessor ->
@@ -125,7 +125,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val delegateDescriptor = createPropertyDelegateDescriptor(propertyDescriptor, delegateType, kPropertyType)
return context.symbolTable.declareField(
ktDelegate.startOffset, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATE,
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATE,
delegateDescriptor, delegateDescriptor.type.toIrType()
).also { irDelegate ->
irDelegate.initializer = generateInitializerBodyForPropertyDelegate(
@@ -152,7 +152,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
provideDelegateCall.setExplicitReceiverValue(OnceExpressionValue(irDelegateInitializer.expression))
provideDelegateCall.irValueArgumentsByIndex[1] = createCallableReference(ktDelegate, kPropertyType, property, scopeOwner)
val irProvideDelegate =
CallGenerator(statementGenerator).generateCall(ktDelegate.startOffset, ktDelegate.endOffset, provideDelegateCall)
CallGenerator(statementGenerator).generateCall(ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset, provideDelegateCall)
return IrExpressionBodyImpl(irProvideDelegate)
}
@@ -164,7 +164,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val thisValue = createThisValueForDelegate(thisClass, ktDelegate)
return BackingFieldLValue(
context,
ktDelegate.startOffset, ktDelegate.endOffset,
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset,
irDelegateField.descriptor.type.toIrType(),
irDelegateField,
thisValue,
@@ -177,7 +177,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
generateExpressionValue(it.thisAsReceiverParameter.type.toIrType()) {
val thisAsReceiverParameter = thisClass.thisAsReceiverParameter
IrGetValueImpl(
ktDelegate.startOffset, ktDelegate.endOffset,
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset,
thisAsReceiverParameter.type.toIrType(),
context.symbolTable.referenceValueParameter(thisAsReceiverParameter)
)
@@ -191,7 +191,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
statementGenerator: StatementGenerator
): IrCallableReference =
ReflectionReferencesGenerator(statementGenerator).generateCallableReference(
ktElement.startOffset, ktElement.endOffset, type,
ktElement.startOffsetSkippingComments, ktElement.endOffset, type,
referencedDescriptor,
null, IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE
)
@@ -215,7 +215,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
scopeOwner: IrSymbol
): IrLocalDelegatedPropertyReference =
ReflectionReferencesGenerator(createBodyGenerator(scopeOwner).createStatementGenerator()).generateLocalDelegatedPropertyReference(
ktElement.startOffset, ktElement.endOffset,
ktElement.startOffsetSkippingComments, ktElement.endOffset,
type, variableDescriptor, irDelegateSymbol,
IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE
)
@@ -229,7 +229,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val kPropertyType = getKPropertyTypeForLocalDelegatedProperty(variableDescriptor)
val irLocalDelegatedProperty = IrLocalDelegatedPropertyImpl(
ktProperty.startOffset, ktProperty.endOffset, IrDeclarationOrigin.DEFINED,
ktProperty.startOffsetSkippingComments, ktProperty.endOffset, IrDeclarationOrigin.DEFINED,
variableDescriptor,
variableDescriptor.type.toIrType()
).apply {
@@ -280,7 +280,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val delegateDescriptor = createLocalPropertyDelegatedDescriptor(variableDescriptor, delegateType, kPropertyType)
return context.symbolTable.declareVariable(
ktDelegate.startOffset, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATE,
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATE,
delegateDescriptor, delegateDescriptor.type.toIrType()
).also { irVariable ->
irVariable.initializer = generateInitializerForLocalDelegatedPropertyDelegate(
@@ -323,11 +323,11 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
createLocalDelegatedPropertyReference(ktDelegate, kPropertyType, variableDescriptor, delegateSymbol, scopeOwner)
}
return CallGenerator(statementGenerator).generateCall(ktDelegate.startOffset, ktDelegate.endOffset, provideDelegateCall)
return CallGenerator(statementGenerator).generateCall(ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset, provideDelegateCall)
}
private fun createVariableValueForDelegate(irDelegate: IrVariableSymbol, ktDelegate: KtPropertyDelegate) =
VariableLValue(context, ktDelegate.startOffset, ktDelegate.endOffset, irDelegate, irDelegate.descriptor.type.toIrType())
VariableLValue(context, ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset, irDelegate, irDelegate.descriptor.type.toIrType())
private inline fun createLocalPropertyAccessor(
getterDescriptor: VariableAccessorDescriptor,
@@ -335,7 +335,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
generateBody: (IrFunction) -> IrBody
) =
context.symbolTable.declareSimpleFunctionWithOverrides(
ktDelegate.startOffset, ktDelegate.endOffset,
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset,
IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR,
getterDescriptor
).buildWithScope { irAccessor ->
@@ -369,7 +369,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
irPropertyReference: IrCallableReference
): IrBody =
with(createBodyGenerator(irGetter.symbol)) {
val startOffset = ktDelegate.startOffset
val startOffset = ktDelegate.startOffsetSkippingComments
val endOffset = ktDelegate.endOffset
irBlockBody(startOffset, endOffset) {
val statementGenerator = createStatementGenerator()
@@ -394,7 +394,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
delegateReceiverValue: IntermediateValue,
irPropertyReference: IrCallableReference
): IrBody = with(createBodyGenerator(irSetter.symbol)) {
val startOffset = ktDelegate.startOffset
val startOffset = ktDelegate.startOffsetSkippingComments
val endOffset = ktDelegate.endOffset
irBlockBody(startOffset, endOffset) {
val statementGenerator = createStatementGenerator()
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrErrorCallExpressionImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.types.ErrorUtils
class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
@@ -41,7 +41,7 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme
else
ErrorUtils.createErrorType("")
IrErrorExpressionImpl(
ktElement.startOffset, ktElement.endOffset,
ktElement.startOffsetSkippingComments, ktElement.endOffset,
errorExpressionType.toIrType(),
e.message ?: ""
)
@@ -50,7 +50,7 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme
fun generateErrorCall(ktCall: KtCallExpression): IrExpression = generateErrorExpression(ktCall) {
val type = getErrorExpressionType(ktCall).toIrType()
val irErrorCall = IrErrorCallExpressionImpl(ktCall.startOffset, ktCall.endOffset, type, "") // TODO problem description?
val irErrorCall = IrErrorCallExpressionImpl(ktCall.startOffsetSkippingComments, ktCall.endOffset, type, "") // TODO problem description?
irErrorCall.explicitReceiver = (ktCall.parent as? KtDotQualifiedExpression)?.run {
receiverExpression.genExpr()
}
@@ -71,7 +71,7 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme
fun generateErrorSimpleName(ktName: KtSimpleNameExpression): IrExpression = generateErrorExpression(ktName) {
val type = getErrorExpressionType(ktName).toIrType()
val irErrorCall = IrErrorCallExpressionImpl(ktName.startOffset, ktName.endOffset, type, "") // TODO problem description?
val irErrorCall = IrErrorCallExpressionImpl(ktName.startOffsetSkippingComments, ktName.endOffset, type, "") // TODO problem description?
irErrorCall.explicitReceiver = (ktName.parent as? KtDotQualifiedExpression)?.let { ktParent ->
if (ktParent.receiverExpression == ktName) null
else ktParent.receiverExpression.genExpr()
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset
import org.jetbrains.kotlin.psi.psiUtil.pureStartOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
@@ -144,7 +144,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
): IrBlockBody {
val property = getter.correspondingProperty
val startOffset = ktProperty.startOffset
val startOffset = ktProperty.startOffsetSkippingComments
val endOffset = ktProperty.endOffset
val irBody = IrBlockBodyImpl(startOffset, endOffset)
@@ -172,7 +172,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
): IrBlockBody {
val property = setter.correspondingProperty
val startOffset = ktProperty.startOffset
val startOffset = ktProperty.startOffsetSkippingComments
val endOffset = ktProperty.endOffset
val irBody = IrBlockBodyImpl(startOffset, endOffset)
@@ -197,7 +197,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
is ClassDescriptor -> {
val thisAsReceiverParameter = containingDeclaration.thisAsReceiverParameter
IrGetValueImpl(
ktProperty.startOffset, ktProperty.endOffset,
ktProperty.startOffsetSkippingComments, ktProperty.endOffset,
thisAsReceiverParameter.type.toIrType(),
context.symbolTable.referenceValue(thisAsReceiverParameter)
)
@@ -23,11 +23,11 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtObjectLiteralExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class LocalClassGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateObjectLiteral(ktObjectLiteral: KtObjectLiteralExpression): IrStatement {
val startOffset = ktObjectLiteral.startOffset
val startOffset = ktObjectLiteral.startOffsetSkippingComments
val endOffset = ktObjectLiteral.endOffset
val objectLiteralType = getInferredTypeWithImplicitCastsOrFail(ktObjectLiteral).toIrType()
val irBlock = IrBlockImpl(startOffset, endOffset, objectLiteralType, IrStatementOrigin.OBJECT_LITERAL)
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
import org.jetbrains.kotlin.psi.KtLambdaExpression
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class LocalFunctionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateLambda(ktLambda: KtLambdaExpression): IrStatement {
@@ -50,14 +50,14 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
} else {
// anonymous function expression
val funExpressionType = getInferredTypeWithImplicitCastsOrFail(ktFun).toIrType()
val irBlock = IrBlockImpl(ktFun.startOffset, ktFun.endOffset, funExpressionType, IrStatementOrigin.ANONYMOUS_FUNCTION)
val irBlock = IrBlockImpl(ktFun.startOffsetSkippingComments, ktFun.endOffset, funExpressionType, IrStatementOrigin.ANONYMOUS_FUNCTION)
val irFun = generateFunctionDeclaration(ktFun)
irBlock.statements.add(irFun)
irBlock.statements.add(
IrFunctionReferenceImpl(
ktFun.startOffset, ktFun.endOffset, funExpressionType,
ktFun.startOffsetSkippingComments, ktFun.endOffset, funExpressionType,
irFun.symbol, irFun.symbol.descriptor, 0,
IrStatementOrigin.ANONYMOUS_FUNCTION
)
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.intermediate.VariableLValue
import org.jetbrains.kotlin.psi2ir.intermediate.setExplicitReceiverValue
import org.jetbrains.kotlin.resolve.BindingContext
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
class LoopExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateWhileLoop(ktWhile: KtWhileExpression): IrExpression {
val irLoop = IrWhileLoopImpl(
ktWhile.startOffset, ktWhile.endOffset,
ktWhile.startOffsetSkippingComments, ktWhile.endOffset,
context.irBuiltIns.unitType, IrStatementOrigin.WHILE_LOOP
)
@@ -54,7 +54,7 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
fun generateDoWhileLoop(ktDoWhile: KtDoWhileExpression): IrExpression {
val irLoop = IrDoWhileLoopImpl(
ktDoWhile.startOffset, ktDoWhile.endOffset,
ktDoWhile.startOffsetSkippingComments, ktDoWhile.endOffset,
context.irBuiltIns.unitType, IrStatementOrigin.DO_WHILE_LOOP
)
@@ -71,21 +71,21 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
irLoop.label = getLoopLabel(ktDoWhile)
return IrBlockImpl(ktDoWhile.startOffset, ktDoWhile.endOffset, context.irBuiltIns.unitType).apply {
return IrBlockImpl(ktDoWhile.startOffsetSkippingComments, ktDoWhile.endOffset, context.irBuiltIns.unitType).apply {
statements.add(irLoop)
}
}
private fun generateWhileLoopBody(ktLoopBody: KtBlockExpression): IrExpression =
IrBlockImpl(
ktLoopBody.startOffset, ktLoopBody.endOffset, context.irBuiltIns.unitType, null,
ktLoopBody.startOffsetSkippingComments, ktLoopBody.endOffset, context.irBuiltIns.unitType, null,
ktLoopBody.statements.map { it.genStmt() }
)
private fun generateDoWhileLoopBody(ktLoopBody: KtBlockExpression): IrExpression =
IrCompositeImpl(
ktLoopBody.startOffset, ktLoopBody.endOffset, context.irBuiltIns.unitType, null,
ktLoopBody.startOffsetSkippingComments, ktLoopBody.endOffset, context.irBuiltIns.unitType, null,
ktLoopBody.statements.map { it.genStmt() }
)
@@ -93,7 +93,7 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
val parentLoop = findParentLoop(ktBreak) ?: return ErrorExpressionGenerator(statementGenerator).generateErrorExpression(
ktBreak, RuntimeException("Loop not found for break expression: ${ktBreak.text}")
)
return IrBreakImpl(ktBreak.startOffset, ktBreak.endOffset, context.irBuiltIns.nothingType, parentLoop).apply {
return IrBreakImpl(ktBreak.startOffsetSkippingComments, ktBreak.endOffset, context.irBuiltIns.nothingType, parentLoop).apply {
label = ktBreak.getLabelName()
}
}
@@ -102,7 +102,7 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
val parentLoop = findParentLoop(ktContinue) ?: return ErrorExpressionGenerator(statementGenerator).generateErrorExpression(
ktContinue, RuntimeException("Loop not found for continue expression: ${ktContinue.text}")
)
return IrContinueImpl(ktContinue.startOffset, ktContinue.endOffset, context.irBuiltIns.nothingType, parentLoop).apply {
return IrContinueImpl(ktContinue.startOffsetSkippingComments, ktContinue.endOffset, context.irBuiltIns.nothingType, parentLoop).apply {
label = ktContinue.getLabelName()
}
}
@@ -154,7 +154,7 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
val callGenerator = CallGenerator(statementGenerator)
val startOffset = ktFor.startOffset
val startOffset = ktFor.startOffsetSkippingComments
val endOffset = ktFor.endOffset
val irForBlock = IrBlockImpl(startOffset, endOffset, context.irBuiltIns.unitType, IrStatementOrigin.FOR_LOOP)
@@ -185,7 +185,7 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
if (ktLoopParameter != null && ktLoopDestructuringDeclaration == null) {
val loopParameter = getOrFail(BindingContext.VALUE_PARAMETER, ktLoopParameter)
context.symbolTable.declareVariable(
ktLoopParameter.startOffset, ktLoopParameter.endOffset, IrDeclarationOrigin.FOR_LOOP_VARIABLE,
ktLoopParameter.startOffsetSkippingComments, ktLoopParameter.endOffset, IrDeclarationOrigin.FOR_LOOP_VARIABLE,
loopParameter, loopParameter.type.toIrType(),
irNextCall
)
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.containsNull
import org.jetbrains.kotlin.psi2ir.findSingleFunction
import org.jetbrains.kotlin.psi2ir.intermediate.safeCallOnDispatchReceiver
@@ -52,7 +52,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
private fun createErrorExpression(ktExpression: KtExpression, text: String) =
IrErrorExpressionImpl(
ktExpression.startOffset,
ktExpression.startOffsetSkippingComments,
ktExpression.endOffset,
context.irBuiltIns.nothingType,
text
@@ -103,7 +103,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
}
return IrTypeOperatorCallImpl(
expression.startOffset, expression.endOffset, resultType.toIrType(), irOperator, rhsType.toIrType(),
expression.startOffsetSkippingComments, expression.endOffset, resultType.toIrType(), irOperator, rhsType.toIrType(),
context.symbolTable.referenceClassifier(rhsType.constructor.declarationDescriptor!!),
expression.left.genExpr()
)
@@ -115,7 +115,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
val againstType = getOrFail(BindingContext.TYPE, expression.typeReference)
return IrTypeOperatorCallImpl(
expression.startOffset, expression.endOffset, context.irBuiltIns.booleanType, irOperator,
expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.booleanType, irOperator,
againstType.toIrType(),
context.symbolTable.referenceClassifier(againstType.constructor.declarationDescriptor!!),
expression.leftHandSide.genExpr()
@@ -151,7 +151,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
val irArgument0 = expression.left!!.genExpr()
val irArgument1 = expression.right!!.genExpr()
return irBlock(expression.startOffset, expression.endOffset, IrStatementOrigin.ELVIS, resultType) {
return irBlock(expression.startOffsetSkippingComments, expression.endOffset, IrStatementOrigin.ELVIS, resultType) {
val temporary = irTemporary(irArgument0, "elvis_lhs")
+irIfNull(
resultType,
@@ -167,9 +167,9 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
val irArgument1 = expression.right!!.genExpr()
return when (irOperator) {
IrStatementOrigin.OROR ->
context.oror(expression.startOffset, expression.endOffset, irArgument0, irArgument1)
context.oror(expression.startOffsetSkippingComments, expression.endOffset, irArgument0, irArgument1)
IrStatementOrigin.ANDAND ->
context.andand(expression.startOffset, expression.endOffset, irArgument0, irArgument1)
context.andand(expression.startOffsetSkippingComments, expression.endOffset, irArgument0, irArgument1)
else ->
throw AssertionError("Unexpected binary boolean operator $irOperator")
}
@@ -185,7 +185,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
irContainsCall
IrStatementOrigin.NOT_IN ->
IrUnaryPrimitiveImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
context.irBuiltIns.booleanType,
IrStatementOrigin.NOT_IN,
context.irBuiltIns.booleanNotSymbol,
@@ -202,7 +202,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
val irArgument1 = expression.right!!.genExpr()
val irIdentityEquals = IrBinaryPrimitiveImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
context.irBuiltIns.booleanType,
irOperator,
context.irBuiltIns.eqeqeqSymbol,
@@ -214,7 +214,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
irIdentityEquals
IrStatementOrigin.EXCLEQEQ ->
IrUnaryPrimitiveImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
context.irBuiltIns.booleanType,
IrStatementOrigin.EXCLEQEQ,
context.irBuiltIns.booleanNotSymbol,
@@ -241,7 +241,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
?: context.irBuiltIns.eqeqSymbol
val irEquals = IrBinaryPrimitiveImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
context.irBuiltIns.booleanType,
irOperator,
eqeqSymbol,
@@ -254,7 +254,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
irEquals
IrStatementOrigin.EXCLEQ ->
IrUnaryPrimitiveImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
context.irBuiltIns.booleanType,
IrStatementOrigin.EXCLEQ,
context.irBuiltIns.booleanNotSymbol,
@@ -354,7 +354,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
}
private fun generateComparisonOperator(expression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression {
val startOffset = expression.startOffset
val startOffset = expression.startOffsetSkippingComments
val endOffset = expression.endOffset
val comparisonInfo = getPrimitiveNumericComparisonInfo(expression)
@@ -403,7 +403,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
val resultType = irArgument.type.makeNotNull()
return irBlock(ktOperator.startOffset, ktOperator.endOffset, origin, resultType) {
return irBlock(ktOperator.startOffsetSkippingComments, ktOperator.endOffset, origin, resultType) {
val temporary = irTemporary(irArgument, "notnull")
+irIfNull(
resultType,
@@ -26,9 +26,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.util.declareFieldWithOverrides
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi2ir.pureEndOffsetOrUndefined
import org.jetbrains.kotlin.psi2ir.pureStartOffsetOrUndefined
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.hasBackingField
@@ -47,7 +47,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
val irPropertyType = propertyDescriptor.type.toIrType()
return IrPropertyImpl(
ktParameter.startOffset, ktParameter.endOffset,
ktParameter.startOffsetSkippingComments, ktParameter.endOffset,
IrDeclarationOrigin.DEFINED, false,
propertyDescriptor
).also { irProperty ->
@@ -55,7 +55,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
generatePropertyBackingField(ktParameter, propertyDescriptor) {
IrExpressionBodyImpl(
IrGetValueImpl(
ktParameter.startOffset, ktParameter.endOffset,
ktParameter.startOffsetSkippingComments, ktParameter.endOffset,
irPropertyType,
irValueParameter.symbol,
IrStatementOrigin.INITIALIZE_PROPERTY_FROM_PARAMETER
@@ -83,7 +83,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
generateInitializer: (IrField) -> IrExpressionBody?
): IrField =
context.symbolTable.declareField(
ktPropertyElement.startOffset, ktPropertyElement.endOffset,
ktPropertyElement.startOffsetSkippingComments, ktPropertyElement.endOffset,
IrDeclarationOrigin.PROPERTY_BACKING_FIELD,
propertyDescriptor, propertyDescriptor.type.toIrType()
).also {
@@ -101,7 +101,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
private fun generateSimpleProperty(ktProperty: KtProperty, propertyDescriptor: PropertyDescriptor): IrProperty =
IrPropertyImpl(
ktProperty.startOffset, ktProperty.endOffset,
ktProperty.startOffsetSkippingComments, ktProperty.endOffset,
IrDeclarationOrigin.DEFINED,
false,
propertyDescriptor
@@ -114,7 +114,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
if (propertyDescriptor.isConst && compileTimeConst != null)
IrExpressionBodyImpl(
context.constantValueGenerator.generateConstantValueAsExpression(
ktInitializer.startOffset, ktInitializer.endOffset,
ktInitializer.startOffsetSkippingComments, ktInitializer.endOffset,
compileTimeConst
)
)
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
import org.jetbrains.kotlin.psi.KtClassLiteralExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor
import org.jetbrains.kotlin.types.KotlinType
@@ -41,7 +41,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
return if (lhs is DoubleColonLHS.Expression && !lhs.isObjectQualifier) {
IrGetClassImpl(
ktClassLiteral.startOffset, ktClassLiteral.endOffset, resultType,
ktClassLiteral.startOffsetSkippingComments, ktClassLiteral.endOffset, resultType,
ktArgument.genExpr()
)
} else {
@@ -49,7 +49,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
val typeClass = typeConstructorDeclaration
?: throw AssertionError("Unexpected type constructor for ${lhs.type}: $typeConstructorDeclaration")
IrClassReferenceImpl(
ktClassLiteral.startOffset, ktClassLiteral.endOffset, resultType,
ktClassLiteral.startOffsetSkippingComments, ktClassLiteral.endOffset, resultType,
context.symbolTable.referenceClassifier(typeClass), lhs.type.toIrType()
)
}
@@ -62,7 +62,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
val descriptorImportedFromObject = resultingDescriptor as? ImportedFromObjectCallableDescriptor<*>
val referencedDescriptor = descriptorImportedFromObject?.callableFromObject ?: resultingDescriptor
val startOffset = ktCallableReference.startOffset
val startOffset = ktCallableReference.startOffsetSkippingComments
val endOffset = ktCallableReference.endOffset
return statementGenerator.generateCallReceiver(
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.deparenthesize
import org.jetbrains.kotlin.psi2ir.intermediate.IntermediateValue
import org.jetbrains.kotlin.psi2ir.intermediate.createTemporaryVariableInBlock
@@ -81,7 +81,7 @@ class StatementGenerator(
override fun visitExpression(expression: KtExpression, data: Nothing?): IrStatement =
IrErrorExpressionImpl(
expression.startOffset,
expression.startOffsetSkippingComments,
expression.endOffset,
context.irBuiltIns.nothingType,
expression::class.java.simpleName
@@ -98,7 +98,7 @@ class StatementGenerator(
}
return context.symbolTable.declareVariable(
property.startOffset, property.endOffset, IrDeclarationOrigin.DEFINED,
property.startOffsetSkippingComments, property.endOffset, IrDeclarationOrigin.DEFINED,
variableDescriptor,
variableDescriptor.type.toIrType(),
property.initializer?.genExpr()
@@ -116,7 +116,7 @@ class StatementGenerator(
override fun visitDestructuringDeclaration(multiDeclaration: KtDestructuringDeclaration, data: Nothing?): IrStatement {
val irBlock = IrCompositeImpl(
multiDeclaration.startOffset, multiDeclaration.endOffset,
multiDeclaration.startOffsetSkippingComments, multiDeclaration.endOffset,
context.irBuiltIns.unitType, IrStatementOrigin.DESTRUCTURING_DECLARATION
)
val ktInitializer = multiDeclaration.initializer!!
@@ -145,11 +145,11 @@ class StatementGenerator(
if (componentVariable.name.isSpecial) continue
val irComponentCall = callGenerator.generateCall(
ktEntry.startOffset, ktEntry.endOffset, componentSubstitutedCall,
ktEntry.startOffsetSkippingComments, ktEntry.endOffset, componentSubstitutedCall,
IrStatementOrigin.COMPONENT_N.withIndex(index + 1)
)
val irComponentVar = context.symbolTable.declareVariable(
ktEntry.startOffset, ktEntry.endOffset, IrDeclarationOrigin.DEFINED,
ktEntry.startOffsetSkippingComments, ktEntry.endOffset, IrDeclarationOrigin.DEFINED,
componentVariable, componentVariable.type.toIrType(), irComponentCall
)
irBlock.statements.add(irComponentVar)
@@ -161,7 +161,7 @@ class StatementGenerator(
if (isBlockBody) throw AssertionError("Use IrBlockBody and corresponding body generator to generate blocks as function bodies")
val returnType = getInferredTypeWithImplicitCasts(expression) ?: context.builtIns.unitType
val irBlock = IrBlockImpl(expression.startOffset, expression.endOffset, returnType.toIrType())
val irBlock = IrBlockImpl(expression.startOffsetSkippingComments, expression.endOffset, returnType.toIrType())
expression.statements.forEach {
irBlock.statements.add(it.genStmt())
@@ -173,11 +173,11 @@ class StatementGenerator(
override fun visitReturnExpression(expression: KtReturnExpression, data: Nothing?): IrStatement {
val returnTarget = getReturnExpressionTarget(expression)
val irReturnedExpression = expression.returnedExpression?.genExpr() ?: IrGetObjectValueImpl(
expression.startOffset, expression.endOffset, context.irBuiltIns.unitType,
expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.unitType,
context.symbolTable.referenceClass(context.builtIns.unit)
)
return IrReturnImpl(
expression.startOffset, expression.endOffset, context.irBuiltIns.nothingType,
expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.nothingType,
context.symbolTable.referenceFunction(returnTarget), irReturnedExpression
)
}
@@ -207,7 +207,7 @@ class StatementGenerator(
override fun visitThrowExpression(expression: KtThrowExpression, data: Nothing?): IrStatement {
return IrThrowImpl(
expression.startOffset,
expression.startOffsetSkippingComments,
expression.endOffset,
context.irBuiltIns.nothingType,
expression.thrownExpression!!.genExpr()
@@ -223,7 +223,7 @@ class StatementGenerator(
fun generateConstantExpression(expression: KtExpression, constant: CompileTimeConstant<*>): IrExpression =
context.constantValueGenerator.generateConstantValueAsExpression(
expression.startOffset,
expression.startOffsetSkippingComments,
expression.endOffset,
constant.toConstantValue(getInferredTypeWithImplicitCastsOrFail(expression))
)
@@ -237,20 +237,20 @@ class StatementGenerator(
if (irArg is IrConst<*> && irArg.kind == IrConstKind.String)
irArg
else
IrStringConcatenationImpl(expression.startOffset, expression.endOffset, resultType, listOf(irArg))
IrStringConcatenationImpl(expression.startOffsetSkippingComments, expression.endOffset, resultType, listOf(irArg))
}
0 ->
IrConstImpl.string(expression.startOffset, expression.endOffset, resultType, "")
IrConstImpl.string(expression.startOffsetSkippingComments, expression.endOffset, resultType, "")
else ->
IrStringConcatenationImpl(expression.startOffset, expression.endOffset, resultType, entries.map { it.genExpr() })
IrStringConcatenationImpl(expression.startOffsetSkippingComments, expression.endOffset, resultType, entries.map { it.genExpr() })
}
}
override fun visitLiteralStringTemplateEntry(entry: KtLiteralStringTemplateEntry, data: Nothing?): IrStatement =
IrConstImpl.string(entry.startOffset, entry.endOffset, context.irBuiltIns.stringType, entry.text)
IrConstImpl.string(entry.startOffsetSkippingComments, entry.endOffset, context.irBuiltIns.stringType, entry.text)
override fun visitEscapeStringTemplateEntry(entry: KtEscapeStringTemplateEntry, data: Nothing?): IrStatement =
IrConstImpl.string(entry.startOffset, entry.endOffset, context.irBuiltIns.stringType, entry.unescapedValue)
IrConstImpl.string(entry.startOffsetSkippingComments, entry.endOffset, context.irBuiltIns.stringType, entry.unescapedValue)
override fun visitStringTemplateEntryWithExpression(entry: KtStringTemplateEntryWithExpression, data: Nothing?): IrStatement =
entry.expression!!.genExpr()
@@ -283,7 +283,7 @@ class StatementGenerator(
resolvedCall: ResolvedCall<*>?
): IrExpression =
CallGenerator(this).generateValueReference(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
descriptor, resolvedCall, null
)
@@ -304,14 +304,14 @@ class StatementGenerator(
else
null
return CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall), origin)
return CallGenerator(this).generateCall(expression.startOffsetSkippingComments, expression.endOffset, pregenerateCall(resolvedCall), origin)
}
override fun visitArrayAccessExpression(expression: KtArrayAccessExpression, data: Nothing?): IrStatement {
val indexedGetCall = getOrFail(BindingContext.INDEXED_LVALUE_GET, expression)
return CallGenerator(this).generateCall(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
pregenerateCall(indexedGetCall), IrStatementOrigin.GET_ARRAY_ELEMENT
)
}
@@ -329,7 +329,7 @@ class StatementGenerator(
val thisAsReceiverParameter = referenceTarget.thisAsReceiverParameter
val thisType = thisAsReceiverParameter.type.toIrType()
IrGetValueImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
thisType,
context.symbolTable.referenceValueParameter(thisAsReceiverParameter)
)
@@ -339,7 +339,7 @@ class StatementGenerator(
val extensionReceiver = referenceTarget.extensionReceiverParameter ?: TODO("No extension receiver: $referenceTarget")
val extensionReceiverType = extensionReceiver.type.toIrType()
IrGetValueImpl(
expression.startOffset, expression.endOffset,
expression.startOffsetSkippingComments, expression.endOffset,
extensionReceiverType,
context.symbolTable.referenceValueParameter(extensionReceiver)
)
@@ -402,7 +402,7 @@ class StatementGenerator(
override fun visitTypeAlias(typeAlias: KtTypeAlias, data: Nothing?): IrStatement =
IrTypeAliasImpl(
typeAlias.startOffset, typeAlias.endOffset, IrDeclarationOrigin.DEFINED,
typeAlias.startOffsetSkippingComments, typeAlias.endOffset, IrDeclarationOrigin.DEFINED,
getOrFail(BindingContext.TYPE_ALIAS, typeAlias)
)
@@ -22,13 +22,13 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCatchImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl
import org.jetbrains.kotlin.psi.KtTryExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.resolve.BindingContext
class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateTryCatch(ktTry: KtTryExpression): IrExpression {
val resultType = getInferredTypeWithImplicitCastsOrFail(ktTry).toIrType()
val irTryCatch = IrTryImpl(ktTry.startOffset, ktTry.endOffset, resultType)
val irTryCatch = IrTryImpl(ktTry.startOffsetSkippingComments, ktTry.endOffset, resultType)
irTryCatch.tryResult = ktTry.tryBlock.genExpr()
@@ -38,9 +38,9 @@ class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : Stat
val catchParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktCatchParameter)
val irCatch = IrCatchImpl(
ktCatchClause.startOffset, ktCatchClause.endOffset,
ktCatchClause.startOffsetSkippingComments, ktCatchClause.endOffset,
context.symbolTable.declareVariable(
ktCatchParameter.startOffset, ktCatchParameter.endOffset,
ktCatchParameter.startOffsetSkippingComments, ktCatchParameter.endOffset,
IrDeclarationOrigin.CATCH_PARAMETER,
catchParameterDescriptor, catchParameterDescriptor.type.toIrType()
)
@@ -296,11 +296,18 @@ val PsiElement.endOffset: Int
get() = textRange.endOffset
val KtPureElement.pureStartOffset: Int
get() = psiOrParent.textRange.startOffset
get() = psiOrParent.textRangeWithoutComments.startOffset
val KtPureElement.pureEndOffset: Int
get() = psiOrParent.textRange.endOffset
get() = psiOrParent.textRangeWithoutComments.endOffset
val PsiElement.startOffsetSkippingComments: Int
get() {
if (!startsWithComment()) return startOffset // fastpath
val firstNonCommentChild = generateSequence(firstChild) { it.nextSibling }
.firstOrNull { it !is PsiWhiteSpace && it !is PsiComment }
return firstNonCommentChild?.startOffset ?: startOffset
}
fun PsiElement.getStartOffsetIn(ancestor: PsiElement): Int {
var offset = 0
@@ -357,10 +364,10 @@ private fun findFirstLeafWhollyInRange(file: PsiFile, range: TextRange): PsiElem
}
val PsiElement.textRangeWithoutComments: TextRange
get() {
val firstNonCommentChild = children.firstOrNull { it !is PsiWhiteSpace && it !is PsiComment } ?: return textRange
return TextRange(firstNonCommentChild.startOffset, endOffset)
}
get() = if (!startsWithComment()) textRange else TextRange(startOffsetSkippingComments, endOffset)
fun PsiElement.startsWithComment(): Boolean = firstChild is PsiComment
// ---------------------------------- Debug/logging ----------------------------------------------------------------------------------------
+34
View File
@@ -0,0 +1,34 @@
// One-line comment
class Foo {
// Several
// lines
// of
// oneline
// commentaries
inner class Inner /* comment for constructor */ private constructor(x: Int) {
/** dangling comment at the end of body*/
} // Comment for closing bracket
/*
very
long
multiline
comment
*/
protected open fun foo(y: Int) { // Comment for opening bracket
/* Comment for closing bracket */ }
/**
* Javadoc comment
*/
val x: Int = 42
// Comment for getter
get() = field + 1
// Dangling comment
fun test() {
foo(/* comment inside call */ 42)
}
}
+51
View File
@@ -0,0 +1,51 @@
@0:0..33:1 FILE fqName:<root> fileName:/comments.kt
@1:0..33:1 CLASS CLASS name:Foo modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
@1:0..33:1 VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Foo flags:
@1:0..33:1 CONSTRUCTOR visibility:public <> () returnType:Foo flags:primary
@1:0..33:1 BLOCK_BODY
@1:0..33:1 DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
@1:0..33:1 INSTANCE_INITIALIZER_CALL classDescriptor='Foo'
@8:4..10:36 CLASS CLASS name:Inner modality:FINAL visibility:public flags:inner superTypes:[kotlin.Any]
@8:4..10:36 VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Foo.Inner flags:
@8:4..10:36 CONSTRUCTOR visibility:private <> ($this:Foo, x:kotlin.Int) returnType:Foo.Inner flags:primary
@8:52..79 VALUE_PARAMETER name:<this> type:Foo flags:
@8:72..78 VALUE_PARAMETER name:x index:0 type:kotlin.Int flags:
@8:4..10:36 BLOCK_BODY
@8:4..10:36 DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
@8:4..10:36 INSTANCE_INITIALIZER_CALL classDescriptor='Inner'
@8:4..10:36 FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
@8:4..10:36 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@-1:-1..-1 VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
@8:4..10:36 FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
@8:4..10:36 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@8:4..10:36 FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
@8:4..10:36 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@18:4..20:39 FUN name:foo visibility:protected modality:OPEN <> ($this:Foo, y:kotlin.Int) returnType:kotlin.Unit flags:
@18:4..20:39 VALUE_PARAMETER name:<this> type:Foo flags:
@18:27..33 VALUE_PARAMETER name:y index:0 type:kotlin.Int flags:
@18:35..20:39 BLOCK_BODY
@25:4..27:25 PROPERTY name:x visibility:public modality:FINAL flags:val
@25:4..27:25 FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public flags:final
@25:17..19 EXPRESSION_BODY
@25:17..19 CONST Int type=kotlin.Int value=42
@27:8..25 FUN name:<get-x> visibility:public modality:FINAL <> ($this:Foo) returnType:kotlin.Int flags:
@27:8..25 VALUE_PARAMETER name:<this> type:Foo flags:
@27:16..25 BLOCK_BODY
@27:16..25 RETURN type=kotlin.Nothing from='<get-x>(): Int'
@27:16..25 CALL 'plus(Int): Int' type=kotlin.Int origin=PLUS
@27:16..21 GET_FIELD 'x: Int' type=kotlin.Int origin=null
@27:16..21 GET_VAR 'this@Foo: Foo' type=Foo origin=null
@27:24..25 CONST Int type=kotlin.Int value=1
@30:4..32:5 FUN name:test visibility:public modality:FINAL <> ($this:Foo) returnType:kotlin.Unit flags:
@30:4..32:5 VALUE_PARAMETER name:<this> type:Foo flags:
@30:15..32:5 BLOCK_BODY
@31:8..41 CALL 'foo(Int): Unit' type=kotlin.Unit origin=null
@31:8..41 GET_VAR 'this@Foo: Foo' type=Foo origin=null
@31:38..40 CONST Int type=kotlin.Int value=42
@1:0..33:1 FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
@1:0..33:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@-1:-1..-1 VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
@1:0..33:1 FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
@1:0..33:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@1:0..33:1 FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
@1:0..33:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
+16 -16
View File
@@ -1,24 +1,24 @@
@0:0..26:1 FILE fqName:<root> fileName:/kt17108.kt
@0:0..26:1 CLASS INTERFACE name:Boolean modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
@0:0..26:1 VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Boolean flags:
@5:4..8:38 FUN name:not visibility:public modality:ABSTRACT <> ($this:Boolean) returnType:Boolean flags:
@5:4..8:38 VALUE_PARAMETER name:<this> type:Boolean flags:
@10:4..13:42 FUN name:and visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:Boolean flags:
@10:4..13:42 VALUE_PARAMETER name:<this> type:Boolean flags:
@4:0..26:1 CLASS INTERFACE name:Boolean modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
@4:0..26:1 VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Boolean flags:
@8:4..38 FUN name:not visibility:public modality:ABSTRACT <> ($this:Boolean) returnType:Boolean flags:
@8:4..38 VALUE_PARAMETER name:<this> type:Boolean flags:
@13:4..42 FUN name:and visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:Boolean flags:
@13:4..42 VALUE_PARAMETER name:<this> type:Boolean flags:
@13:18..32 VALUE_PARAMETER name:other index:0 type:Boolean flags:
@15:4..18:41 FUN name:or visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:Boolean flags:
@15:4..18:41 VALUE_PARAMETER name:<this> type:Boolean flags:
@18:4..41 FUN name:or visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:Boolean flags:
@18:4..41 VALUE_PARAMETER name:<this> type:Boolean flags:
@18:17..31 VALUE_PARAMETER name:other index:0 type:Boolean flags:
@20:4..23:42 FUN name:xor visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:Boolean flags:
@20:4..23:42 VALUE_PARAMETER name:<this> type:Boolean flags:
@23:4..42 FUN name:xor visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:Boolean flags:
@23:4..42 VALUE_PARAMETER name:<this> type:Boolean flags:
@23:18..32 VALUE_PARAMETER name:other index:0 type:Boolean flags:
@25:4..38 FUN name:compareTo visibility:public modality:ABSTRACT <> ($this:Boolean, other:Boolean) returnType:kotlin.Int flags:
@25:4..38 VALUE_PARAMETER name:<this> type:Boolean flags:
@25:18..32 VALUE_PARAMETER name:other index:0 type:Boolean flags:
@0:0..26:1 FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
@0:0..26:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@4:0..26:1 FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
@4:0..26:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@-1:-1..-1 VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
@0:0..26:1 FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
@0:0..26:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@0:0..26:1 FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
@0:0..26:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@4:0..26:1 FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
@4:0..26:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@4:0..26:1 FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
@4:0..26:1 VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@@ -34,6 +34,11 @@ public class IrSourceRangesTestCaseGenerated extends AbstractIrSourceRangesTestC
runTest("compiler/testData/ir/sourceRanges/augmentedAssignmentWithExpression.kt");
}
@TestMetadata("comments.kt")
public void testComments() throws Exception {
runTest("compiler/testData/ir/sourceRanges/comments.kt");
}
@TestMetadata("kt17108.kt")
public void testKt17108() throws Exception {
runTest("compiler/testData/ir/sourceRanges/kt17108.kt");