diff --git a/native/swift/sir-passes/src/org/jetbrains/sir/passes/utility/DeclarationParentVisitor.kt b/native/swift/sir-passes/src/org/jetbrains/sir/passes/utility/DeclarationParentVisitor.kt index 18bc175b725..f5936bc939d 100644 --- a/native/swift/sir-passes/src/org/jetbrains/sir/passes/utility/DeclarationParentVisitor.kt +++ b/native/swift/sir-passes/src/org/jetbrains/sir/passes/utility/DeclarationParentVisitor.kt @@ -31,7 +31,14 @@ internal abstract class DeclarationParentVisitor : SirVisitor() } override fun visitDeclaration(declaration: SirDeclaration, data: Nothing?) { - handleParent(declaration, declarationParentStack.peekFirst()) + // Special case if visitor is started not from the module node. + // In this case we assume that parent is set properly. + val currentParent = if (declarationParentStack.size == 0) { + declaration.parent + } else { + declarationParentStack.peekFirst() + } + handleParent(declaration, currentParent) if (declaration is SirDeclarationParent) { declarationParentStack.push(declaration) diff --git a/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/SirPassTests.kt b/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/SirPassTests.kt index 9851b832a4e..48d76afa240 100644 --- a/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/SirPassTests.kt +++ b/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/SirPassTests.kt @@ -17,9 +17,11 @@ import org.jetbrains.kotlin.sir.mock.MockKotlinType import org.jetbrains.kotlin.sir.mock.MockParameter import org.jetbrains.kotlin.sir.passes.asserts.assertSirFunctionsEquals import org.jetbrains.kotlin.sir.passes.mocks.MockSirFunction +import org.jetbrains.kotlin.sir.passes.util.runWithAsserts import org.jetbrains.kotlin.sir.util.SirSwiftModule import org.jetbrains.sir.passes.run import org.jetbrains.sir.passes.translation.ForeignIntoSwiftFunctionTranslationPass +import org.jetbrains.sir.passes.utility.assertValid import kotlin.test.Test import kotlin.test.assertNotNull @@ -38,9 +40,8 @@ class SirPassTests { visibility = SirVisibility.PUBLIC } mySirElement.parent = module - val myPass = ForeignIntoSwiftFunctionTranslationPass() - val result = myPass.run(mySirElement) as? SirFunction + val result = myPass.runWithAsserts(mySirElement, null) as? SirFunction assertNotNull(result, "SirFunction should be produced") val exp = MockSirFunction( name = "foo", @@ -94,9 +95,8 @@ class SirPassTests { visibility = SirVisibility.PUBLIC } mySirElement.parent = module - val myPass = ForeignIntoSwiftFunctionTranslationPass() - val result = myPass.run(mySirElement) as? SirFunction + val result = myPass.runWithAsserts(mySirElement, null) as? SirFunction assertNotNull(result, "SirFunction should be produced") val exp = MockSirFunction( name = "foo", diff --git a/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/util/PassTestingInfrastructure.kt b/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/util/PassTestingInfrastructure.kt new file mode 100644 index 00000000000..f8f2a61d259 --- /dev/null +++ b/native/swift/sir-passes/tests/org/jetbrains/kotlin/sir/passes/util/PassTestingInfrastructure.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.sir.passes.util + +import org.jetbrains.kotlin.sir.SirElement +import org.jetbrains.sir.passes.SirPass +import org.jetbrains.sir.passes.utility.assertValid + +fun SirPass.runWithAsserts(element: S, data: T): R { + element.assertValid() + val result = run(element, data) + if (result is SirElement) { + result.assertValid() + } + return result +} \ No newline at end of file