/* * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.kotlin.types; import kotlin.Unit; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.context.ContextKt; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorResolver; import org.jetbrains.kotlin.resolve.FunctionDescriptorResolver; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; import org.jetbrains.kotlin.resolve.lazy.ResolveSession; import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt; import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.KotlinTestWithEnvironment; import org.jetbrains.kotlin.tests.di.ContainerForTests; import org.jetbrains.kotlin.tests.di.InjectionKt; import java.util.Collections; import java.util.List; import static org.jetbrains.kotlin.frontend.di.InjectionKt.createLazyResolveSession; public class DefaultModalityModifiersTest extends KotlinTestWithEnvironment { private final DefaultModalityModifiersTestCase tc = new DefaultModalityModifiersTestCase(); @Override protected KotlinCoreEnvironment createEnvironment() { return createEnvironmentWithMockJdk(ConfigurationKind.ALL); } @Override public void setUp() throws Exception { super.setUp(); tc.setUp(); } @Override protected void tearDown() throws Exception { tc.tearDown(); super.tearDown(); } public class DefaultModalityModifiersTestCase { private final ModuleDescriptorImpl root = KotlinTestUtils.createEmptyModule("<test_root>"); private DescriptorResolver descriptorResolver; private FunctionDescriptorResolver functionDescriptorResolver; private LexicalScope scope; public void setUp() throws Exception { ContainerForTests containerForTests = InjectionKt.createContainerForTests(getProject(), root); descriptorResolver = containerForTests.getDescriptorResolver(); functionDescriptorResolver = containerForTests.getFunctionDescriptorResolver(); scope = createScope(root.getBuiltIns().getBuiltInsPackageScope()); } public void tearDown() throws Exception { scope = null; descriptorResolver = null; } @NotNull private LexicalScope createScope(@NotNull MemberScope libraryScope) { KtFile file = KtPsiFactoryKt.KtPsiFactory(getProject()).createFile("abstract class C { abstract fun foo(); abstract val a: Int }"); KtDeclaration aClass = file.getDeclarations().get(0); assert aClass instanceof KtClass; AnalysisResult bindingContext = JvmResolveUtil.analyzeAndCheckForErrors(file, getEnvironment()); DeclarationDescriptor classDescriptor = bindingContext.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, aClass); return new LexicalScopeImpl( ScopeUtilsKt.memberScopeAsImportingScope(libraryScope), root, false, null, LexicalScopeKind.SYNTHETIC, LocalRedeclarationChecker.DO_NOTHING.INSTANCE, handler -> { handler.addClassifierDescriptor((ClassifierDescriptor) classDescriptor); return Unit.INSTANCE; } ); } private ClassDescriptorWithResolutionScopes createClassDescriptor(ClassKind kind, KtClass aClass) { ResolveSession resolveSession = createLazyResolveSession( ContextKt.ModuleContext(root, getProject()), Collections.singleton(aClass.getContainingKtFile()) ); return (ClassDescriptorWithResolutionScopes) resolveSession.getClassDescriptor(aClass, NoLookupLocation.FROM_TEST); } private void testClassModality(String classDeclaration, ClassKind kind, Modality expectedModality) { KtClass aClass = KtPsiFactoryKt.KtPsiFactory(getProject()).createClass(classDeclaration); ClassDescriptorWithResolutionScopes classDescriptor = createClassDescriptor(kind, aClass); assertEquals(expectedModality, classDescriptor.getModality()); } private void testFunctionModality(String classWithFunction, ClassKind kind, Modality expectedFunctionModality) { KtClass aClass = KtPsiFactoryKt.KtPsiFactory(getProject()).createClass(classWithFunction); ClassDescriptorWithResolutionScopes classDescriptor = createClassDescriptor(kind, aClass); List<KtDeclaration> declarations = aClass.getDeclarations(); KtNamedFunction function = (KtNamedFunction) declarations.get(0); SimpleFunctionDescriptor functionDescriptor = functionDescriptorResolver.resolveFunctionDescriptor(classDescriptor, scope, function, KotlinTestUtils.DUMMY_TRACE, DataFlowInfoFactory.EMPTY); assertEquals(expectedFunctionModality, functionDescriptor.getModality()); } private void testPropertyModality(String classWithProperty, ClassKind kind, Modality expectedPropertyModality) { KtClass aClass = KtPsiFactoryKt.KtPsiFactory(getProject()).createClass(classWithProperty); ClassDescriptorWithResolutionScopes classDescriptor = createClassDescriptor(kind, aClass); List<KtDeclaration> declarations = aClass.getDeclarations(); KtProperty property = (KtProperty) declarations.get(0); PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePropertyDescriptor( classDescriptor, scope, scope, property, KotlinTestUtils.DUMMY_TRACE, DataFlowInfoFactory.EMPTY); assertEquals(expectedPropertyModality, propertyDescriptor.getModality()); } private void testPropertyAccessorModality(String classWithPropertyWithAccessor, ClassKind kind, Modality expectedPropertyAccessorModality, boolean isGetter) { KtClass aClass = KtPsiFactoryKt.KtPsiFactory(getProject()).createClass(classWithPropertyWithAccessor); ClassDescriptorWithResolutionScopes classDescriptor = createClassDescriptor(kind, aClass); List<KtDeclaration> declarations = aClass.getDeclarations(); KtProperty property = (KtProperty) declarations.get(0); PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePropertyDescriptor( classDescriptor, scope, scope, property, KotlinTestUtils.DUMMY_TRACE, DataFlowInfoFactory.EMPTY); PropertyAccessorDescriptor propertyAccessor = isGetter ? propertyDescriptor.getGetter() : propertyDescriptor.getSetter(); assert propertyAccessor != null; assertEquals(expectedPropertyAccessorModality, propertyAccessor.getModality()); } public void testClassModality(String classDeclaration, Modality expectedModality) { testClassModality(classDeclaration, ClassKind.CLASS, expectedModality); } public void testTraitModality(String classDeclaration, Modality expectedModality) { testClassModality(classDeclaration, ClassKind.INTERFACE, expectedModality); } public void testEnumModality(String classDeclaration, Modality expectedModality) { testClassModality(classDeclaration, ClassKind.ENUM_CLASS, expectedModality); } public void testFunctionModalityInClass(String classWithFunction, Modality expectedModality) { testFunctionModality(classWithFunction, ClassKind.CLASS, expectedModality); } public void testFunctionModalityInEnum(String classWithFunction, Modality expectedModality) { testFunctionModality(classWithFunction, ClassKind.ENUM_CLASS, expectedModality); } public void testFunctionModalityInTrait(String classWithFunction, Modality expectedModality) { testFunctionModality(classWithFunction, ClassKind.INTERFACE, expectedModality); } public void testPropertyModalityInClass(String classWithProperty, Modality expectedModality) { testPropertyModality(classWithProperty, ClassKind.CLASS, expectedModality); } public void testPropertyModalityInEnum(String classWithProperty, Modality expectedModality) { testPropertyModality(classWithProperty, ClassKind.ENUM_CLASS, expectedModality); } public void testPropertyModalityInTrait(String classWithProperty, Modality expectedModality) { testPropertyModality(classWithProperty, ClassKind.INTERFACE, expectedModality); } public void testPropertyAccessorModalityInClass(String classWithPropertyWithAccessor, Modality expectedModality) { testPropertyAccessorModality(classWithPropertyWithAccessor, ClassKind.CLASS, expectedModality, true); } public void testPropertyAccessorModalityInTrait(String classWithPropertyWithAccessor, Modality expectedModality) { testPropertyAccessorModality(classWithPropertyWithAccessor, ClassKind.INTERFACE, expectedModality, true); } public void testPropertyAccessorModalityInClass(String classWithPropertyWithAccessor, Modality expectedModality, boolean isGetter) { testPropertyAccessorModality(classWithPropertyWithAccessor, ClassKind.CLASS, expectedModality, isGetter); } public void testPropertyAccessorModalityInTrait(String classWithPropertyWithAccessor, Modality expectedModality, boolean isGetter) { testPropertyAccessorModality(classWithPropertyWithAccessor, ClassKind.INTERFACE, expectedModality, isGetter); } } public void testClassModality() { tc.testClassModality("class A {}", Modality.FINAL); tc.testClassModality("open class A {}", Modality.OPEN); tc.testClassModality("abstract class A {}", Modality.ABSTRACT); tc.testClassModality("final class A {}", Modality.FINAL); tc.testClassModality("open abstract class A {}", Modality.ABSTRACT); tc.testEnumModality("enum class A {}", Modality.FINAL); tc.testEnumModality("open enum class A {}", Modality.OPEN); tc.testEnumModality("abstract enum class A {}", Modality.ABSTRACT); tc.testEnumModality("final enum class A {}", Modality.FINAL); tc.testTraitModality("interface A {}", Modality.ABSTRACT); tc.testTraitModality("open interface A {}", Modality.ABSTRACT); tc.testTraitModality("abstract interface A {}", Modality.ABSTRACT); } public void testFunctionModality() { tc.testFunctionModalityInClass("class A { fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInClass("class A { open fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInClass("class A { final fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInClass("open class A { fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInClass("open class A { open fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInClass("open class A { final fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInClass("abstract class A { open fun foo() }", Modality.OPEN); tc.testFunctionModalityInClass("abstract class A { abstract fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInEnum("enum class A { ; fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInEnum("enum class A { ; final fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInEnum("open enum class A { ; open fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInEnum("abstract enum class A { ; open fun foo() }", Modality.OPEN); tc.testFunctionModalityInEnum("abstract enum class A { ; abstract fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInTrait("interface A { fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInTrait("interface A { abstract fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInTrait("interface A { fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInTrait("interface A { open fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInTrait("interface A { final fun foo() {} }", Modality.FINAL); } public void testFunctionModalityWithOverride() { tc.testFunctionModalityInClass("class A : C { override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInClass("class A : C { open override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInClass("class A : C { final override fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInClass("open class A : C { override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInClass("open class A : C { open override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInClass("open class A : C { final override fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInClass("abstract class A : C { open override fun foo() }", Modality.OPEN); tc.testFunctionModalityInClass("abstract class A : C { abstract override fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInEnum("enum class A : C { ; override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInEnum("enum class A : C { ; final override fun foo() {} }", Modality.FINAL); tc.testFunctionModalityInEnum("open enum class A : C { ; open override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInEnum("abstract enum class A : C { ; open override fun foo() }", Modality.OPEN); tc.testFunctionModalityInEnum("abstract enum class A : C { ; abstract override fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInTrait("interface A : C { override fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInTrait("interface A : C { abstract override fun foo() }", Modality.ABSTRACT); tc.testFunctionModalityInTrait("interface A : C { override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInTrait("interface A : C { open override fun foo() {} }", Modality.OPEN); tc.testFunctionModalityInTrait("interface A : C { final override fun foo() {} }", Modality.FINAL); } public void testPropertyModality() { tc.testPropertyModalityInClass("class A { val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("class A { final val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("open class A { val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("open class A { final val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("open class A { open val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("abstract class A { val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("abstract class A { open val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("abstract class A { abstract val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInEnum("enum class A { ; val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInEnum("enum class A { ; final val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInEnum("open enum class A { ; val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInEnum("open enum class A { ; final val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInEnum("open enum class A { ; open val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInEnum("abstract enum class A { ; open val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInEnum("abstract enum class A { ; abstract val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { open val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { abstract val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { open abstract val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { val a: Int get() = 10 }", Modality.OPEN); tc.testPropertyModalityInTrait("interface A { var a: Int get() = 1; set(v: Int) {} }", Modality.OPEN); tc.testPropertyModalityInTrait("interface A { val a: Int open get }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { var a: Int open get open set}", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { open val a: Int get }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A { open val a: Int get() = 1 }", Modality.OPEN); tc.testPropertyModalityInTrait("interface A { open val a: Int final get() = 1 }", Modality.OPEN); } public void testPropertyModalityWithOverride() { tc.testPropertyModalityInClass("class A : C { override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("class A : C { final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("open class A : C { override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("open class A : C { final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInClass("open class A : C { open override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("abstract class A : C { override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("abstract class A : C { open override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInClass("abstract class A : C { abstract override val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInEnum("enum class A : C { ; override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInEnum("enum class A : C { ; final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInEnum("open enum class A : C { ; override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInEnum("open enum class A : C { ; final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyModalityInEnum("open enum class A : C { ; open override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInEnum("abstract enum class A : C { ; open override val a: Int = 0 }", Modality.OPEN); tc.testPropertyModalityInEnum("abstract enum class A : C { ; abstract override val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { override val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { open override val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { abstract override val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { open abstract override val a: Int }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { override val a: Int get() = 10 }", Modality.OPEN); tc.testPropertyModalityInTrait("interface A : C { override var a: Int get() = 1; set(v: Int) {} }", Modality.OPEN); tc.testPropertyModalityInTrait("interface A : C { override val a: Int open get }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { override var a: Int open get open set }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { open override val a: Int get }", Modality.ABSTRACT); tc.testPropertyModalityInTrait("interface A : C { open override val a: Int get() = 1 }", Modality.OPEN); tc.testPropertyModalityInTrait("interface A : C { open override val a: Int final get() = 1 }", Modality.OPEN); } public void testPropertyAccessorModality() { tc.testPropertyAccessorModalityInClass("class A { val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A { val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A { val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A { final val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A { final val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A { final val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { open val a: Int = 0 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A { open val a: Int = 0; get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A { open val a: Int = 0; open get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A { open val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { final val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { final val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A { final val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("abstract class A { abstract val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { abstract val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { abstract val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { abstract val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { val a: Int get() = 10 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("abstract class A { val a: Int open get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A { val a: Int final get() = 10 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("abstract class A { open abstract val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { open abstract val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { open abstract val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { open abstract val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A { open val a: Int get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A { open val a: Int open get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A { open val a: Int final get() = 10 }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int open get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int final get }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("interface A { val a: Int final get() = 1 }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int open get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int final get }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("abstract interface A { val a: Int final get() = 1 }", Modality.FINAL); } public void testPropertyAccessorModalityWithOverride() { tc.testPropertyAccessorModalityInClass("class A : C { override val a: Int = 0 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("class A : C { override val a: Int = 0; get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("class A : C { override val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("class A : C { final override val a: Int = 0; override get() = 2 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; open get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; override get() = 2 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { override val a: Int = 0; final override get() = 2 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; open get }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; override get() = 2 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { open override val a: Int = 0; final override get() = 2 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; final get }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; override get() = 2 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("open class A : C { final override val a: Int = 0; final override get() = 2 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { abstract override val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { override val a: Int override get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A : C { override val a: Int open override get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A : C { override val a: Int final override get() = 10 }", Modality.FINAL); tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { open abstract override val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInClass("abstract class A : C { open override val a: Int override get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A : C { open override val a: Int open override get() = 10 }", Modality.OPEN); tc.testPropertyAccessorModalityInClass("abstract class A : C { open override val a: Int final override get() = 10 }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int override get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int abstract get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int open get }", Modality.ABSTRACT); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int open override get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int override get() = 1 }", Modality.OPEN); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int final get }", Modality.FINAL); tc.testPropertyAccessorModalityInTrait("interface A : C { override val a: Int final override get() = 1 }", Modality.FINAL); } }