JetBlockExpression.getStatements() returns List<JetExpression> instead of List<JetElement>
This commit is contained in:
@@ -403,7 +403,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
}
|
||||
if (expr instanceof JetBlockExpression) {
|
||||
JetBlockExpression blockExpression = (JetBlockExpression) expr;
|
||||
List<JetElement> statements = blockExpression.getStatements();
|
||||
List<JetExpression> statements = blockExpression.getStatements();
|
||||
if (statements.size() == 0 || statements.size() == 1 && isEmptyExpression(statements.get(0))) {
|
||||
return true;
|
||||
}
|
||||
@@ -497,9 +497,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
if (body instanceof JetBlockExpression) {
|
||||
// If body's a block, it can contain variable declarations which may be used in the condition of a do-while loop.
|
||||
// We handle this case separately because otherwise such variable will be out of the frame map after the block ends
|
||||
List<JetElement> doWhileStatements = ((JetBlockExpression) body).getStatements();
|
||||
List<JetExpression> doWhileStatements = ((JetBlockExpression) body).getStatements();
|
||||
|
||||
List<JetElement> statements = new ArrayList<JetElement>(doWhileStatements.size() + 1);
|
||||
List<JetExpression> statements = new ArrayList<JetExpression>(doWhileStatements.size() + 1);
|
||||
statements.addAll(doWhileStatements);
|
||||
statements.add(condition);
|
||||
|
||||
@@ -1539,7 +1539,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
}
|
||||
|
||||
private StackValue generateBlock(
|
||||
List<JetElement> statements,
|
||||
List<JetExpression> statements,
|
||||
boolean isStatement,
|
||||
Label labelBeforeLastExpression,
|
||||
@Nullable final Label labelBlockEnd
|
||||
@@ -1550,13 +1550,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
|
||||
StackValue answer = StackValue.none();
|
||||
|
||||
for (Iterator<JetElement> iterator = statements.iterator(); iterator.hasNext(); ) {
|
||||
JetElement possiblyLabeledStatement = iterator.next();
|
||||
|
||||
JetElement statement = possiblyLabeledStatement instanceof JetExpression
|
||||
? JetPsiUtil.safeDeparenthesize((JetExpression) possiblyLabeledStatement, true)
|
||||
: possiblyLabeledStatement;
|
||||
for (Iterator<JetExpression> iterator = statements.iterator(); iterator.hasNext(); ) {
|
||||
JetExpression possiblyLabeledStatement = iterator.next();
|
||||
|
||||
JetElement statement = JetPsiUtil.safeDeparenthesize(possiblyLabeledStatement, true);
|
||||
|
||||
if (statement instanceof JetNamedDeclaration) {
|
||||
JetNamedDeclaration declaration = (JetNamedDeclaration) statement;
|
||||
@@ -1915,7 +1912,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
|
||||
private static boolean endsWithReturn(JetElement bodyExpression) {
|
||||
if (bodyExpression instanceof JetBlockExpression) {
|
||||
List<JetElement> statements = ((JetBlockExpression) bodyExpression).getStatements();
|
||||
List<JetExpression> statements = ((JetBlockExpression) bodyExpression).getStatements();
|
||||
return statements.size() > 0 && statements.get(statements.size() - 1) instanceof JetReturnExpression;
|
||||
}
|
||||
|
||||
|
||||
@@ -1186,8 +1186,8 @@ public class JetControlFlowProcessor {
|
||||
builder.enterLexicalScope(expression);
|
||||
}
|
||||
mark(expression);
|
||||
List<JetElement> statements = expression.getStatements();
|
||||
for (JetElement statement : statements) {
|
||||
List<JetExpression> statements = expression.getStatements();
|
||||
for (JetExpression statement : statements) {
|
||||
generateInstructions(statement);
|
||||
}
|
||||
if (statements.isEmpty()) {
|
||||
|
||||
@@ -46,8 +46,8 @@ public class JetBlockExpression extends JetExpressionImpl implements JetStatemen
|
||||
|
||||
@ReadOnly
|
||||
@NotNull
|
||||
public List<JetElement> getStatements() {
|
||||
return Arrays.asList(findChildrenByClass(JetElement.class));
|
||||
public List<JetExpression> getStatements() {
|
||||
return Arrays.asList(findChildrenByClass(JetExpression.class));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -599,7 +599,7 @@ public class JetPsiFactory(private val project: Project) {
|
||||
}
|
||||
|
||||
private class BlockWrapper(fakeBlockExpression: JetBlockExpression, private val expression: JetExpression) : JetBlockExpression(fakeBlockExpression.getNode()), JetPsiUtil.JetExpressionWrapper {
|
||||
override fun getStatements(): List<JetElement> {
|
||||
override fun getStatements(): List<JetExpression> {
|
||||
return listOf(expression)
|
||||
}
|
||||
|
||||
|
||||
@@ -409,7 +409,7 @@ public class JetPsiUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static JetElement getExpressionOrLastStatementInBlock(@Nullable JetExpression expression) {
|
||||
public static JetExpression getExpressionOrLastStatementInBlock(@Nullable JetExpression expression) {
|
||||
if (expression instanceof JetBlockExpression) {
|
||||
return getLastStatementInABlock((JetBlockExpression) expression);
|
||||
}
|
||||
@@ -417,9 +417,9 @@ public class JetPsiUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static JetElement getLastStatementInABlock(@Nullable JetBlockExpression blockExpression) {
|
||||
public static JetExpression getLastStatementInABlock(@Nullable JetBlockExpression blockExpression) {
|
||||
if (blockExpression == null) return null;
|
||||
List<JetElement> statements = blockExpression.getStatements();
|
||||
List<JetExpression> statements = blockExpression.getStatements();
|
||||
return statements.isEmpty() ? null : statements.get(statements.size() - 1);
|
||||
}
|
||||
|
||||
@@ -587,7 +587,7 @@ public class JetPsiUtil {
|
||||
}
|
||||
|
||||
public static boolean checkVariableDeclarationInBlock(@NotNull JetBlockExpression block, @NotNull String varName) {
|
||||
for (JetElement element : block.getStatements()) {
|
||||
for (JetExpression element : block.getStatements()) {
|
||||
if (element instanceof JetVariableDeclaration) {
|
||||
if (((JetVariableDeclaration) element).getNameAsSafeName().asString().equals(varName)) {
|
||||
return true;
|
||||
|
||||
@@ -152,7 +152,7 @@ public fun JetElement.blockExpressionsOrSingle(): Sequence<JetElement> =
|
||||
if (this is JetBlockExpression) getStatements().asSequence() else sequenceOf(this)
|
||||
|
||||
public fun JetExpression.lastBlockStatementOrThis(): JetExpression
|
||||
= (this as? JetBlockExpression)?.getStatements()?.lastIsInstanceOrNull<JetExpression>() ?: this
|
||||
= (this as? JetBlockExpression)?.getStatements()?.lastOrNull() ?: this
|
||||
|
||||
public fun JetBlockExpression.contentRange(): PsiChildRange {
|
||||
val first = (getLBrace()?.getNextSibling() ?: getFirstChild())
|
||||
|
||||
@@ -16,13 +16,14 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve
|
||||
|
||||
import org.jetbrains.kotlin.psi.JetElement
|
||||
import org.jetbrains.kotlin.psi.JetBlockExpression
|
||||
import org.jetbrains.kotlin.psi.JetElement
|
||||
import org.jetbrains.kotlin.psi.JetExpression
|
||||
import org.jetbrains.kotlin.psi.JetPsiUtil
|
||||
|
||||
public open class StatementFilter {
|
||||
|
||||
public open val filter: ((JetElement) -> Boolean)?
|
||||
public open val filter: ((JetExpression) -> Boolean)?
|
||||
get() = null
|
||||
|
||||
companion object {
|
||||
@@ -30,7 +31,7 @@ public open class StatementFilter {
|
||||
}
|
||||
}
|
||||
|
||||
fun StatementFilter.filterStatements(block: JetBlockExpression): List<JetElement> {
|
||||
fun StatementFilter.filterStatements(block: JetBlockExpression): List<JetExpression> {
|
||||
if (filter == null || block is JetPsiUtil.JetExpressionWrapper) return block.getStatements()
|
||||
return block.getStatements().filter { filter!!(it) }
|
||||
}
|
||||
|
||||
@@ -180,9 +180,9 @@ public class ArgumentTypeResolver {
|
||||
// This case is a temporary hack for 'if' branches.
|
||||
// The right way to implement this logic is to interpret 'if' branches as function literals with explicitly-typed signatures
|
||||
// (no arguments and no receiver) and therefore analyze them straight away (not in the 'complete' phase).
|
||||
JetElement lastStatementInABlock = ResolvePackage.getLastStatementInABlock(context.statementFilter, blockExpression);
|
||||
if (lastStatementInABlock instanceof JetExpression) {
|
||||
return getLastElementDeparenthesized((JetExpression) lastStatementInABlock, context);
|
||||
JetExpression lastStatementInABlock = ResolvePackage.getLastStatementInABlock(context.statementFilter, blockExpression);
|
||||
if (lastStatementInABlock != null) {
|
||||
return getLastElementDeparenthesized(lastStatementInABlock, context);
|
||||
}
|
||||
}
|
||||
return deparenthesizedExpression;
|
||||
|
||||
@@ -321,7 +321,7 @@ public class CandidateResolver {
|
||||
TemporaryTraceAndCache temporaryToResolveFunctionLiteral = TemporaryTraceAndCache.create(
|
||||
context, "trace to resolve function literal with expected return type", argumentExpression);
|
||||
|
||||
JetElement statementExpression = JetPsiUtil.getExpressionOrLastStatementInBlock(functionLiteral.getBodyExpression());
|
||||
JetExpression statementExpression = JetPsiUtil.getExpressionOrLastStatementInBlock(functionLiteral.getBodyExpression());
|
||||
if (statementExpression == null) return;
|
||||
boolean[] mismatch = new boolean[1];
|
||||
ObservableBindingTrace errorInterceptingTrace = ExpressionTypingUtils.makeTraceInterceptingTypeMismatch(
|
||||
|
||||
+3
-3
@@ -313,9 +313,9 @@ public class ControlStructureTypingUtils {
|
||||
if (expression.getStatements().isEmpty()) {
|
||||
return checkExpressionType(expression, c);
|
||||
}
|
||||
JetElement lastStatement = JetPsiUtil.getLastStatementInABlock(expression);
|
||||
if (lastStatement instanceof JetExpression) {
|
||||
return checkExpressionTypeRecursively((JetExpression) lastStatement, c);
|
||||
JetExpression lastStatement = JetPsiUtil.getLastStatementInABlock(expression);
|
||||
if (lastStatement != null) {
|
||||
return checkExpressionTypeRecursively(lastStatement, c);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
+2
-2
@@ -320,12 +320,12 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
||||
else if (body != null) {
|
||||
WritableScope writableScope = newWritableScopeImpl(context, "do..while body scope");
|
||||
conditionScope = writableScope;
|
||||
List<JetElement> block;
|
||||
List<JetExpression> block;
|
||||
if (body instanceof JetBlockExpression) {
|
||||
block = ((JetBlockExpression)body).getStatements();
|
||||
}
|
||||
else {
|
||||
block = Collections.<JetElement>singletonList(body);
|
||||
block = Collections.singletonList(body);
|
||||
}
|
||||
bodyTypeInfo = components.expressionTypingServices.getBlockReturnedTypeWithWritableScope(
|
||||
writableScope, block, CoercionStrategy.NO_COERCION, context);
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ public class ExpressionTypingServices {
|
||||
@NotNull CoercionStrategy coercionStrategyForLastExpression,
|
||||
@NotNull ExpressionTypingContext context
|
||||
) {
|
||||
List<JetElement> block = ResolvePackage.filterStatements(statementFilter, expression);
|
||||
List<JetExpression> block = ResolvePackage.filterStatements(statementFilter, expression);
|
||||
|
||||
// SCRIPT: get code descriptor for script declaration
|
||||
DeclarationDescriptor containingDescriptor = context.scope.getContainingDeclaration();
|
||||
|
||||
Reference in New Issue
Block a user