KT-439 Support labeled function lliterals in call arguments

This commit is contained in:
Andrey Breslav
2011-11-03 22:38:01 +03:00
parent 73292bd4d6
commit 1d2efea0a4
2 changed files with 26 additions and 13 deletions
@@ -6,6 +6,7 @@ import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.Collections;
import java.util.List;
@@ -49,26 +50,31 @@ public class JetCallExpression extends JetExpression implements JetCallElement {
@NotNull
public List<JetExpression> getFunctionLiteralArguments() {
JetExpression calleeExpression = getCalleeExpression();
ASTNode node;
if (calleeExpression instanceof JetFunctionLiteralExpression) {
List<JetExpression> result = new SmartList<JetExpression>();
ASTNode treeNext = calleeExpression.getNode().getTreeNext();
while (treeNext != null) {
PsiElement psi = treeNext.getPsi();
if (psi instanceof JetFunctionLiteralExpression) {
result.add((JetFunctionLiteralExpression) psi);
}
else if (psi instanceof JetLabelQualifiedExpression) {
JetLabelQualifiedExpression labelQualifiedExpression = (JetLabelQualifiedExpression) psi;
JetExpression labeledExpression = labelQualifiedExpression.getLabeledExpression();
node = calleeExpression.getNode().getTreeNext();
}
else {
node = getNode().getFirstChildNode();
}
List<JetExpression> result = new SmartList<JetExpression>();
while (node != null) {
PsiElement psi = node.getPsi();
if (psi instanceof JetFunctionLiteralExpression) {
result.add((JetFunctionLiteralExpression) psi);
}
else if (psi instanceof JetPrefixExpression) {
JetPrefixExpression prefixExpression = (JetPrefixExpression) psi;
if (JetTokens.LABELS.contains(prefixExpression.getOperationSign().getReferencedNameElementType())) {
JetExpression labeledExpression = prefixExpression.getBaseExpression();
if (labeledExpression instanceof JetFunctionLiteralExpression) {
result.add(labeledExpression);
}
}
treeNext = treeNext.getTreeNext();
}
return result;
node = node.getTreeNext();
}
return findChildrenByType(JetNodeTypes.FUNCTION_LITERAL_EXPRESSION);
return result;
}
@Override
@@ -0,0 +1,7 @@
// KT-439 Support labeled function lliterals in call arguments
inline fun run1<T>(body : fun() : T) : T = body()
fun main1(args : Array<String>) {
run1 @l{ 1 } // should not be an error
}