Use TopLevelDeclarations analysis mode in REPL

#KT-12564 Fixed
This commit is contained in:
Alexander Udalov
2017-06-05 14:48:04 +03:00
parent b6d12fe7f3
commit 26e3d2cf5d
8 changed files with 94 additions and 1 deletions
@@ -73,7 +73,7 @@ class ReplCodeAnalyzer(environment: KotlinCoreEnvironment) {
this.scriptDeclarationFactory = container.get<ScriptMutableDeclarationProviderFactory>()
this.resolveSession = container.get<ResolveSession>()
this.topDownAnalysisContext = TopDownAnalysisContext(
TopDownAnalysisMode.LocalDeclarations, DataFlowInfoFactory.EMPTY, resolveSession.declarationScopeProvider
TopDownAnalysisMode.TopLevelDeclarations, DataFlowInfoFactory.EMPTY, resolveSession.declarationScopeProvider
)
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 {}
^
+6
View File
@@ -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)
^
+11
View File
@@ -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 }
^
+11
View File
@@ -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")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)