KT-11765 Analyze code in anonymous initializer of inteface

#KT-11765 Fixed
This commit is contained in:
Pavel V. Talanov
2016-04-04 17:10:36 +03:00
parent 40dc5f24d5
commit 8fe14b7ba5
3 changed files with 21 additions and 12 deletions
@@ -525,20 +525,17 @@ public class BodyResolver {
@NotNull ClassDescriptorWithResolutionScopes classDescriptor @NotNull ClassDescriptorWithResolutionScopes classDescriptor
) { ) {
LexicalScope scopeForInitializers = classDescriptor.getScopeForInitializerResolution(); LexicalScope scopeForInitializers = classDescriptor.getScopeForInitializerResolution();
if (!classDescriptor.getConstructors().isEmpty()) { KtExpression body = anonymousInitializer.getBody();
KtExpression body = anonymousInitializer.getBody(); if (body != null) {
if (body != null) { PreliminaryDeclarationVisitor.Companion.createForDeclaration(
PreliminaryDeclarationVisitor.Companion.createForDeclaration( (KtDeclaration) anonymousInitializer.getParent().getParent(), trace);
(KtDeclaration) anonymousInitializer.getParent().getParent(), trace); expressionTypingServices.getTypeInfo(
expressionTypingServices.getTypeInfo( scopeForInitializers, body, NO_EXPECTED_TYPE, outerDataFlowInfo, trace, /*isStatement = */true
scopeForInitializers, body, NO_EXPECTED_TYPE, outerDataFlowInfo, trace, /*isStatement = */true );
);
}
processModifiersOnInitializer(anonymousInitializer, scopeForInitializers);
} }
else { processModifiersOnInitializer(anonymousInitializer, scopeForInitializers);
if (classDescriptor.getConstructors().isEmpty()) {
trace.report(ANONYMOUS_INITIALIZER_IN_INTERFACE.on(anonymousInitializer)); trace.report(ANONYMOUS_INITIALIZER_IN_INTERFACE.on(anonymousInitializer));
processModifiersOnInitializer(anonymousInitializer, scopeForInitializers);
} }
} }
@@ -0,0 +1,6 @@
interface I {
<error>init {
val c = 1
val g = c
}</error>
}
@@ -526,6 +526,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("InitializerInInterface.kt")
public void testInitializerInInterface() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/InitializerInInterface.kt");
doTest(fileName);
}
@TestMetadata("InterfaceDeclarationAsExpression.kt") @TestMetadata("InterfaceDeclarationAsExpression.kt")
public void testInterfaceDeclarationAsExpression() throws Exception { public void testInterfaceDeclarationAsExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt");