diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java index b86e7fd17de..802cae9c95f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.java @@ -81,7 +81,7 @@ public class OverloadResolver { else if (containingDeclaration instanceof ScriptDescriptor) { // TODO: check overload conflicts of functions with constructors in scripts } - else if (!(containingDeclaration instanceof FunctionDescriptor)) { + else if (!(containingDeclaration instanceof FunctionDescriptor || containingDeclaration instanceof PropertyDescriptor)) { throw new IllegalStateException("Illegal class container: " + containingDeclaration); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java index a836645c45d..ce1a68ab62d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java @@ -321,6 +321,7 @@ public class CallExpressionResolver { return getSimpleNameExpressionTypeInfo((KtSimpleNameExpression) selectorExpression, receiver, callOperationNode, context); } else if (selectorExpression != null) { + expressionTypingServices.getTypeInfo(selectorExpression, context); context.trace.report(ILLEGAL_SELECTOR.on(selectorExpression, selectorExpression.getText())); } return TypeInfoFactoryKt.noTypeInfo(context); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 7ce0d8aaaab..341e1f8ad65 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -1448,6 +1448,26 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return components.dataFlowAnalyzer.checkType(resolveArrayAccessGetMethod(expression, context), expression, context); } + @Override + public KotlinTypeInfo visitClass(@NotNull KtClass klass, ExpressionTypingContext context) { + // analyze class in illegal position and write descriptor to trace but do not write to any scope + components.localClassifierAnalyzer.processClassOrObject( + null, context.replaceContextDependency(INDEPENDENT), + context.scope.getOwnerDescriptor(), + klass + ); + return declarationInIllegalContext(klass, context); + } + + @NotNull + private static KotlinTypeInfo declarationInIllegalContext( + @NotNull KtDeclaration declaration, + @NotNull ExpressionTypingContext context + ) { + context.trace.report(DECLARATION_IN_ILLEGAL_CONTEXT.on(declaration)); + return TypeInfoFactoryKt.noTypeInfo(context); + } + @NotNull public KotlinTypeInfo getTypeInfoForBinaryCall( @NotNull Name name, @@ -1486,8 +1506,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @Override public KotlinTypeInfo visitDeclaration(@NotNull KtDeclaration dcl, ExpressionTypingContext context) { - context.trace.report(DECLARATION_IN_ILLEGAL_CONTEXT.on(dcl)); - return TypeInfoFactoryKt.noTypeInfo(context); + return declarationInIllegalContext(dcl, context); } @Override diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java index 0b6709d5da7..c2ea86740d0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -384,6 +384,11 @@ public abstract class ExpressionTypingVisitorDispatcher extends KtVisitor) -> } -val receiverWithParameter = { Int.(a) -> } +val receiverWithParameter = { Int.(a) -> } val receiverAndReturnType = { Int.(): Int -> 5 } -val receiverAndReturnTypeWithParameter = { Int.(a: Int): Int -> 5 } +val receiverAndReturnTypeWithParameter = { Int.(a: Int): Int -> 5 } val returnType = { (): Int -> 5 } val returnTypeWithParameter = { (b: Int): Int -> 5 } diff --git a/compiler/testData/diagnostics/tests/incompleteCode/variableDeclarationInSelector.kt b/compiler/testData/diagnostics/tests/incompleteCode/variableDeclarationInSelector.kt index 08756b791e8..1b3b0686a26 100644 --- a/compiler/testData/diagnostics/tests/incompleteCode/variableDeclarationInSelector.kt +++ b/compiler/testData/diagnostics/tests/incompleteCode/variableDeclarationInSelector.kt @@ -1,4 +1,4 @@ fun foo(s: String) { s. - val b = 42 + val b = 42 } \ No newline at end of file diff --git a/idea/testData/checker/regression/ClassDeclarationAfterDot.kt b/idea/testData/checker/regression/ClassDeclarationAfterDot.kt new file mode 100644 index 00000000000..e3d955ecb65 --- /dev/null +++ b/idea/testData/checker/regression/ClassDeclarationAfterDot.kt @@ -0,0 +1,5 @@ +class A + +fun f() { + A.class +} diff --git a/idea/testData/checker/regression/ClassDeclarationAfterDot2.kt b/idea/testData/checker/regression/ClassDeclarationAfterDot2.kt new file mode 100644 index 00000000000..4b784e6a5f6 --- /dev/null +++ b/idea/testData/checker/regression/ClassDeclarationAfterDot2.kt @@ -0,0 +1,9 @@ +class A + +fun f() { + A.class B { + fun f() { + f() + } + } +} diff --git a/idea/testData/checker/regression/ClassDeclarationAsExpression.kt b/idea/testData/checker/regression/ClassDeclarationAsExpression.kt new file mode 100644 index 00000000000..7949d9b9a40 --- /dev/null +++ b/idea/testData/checker/regression/ClassDeclarationAsExpression.kt @@ -0,0 +1,5 @@ +val p = 1 < class A { + fun f() { + f() + } +} diff --git a/idea/testData/checker/regression/ClassDeclarationAsExpression2.kt b/idea/testData/checker/regression/ClassDeclarationAsExpression2.kt new file mode 100644 index 00000000000..2d07edac099 --- /dev/null +++ b/idea/testData/checker/regression/ClassDeclarationAsExpression2.kt @@ -0,0 +1 @@ +fun g() = 1 < class A \ No newline at end of file diff --git a/idea/testData/checker/regression/ClassDeclarationAsExpression3.kt b/idea/testData/checker/regression/ClassDeclarationAsExpression3.kt new file mode 100644 index 00000000000..b0b3a1847bf --- /dev/null +++ b/idea/testData/checker/regression/ClassDeclarationAsExpression3.kt @@ -0,0 +1,7 @@ +fun f(i: Int = 3 < class A { + fun f() { + f() + } +}) { + +} \ No newline at end of file diff --git a/idea/testData/checker/regression/FunDeclarationAfterDot.kt b/idea/testData/checker/regression/FunDeclarationAfterDot.kt new file mode 100644 index 00000000000..f0304627bb9 --- /dev/null +++ b/idea/testData/checker/regression/FunDeclarationAfterDot.kt @@ -0,0 +1,7 @@ +class A + +fun f() { + A.fun g() { + g() + } +} diff --git a/idea/testData/codeInsight/lineMarker/overrideImplement/BadCodeNoExceptions.kt b/idea/testData/codeInsight/lineMarker/overrideImplement/BadCodeNoExceptions.kt index fbdbf7a6020..0ae6dea53a6 100644 --- a/idea/testData/codeInsight/lineMarker/overrideImplement/BadCodeNoExceptions.kt +++ b/idea/testData/codeInsight/lineMarker/overrideImplement/BadCodeNoExceptions.kt @@ -1,10 +1,10 @@ -interface Hi { - fun foo(): Int +interface Hi { + fun foo(): Int } // Closing brace is intentionally missed val id = array("kotlin.FlexibleType" private class Some(): Hi { - override fun foo() = 1 + override fun foo() = 1 } \ No newline at end of file diff --git a/idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/JavaStyleClassLiteralInvalidCode_verification.xml b/idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/JavaStyleClassLiteralInvalidCode_verification.xml new file mode 100644 index 00000000000..bcab08d22a3 --- /dev/null +++ b/idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/JavaStyleClassLiteralInvalidCode_verification.xml @@ -0,0 +1,3 @@ + + + diff --git a/idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/main.kt b/idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/main.kt new file mode 100644 index 00000000000..3f61a2b1e47 --- /dev/null +++ b/idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/main.kt @@ -0,0 +1,6 @@ +class A + +fun f() { + A.class +} + diff --git a/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml b/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml index 0e6006042b0..68268bf7268 100644 --- a/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml +++ b/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml @@ -55,4 +55,12 @@ Unused Symbol Property 'id' is never used + + BadCodeNoExceptions.kt + 4 + light_idea_test_case + + Unused symbol + Class 'Some' is never used + diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index 47789e23f8f..ddc5ff01afc 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -394,6 +394,36 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("ClassDeclarationAfterDot.kt") + public void testClassDeclarationAfterDot() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/ClassDeclarationAfterDot.kt"); + doTest(fileName); + } + + @TestMetadata("ClassDeclarationAfterDot2.kt") + public void testClassDeclarationAfterDot2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/ClassDeclarationAfterDot2.kt"); + doTest(fileName); + } + + @TestMetadata("ClassDeclarationAsExpression.kt") + public void testClassDeclarationAsExpression() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/ClassDeclarationAsExpression.kt"); + doTest(fileName); + } + + @TestMetadata("ClassDeclarationAsExpression2.kt") + public void testClassDeclarationAsExpression2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/ClassDeclarationAsExpression2.kt"); + doTest(fileName); + } + + @TestMetadata("ClassDeclarationAsExpression3.kt") + public void testClassDeclarationAsExpression3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/ClassDeclarationAsExpression3.kt"); + doTest(fileName); + } + @TestMetadata("CoercionToUnit.kt") public void testCoercionToUnit() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/CoercionToUnit.kt"); @@ -418,6 +448,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("FunDeclarationAfterDot.kt") + public void testFunDeclarationAfterDot() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/FunDeclarationAfterDot.kt"); + doTest(fileName); + } + @TestMetadata("javaStyleClassLiteralInAnnotationArguments.kt") public void testJavaStyleClassLiteralInAnnotationArguments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/javaStyleClassLiteralInAnnotationArguments.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java index 0ed884c8d9b..59c843cf926 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java @@ -157,6 +157,12 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest { doTypeClassHierarchyTest(fileName); } + @TestMetadata("JavaStyleClassLiteralInvalidCode") + public void testJavaStyleClassLiteralInvalidCode() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/type/JavaStyleClassLiteralInvalidCode/"); + doTypeClassHierarchyTest(fileName); + } + @TestMetadata("JetInt") public void testJetInt() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/type/JetInt/");