Use TopLevelDeclarations analysis mode in REPL
#KT-12564 Fixed
This commit is contained in:
@@ -73,7 +73,7 @@ class ReplCodeAnalyzer(environment: KotlinCoreEnvironment) {
|
|||||||
this.scriptDeclarationFactory = container.get<ScriptMutableDeclarationProviderFactory>()
|
this.scriptDeclarationFactory = container.get<ScriptMutableDeclarationProviderFactory>()
|
||||||
this.resolveSession = container.get<ResolveSession>()
|
this.resolveSession = container.get<ResolveSession>()
|
||||||
this.topDownAnalysisContext = TopDownAnalysisContext(
|
this.topDownAnalysisContext = TopDownAnalysisContext(
|
||||||
TopDownAnalysisMode.LocalDeclarations, DataFlowInfoFactory.EMPTY, resolveSession.declarationScopeProvider
|
TopDownAnalysisMode.TopLevelDeclarations, DataFlowInfoFactory.EMPTY, resolveSession.declarationScopeProvider
|
||||||
)
|
)
|
||||||
this.topDownAnalyzer = container.get<LazyTopDownAnalyzer>()
|
this.topDownAnalyzer = container.get<LazyTopDownAnalyzer>()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
>>> fun fn(): Int {}
|
||||||
|
error: a 'return' expression required in a function with a block body ('{...}')
|
||||||
|
fun fn(): Int {}
|
||||||
|
^
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
>>> if (false) 42
|
||||||
|
>>> if (true) 42
|
||||||
|
>>> "" + (if (true) 42)
|
||||||
|
error: 'if' must have both main and 'else' branches if used as an expression
|
||||||
|
"" + (if (true) 42)
|
||||||
|
^
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
>>> val a = when(null) { }
|
||||||
|
error: 'when' expression must be exhaustive, add necessary 'else' branch
|
||||||
|
val a = when(null) { }
|
||||||
|
^
|
||||||
|
warning: the expression is unused
|
||||||
|
val a = when(null) { }
|
||||||
|
^
|
||||||
|
>>> "" + when (true) { true -> 42 }
|
||||||
|
error: 'when' expression must be exhaustive, add necessary 'false' branch or 'else' branch instead
|
||||||
|
"" + when (true) { true -> 42 }
|
||||||
|
^
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
>>> for (n in 1..10) foo@ { break@foo }
|
||||||
|
error: the label '@foo' does not denote a loop
|
||||||
|
for (n in 1..10) foo@ { break@foo }
|
||||||
|
^
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
>>> val x = 1
|
||||||
|
>>> x = 2
|
||||||
|
error: val cannot be reassigned
|
||||||
|
x = 2
|
||||||
|
^
|
||||||
|
>>> x++
|
||||||
|
error: val cannot be reassigned
|
||||||
|
x++
|
||||||
|
^
|
||||||
|
>>> x
|
||||||
|
1
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
>>> val a: String
|
||||||
|
error: property must be initialized or be abstract
|
||||||
|
val a: String
|
||||||
|
^
|
||||||
|
>>> a
|
||||||
|
error: unresolved reference: a
|
||||||
|
a
|
||||||
|
^
|
||||||
|
>>> val s: String = s
|
||||||
|
error: variable 's' must be initialized
|
||||||
|
val s: String = s
|
||||||
|
^
|
||||||
@@ -213,6 +213,51 @@ public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/repl/controlFlow")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class ControlFlow extends AbstractReplInterpreterTest {
|
||||||
|
public void testAllFilesPresentInControlFlow() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/repl/controlFlow"), Pattern.compile("^(.+)\\.repl$"), TargetBackend.ANY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("functionWithoutReturn.repl")
|
||||||
|
public void testFunctionWithoutReturn() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/repl/controlFlow/functionWithoutReturn.repl");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("incompleteIf.repl")
|
||||||
|
public void testIncompleteIf() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/repl/controlFlow/incompleteIf.repl");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("incompleteWhen.repl")
|
||||||
|
public void testIncompleteWhen() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/repl/controlFlow/incompleteWhen.repl");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("loopWithWrongLabel.repl")
|
||||||
|
public void testLoopWithWrongLabel() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/repl/controlFlow/loopWithWrongLabel.repl");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("mutateVal.repl")
|
||||||
|
public void testMutateVal() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/repl/controlFlow/mutateVal.repl");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("useUninitializedVal.repl")
|
||||||
|
public void testUseUninitializedVal() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/repl/controlFlow/useUninitializedVal.repl");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/repl/modules")
|
@TestMetadata("compiler/testData/repl/modules")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user