diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index c20f09bfee1..9cf62c423df 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -3314,7 +3314,6 @@ public class ExpressionCodegen extends JetVisitor implem for (ValueArgument va : expression.getValueArguments()) { args.add(va.getArgumentExpression()); } - args.addAll(expression.getFunctionLiteralArguments()); boolean isArray = KotlinBuiltIns.getInstance().isArray(arrayType); if (!isArray && args.size() != 1) { diff --git a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java index c2509307180..493ede61a64 100644 --- a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java +++ b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java @@ -61,6 +61,7 @@ public interface JetNodeTypes { IElementType TYPE_ARGUMENT_LIST = JetStubElementTypes.TYPE_ARGUMENT_LIST; JetNodeType VALUE_ARGUMENT_LIST = new JetNodeType("VALUE_ARGUMENT_LIST", JetValueArgumentList.class); JetNodeType VALUE_ARGUMENT = new JetNodeType("VALUE_ARGUMENT", JetValueArgument.class); + JetNodeType FUNCTION_LITERAL_ARGUMENT = new JetNodeType("FUNCTION_LITERAL_ARGUMENT", JetFunctionLiteralArgument.class); JetNodeType VALUE_ARGUMENT_NAME = new JetNodeType("VALUE_ARGUMENT_NAME", JetValueArgumentName.class); IElementType TYPE_REFERENCE = JetStubElementTypes.TYPE_REFERENCE; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 60a898e2c0f..7eb07985d72 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -1113,10 +1113,6 @@ public class JetControlFlowProcessor { inputExpressions.add(argumentExpression); } } - for (JetExpression functionLiteral : expression.getFunctionLiteralArguments()) { - generateInstructions(functionLiteral); - inputExpressions.add(functionLiteral); - } JetExpression calleeExpression = expression.getCalleeExpression(); generateInstructions(calleeExpression); inputExpressions.add(calleeExpression); @@ -1490,8 +1486,7 @@ public class JetControlFlowProcessor { CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); Map receivers = getReceiverValues(resolvedCall); SmartFMap parameterValues = SmartFMap.emptyMap(); - List valueArguments = CallUtilPackage.getAllValueArguments(resolvedCall.getCall()); - for (ValueArgument argument : valueArguments) { + for (ValueArgument argument : resolvedCall.getCall().getValueArguments()) { ArgumentMapping argumentMapping = resolvedCall.getArgumentMapping(argument); JetExpression argumentExpression = argument.getArgumentExpression(); if (argumentMapping instanceof ArgumentMatch) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index dba0dd21d60..f1aa41bc7b0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -516,6 +516,7 @@ public class JetExpressionParsing extends AbstractJetParsing { protected boolean parseCallWithClosure() { boolean success = false; while ((at(LBRACE) || at(LABEL_IDENTIFIER) && lookahead(1) == LBRACE)) { + PsiBuilder.Marker argument = mark(); if (!at(LBRACE)) { assert _at(LABEL_IDENTIFIER); parseLabeledExpression(); @@ -523,6 +524,7 @@ public class JetExpressionParsing extends AbstractJetParsing { else { parseFunctionLiteral(); } + argument.done(FUNCTION_LITERAL_ARGUMENT); success = true; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/Call.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/Call.java index 8a25060654e..13298b46952 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/Call.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/Call.java @@ -46,9 +46,9 @@ public interface Call { @NotNull List getValueArguments(); - @KotlinSignature("fun getFunctionLiteralArguments(): List") + @KotlinSignature("fun getFunctionLiteralArguments(): List") @NotNull - List getFunctionLiteralArguments(); + List getFunctionLiteralArguments(); @KotlinSignature("fun getTypeArguments(): List") @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetAnnotationEntry.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetAnnotationEntry.java index e8d171a065f..891205602ef 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetAnnotationEntry.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetAnnotationEntry.java @@ -73,7 +73,7 @@ public class JetAnnotationEntry extends JetElementImplStub getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return Collections.emptyList(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java index bb1e3d1a734..e4210192a4b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java @@ -32,7 +32,7 @@ public interface JetCallElement extends JetElement { List getValueArguments(); @NotNull - List getFunctionLiteralArguments(); + List getFunctionLiteralArguments(); @NotNull List getTypeArguments(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java index 73727204b5a..cbf7e743cfb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java @@ -16,13 +16,11 @@ package org.jetbrains.jet.lang.psi; +import com.google.common.collect.Lists; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; -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,6 +47,7 @@ public class JetCallExpression extends JetExpressionImpl implements JetCallEleme return (JetValueArgumentList) findChildByType(JetNodeTypes.VALUE_ARGUMENT_LIST); } + @Override @Nullable public JetTypeArgumentList getTypeArgumentList() { return (JetTypeArgumentList) findChildByType(JetNodeTypes.TYPE_ARGUMENT_LIST); @@ -61,40 +60,26 @@ public class JetCallExpression extends JetExpressionImpl implements JetCallEleme */ @Override @NotNull - public List getFunctionLiteralArguments() { - JetExpression calleeExpression = getCalleeExpression(); - ASTNode node; - if (calleeExpression instanceof JetFunctionLiteralExpression) { - node = calleeExpression.getNode().getTreeNext(); - } - else { - node = getNode().getFirstChildNode(); - } - List result = new SmartList(); - while (node != null) { - PsiElement psi = node.getPsi(); - if (psi instanceof JetFunctionLiteralExpression) { - result.add((JetFunctionLiteralExpression) psi); - } - else if (psi instanceof JetLabeledExpression) { - JetLabeledExpression labeledExpression = (JetLabeledExpression) psi; - JetExpression baseExpression = labeledExpression.getBaseExpression(); - if (baseExpression instanceof JetFunctionLiteralExpression) { - result.add(labeledExpression); - } - } - node = node.getTreeNext(); - } - return result; + public List getFunctionLiteralArguments() { + return findChildrenByType(JetNodeTypes.FUNCTION_LITERAL_ARGUMENT); } @Override @NotNull public List getValueArguments() { JetValueArgumentList list = getValueArgumentList(); - return list != null ? list.getArguments() : Collections.emptyList(); + List valueArgumentsInParentheses = list != null ? list.getArguments() : Collections.emptyList(); + List functionLiteralArguments = getFunctionLiteralArguments(); + if (functionLiteralArguments.isEmpty()) { + return valueArgumentsInParentheses; + } + List allValueArguments = Lists.newArrayList(); + allValueArguments.addAll(valueArgumentsInParentheses); + allValueArguments.addAll(functionLiteralArguments); + return allValueArguments; } + @Override @NotNull public List getTypeArguments() { JetTypeArgumentList list = getTypeArgumentList(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToSuperCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToSuperCall.java index f94f7b51c17..49e15b36221 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToSuperCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToSuperCall.java @@ -46,11 +46,13 @@ public class JetDelegatorToSuperCall extends JetDelegationSpecifier implements J return getRequiredStubOrPsiChild(JetStubElementTypes.CONSTRUCTOR_CALLEE); } + @Override @Nullable public JetValueArgumentList getValueArgumentList() { return (JetValueArgumentList) findChildByType(JetNodeTypes.VALUE_ARGUMENT_LIST); } + @Override @NotNull public List getValueArguments() { JetValueArgumentList list = getValueArgumentList(); @@ -59,7 +61,7 @@ public class JetDelegatorToSuperCall extends JetDelegationSpecifier implements J @NotNull @Override - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return Collections.emptyList(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToThisCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToThisCall.java index d8a1fcacbc2..49a84878853 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToThisCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorToThisCall.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.stubs.IStubElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; @@ -47,11 +46,13 @@ public class JetDelegatorToThisCall extends JetDelegationSpecifier implements Je return getThisReference(); } + @Override @Nullable public JetValueArgumentList getValueArgumentList() { return (JetValueArgumentList) findChildByType(JetNodeTypes.VALUE_ARGUMENT_LIST); } + @Override @NotNull public List getValueArguments() { JetValueArgumentList list = getValueArgumentList(); @@ -60,7 +61,7 @@ public class JetDelegatorToThisCall extends JetDelegationSpecifier implements Je @NotNull @Override - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return Collections.emptyList(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralArgument.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralArgument.kt new file mode 100644 index 00000000000..06186f5ae0d --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralArgument.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.psi + +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiWhiteSpace + +public class JetFunctionLiteralArgument(node: ASTNode) : JetValueArgument(node) { + + private fun assertFL() = throw AssertionError("Function literal argument doesn't contain function literal expression: " + + "${super.getArgumentExpression()?.getText()} (it should be guaranteed by parser)") + + override fun getArgumentExpression() = super.getArgumentExpression() ?: assertFL() + + public fun getFunctionLiteral(): JetFunctionLiteralExpression { + val expression = getArgumentExpression() + + return when (expression) { + is JetLabeledExpression -> expression.getBaseExpression() as? JetFunctionLiteralExpression ?: assertFL() + else -> expression as? JetFunctionLiteralExpression ?: assertFL() + } + } +} + diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt index 1f37c794ef0..71792e4d996 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt @@ -279,8 +279,13 @@ public class JetPsiFactory(private val project: Project) { return createExpression(JetPsiUnparsingUtils.toIf(condition, thenExpr, elseExpr)) as JetIfExpression } - public fun createArgumentWithName(name: String, argumentExpression: JetExpression): JetValueArgument { - return createCallArguments("(" + name + " = " + argumentExpression.getText() + ")").getArguments().first() + public fun createArgumentWithName(name: String?, argumentExpression: JetExpression): JetValueArgument { + val argumentText = (if (name != null) "$name = " else "") + argumentExpression.getText() + return createCallArguments("($argumentText)").getArguments().first() + } + + public fun createArgument(argumentExpression: JetExpression): JetValueArgument { + return createArgumentWithName(null, argumentExpression) } public inner class IfChainBuilder() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt index ee554618f10..10bb92791b7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt @@ -318,4 +318,13 @@ public fun JetSimpleNameExpression.isImportDirectiveExpression(): Boolean { } } -public fun JetElement.getTextWithLocation(): String = "'${this.getText()}' at ${DiagnosticUtils.atLocation(this)}" \ No newline at end of file +public fun JetElement.getTextWithLocation(): String = "'${this.getText()}' at ${DiagnosticUtils.atLocation(this)}" + +public fun JetExpression.isFunctionLiteralOutsideParentheses(): Boolean { + val parent = getParent() + return when (parent) { + is JetFunctionLiteralArgument -> true + is JetLabeledExpression -> parent.isFunctionLiteralOutsideParentheses() + else -> false + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ArgumentTypeResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ArgumentTypeResolver.java index b2f13630672..c67b5c963ba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ArgumentTypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ArgumentTypeResolver.java @@ -116,14 +116,10 @@ public class ArgumentTypeResolver { for (ValueArgument valueArgument : context.call.getValueArguments()) { JetExpression argumentExpression = valueArgument.getArgumentExpression(); - if (argumentExpression != null && (argumentExpression instanceof JetFunctionLiteralExpression)) { + if (argumentExpression != null && isFunctionLiteralArgument(argumentExpression)) { checkArgumentTypeWithNoCallee(context, argumentExpression); } } - - for (JetExpression expression : context.call.getFunctionLiteralArguments()) { - checkArgumentTypeWithNoCallee(context, expression); - } } private void checkArgumentTypeWithNoCallee(CallResolutionContext context, JetExpression argumentExpression) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt index f0f7ba8b8a3..03d04ea76b0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt @@ -211,10 +211,8 @@ public class CallCompleter( getDataFlowInfoForArgument = { context.dataFlowInfo } } - val arguments = context.call.getAllValueArguments() - - for (valueArgument in arguments) { - val argumentMapping = getArgumentMapping(valueArgument) + for (valueArgument in context.call.getValueArguments()) { + val argumentMapping = getArgumentMapping(valueArgument!!) val expectedType = when (argumentMapping) { is ArgumentMatch -> CandidateResolver.getEffectiveExpectedType(argumentMapping.valueParameter, valueArgument) else -> TypeUtils.NO_EXPECTED_TYPE diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 7009fadd9a6..01e17ceebe6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -20,12 +20,16 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.psi.PsiElement; +import kotlin.Function1; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; +import org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage; import org.jetbrains.jet.lang.resolve.calls.context.*; import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments; import org.jetbrains.jet.lang.resolve.calls.model.MutableResolvedCall; @@ -49,7 +53,6 @@ import javax.inject.Inject; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Set; import static org.jetbrains.jet.lang.diagnostics.Errors.NOT_A_CLASS; import static org.jetbrains.jet.lang.diagnostics.Errors.NO_CONSTRUCTOR; @@ -484,7 +487,7 @@ public class CallResolver { @NotNull private OverloadResolutionResultsImpl performResolutionGuardedForExtraFunctionLiteralArguments( - @NotNull ResolutionTask task, + @NotNull final ResolutionTask task, @NotNull CallTransformer callTransformer ) { OverloadResolutionResultsImpl results = performResolution(task, callTransformer); @@ -514,7 +517,13 @@ public class CallResolver { DelegatingCall callWithoutFLArgs = new DelegatingCall(task.call) { @NotNull @Override - public List getFunctionLiteralArguments() { + public List getValueArguments() { + return CallUtilPackage.getValueArgumentsInParentheses(task.call); + } + + @NotNull + @Override + public List getFunctionLiteralArguments() { return Collections.emptyList(); } }; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java index 2280b8c03b8..9ebfd4f4b30 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java @@ -166,7 +166,7 @@ public class CallTransformer { @NotNull @Override - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return Collections.emptyList(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index 9c8b9c00587..b33b4cab096 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -25,13 +25,10 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.psi.Call; -import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; -import org.jetbrains.jet.lang.psi.ValueArgument; +import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage; import org.jetbrains.jet.lang.resolve.calls.model.*; import org.jetbrains.jet.lang.resolve.calls.tasks.TracingStrategy; -import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; @@ -192,9 +189,9 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap public void process() { ProcessorState state = positionedOnly; - List arguments = call.getValueArguments(); - for (int i = 0; i < arguments.size(); i++) { - ValueArgument valueArgument = arguments.get(i); + List argumentsInParentheses = CallUtilPackage.getValueArgumentsInParentheses(call); + for (int i = 0; i < argumentsInParentheses.size(); i++) { + ValueArgument valueArgument = argumentsInParentheses.get(i); if (valueArgument.isNamed()) { state = state.processNamedArgument(valueArgument); } @@ -219,9 +216,10 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap D candidate = candidateCall.getCandidateDescriptor(); List valueParameters = candidate.getValueParameters(); - List functionLiteralArguments = call.getFunctionLiteralArguments(); + List functionLiteralArguments = call.getFunctionLiteralArguments(); if (!functionLiteralArguments.isEmpty()) { - JetExpression possiblyLabeledFunctionLiteral = functionLiteralArguments.get(0); + JetFunctionLiteralArgument functionLiteralArgument = functionLiteralArguments.get(0); + JetExpression possiblyLabeledFunctionLiteral = functionLiteralArgument.getArgumentExpression(); if (valueParameters.isEmpty()) { report(TOO_MANY_ARGUMENTS.on(possiblyLabeledFunctionLiteral, candidate)); @@ -239,13 +237,13 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap setStatus(WEAK_ERROR); } else { - putVararg(valueParameterDescriptor, CallMaker.makeValueArgument(possiblyLabeledFunctionLiteral)); + putVararg(valueParameterDescriptor, functionLiteralArgument); } } } for (int i = 1; i < functionLiteralArguments.size(); i++) { - JetExpression argument = functionLiteralArguments.get(i); + JetExpression argument = functionLiteralArguments.get(i).getArgumentExpression(); report(MANY_FUNCTION_LITERAL_ARGUMENTS.on(argument)); setStatus(WEAK_ERROR); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java index a9580f31f0f..67773161ebe 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java @@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lang.psi.codeFragmentUtil.CodeFragmentUtilPackage; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.calls.inference.*; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; @@ -167,9 +166,9 @@ public abstract class AbstractTracingStrategy implements TracingStrategy { } @Override - public void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments) { - for (JetExpression functionLiteralArgument : functionLiteralArguments) { - trace.report(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED.on(functionLiteralArgument)); + public void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments) { + for (JetFunctionLiteralArgument functionLiteralArgument : functionLiteralArguments) { + trace.report(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED.on(functionLiteralArgument.getArgumentExpression())); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java index 262350ed1dc..21a2f60e5e8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TracingStrategy.java @@ -22,7 +22,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.Call; -import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetFunctionLiteralArgument; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.calls.inference.InferenceErrorData; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; @@ -90,7 +90,7 @@ public interface TracingStrategy { public void unnecessarySafeCall(@NotNull BindingTrace trace, @NotNull JetType type) {} @Override - public void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments) {} + public void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments) {} @Override public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor) {} @@ -136,7 +136,7 @@ public interface TracingStrategy { void unnecessarySafeCall(@NotNull BindingTrace trace, @NotNull JetType type); - void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments); + void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments); void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/CallMaker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/CallMaker.java index aac330e9dc4..f4c45bf53ce 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/CallMaker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/CallMaker.java @@ -162,7 +162,7 @@ public class CallMaker { @NotNull @Override - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return Collections.emptyList(); } @NotNull @@ -301,7 +301,7 @@ public class CallMaker { @Override @NotNull - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return callElement.getFunctionLiteralArguments(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/DelegatingCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/DelegatingCall.java index 070791f76e4..5e4c5dd0c07 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/DelegatingCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/DelegatingCall.java @@ -70,7 +70,7 @@ public class DelegatingCall implements Call { @Override @NotNull - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return delegate.getFunctionLiteralArguments(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/callUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/callUtil.kt index b925969d5cb..f3de919919b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/callUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/util/callUtil.kt @@ -46,6 +46,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext.RESOLVED_CALL import org.jetbrains.kotlin.util.sure import org.jetbrains.jet.lang.psi.psiUtil.getTextWithLocation import org.jetbrains.jet.lang.descriptors.FunctionDescriptor +import org.jetbrains.jet.lang.psi.JetCallExpression +import org.jetbrains.jet.lang.psi.JetFunctionLiteralArgument // resolved call @@ -84,12 +86,12 @@ public fun Call.hasUnresolvedArguments(context: BindingContext): Boolean { } } -public fun Call.getAllValueArguments(): List { - val arguments = getValueArguments() + - getFunctionLiteralArguments().map { functionLiteral -> CallMaker.makeValueArgument(functionLiteral) } - [suppress("UNCHECKED_CAST")] - return arguments as List -} +public fun Call.getValueArgumentsInParentheses(): List = getValueArguments().filterArgsInParentheses() + +public fun JetCallExpression.getValueArgumentsInParentheses(): List = getValueArguments().filterArgsInParentheses() + +[suppress("UNCHECKED_CAST")] +private fun List.filterArgsInParentheses() = filter { it !is JetFunctionLiteralArgument } as List // Get call / resolved call from binding context diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java index 179e926b307..f68826c969a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java @@ -206,7 +206,7 @@ public class ControlStructureTypingUtils { @NotNull @Override - public List getFunctionLiteralArguments() { + public List getFunctionLiteralArguments() { return Collections.emptyList(); } @@ -470,7 +470,7 @@ public class ControlStructureTypingUtils { @Override public void danglingFunctionLiteralArgumentSuspected( - @NotNull BindingTrace trace, @NotNull List functionLiteralArguments + @NotNull BindingTrace trace, @NotNull List functionLiteralArguments ) { throwError(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 9e71da20338..700746049a5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -156,12 +156,7 @@ public class ExpressionTypingUtils { PsiElement parent = scopeDeclaration.getParent(); assert parent instanceof JetFunctionLiteralExpression : "parent of JetFunctionLiteral is " + parent; - JetCallExpression callExpression = getCallExpression((JetFunctionLiteralExpression) parent); - if (callExpression == null) { - return false; - } - - ResolvedCall resolvedCall = CallUtilPackage.getResolvedCall(callExpression, context); + ResolvedCall resolvedCall = CallUtilPackage.getParentResolvedCall((JetFunctionLiteralExpression) parent, context, true); if (resolvedCall == null) { return false; } @@ -177,26 +172,6 @@ public class ExpressionTypingUtils { } } - @Nullable - private static JetCallExpression getCallExpression(@NotNull JetFunctionLiteralExpression functionLiteralExpression) { - PsiElement parent = functionLiteralExpression.getParent(); - if (parent instanceof JetValueArgument) { - // foo({ ... }) or foo(f = { ... }) - - PsiElement valueArgumentList = parent.getParent(); - assert valueArgumentList instanceof JetValueArgumentList : "parent of value argument is " + valueArgumentList; - - if (valueArgumentList.getParent() instanceof JetCallExpression) { // may be argument list of annotation - return (JetCallExpression) valueArgumentList.getParent(); - } - } - else if (parent instanceof JetCallExpression) { - // foo { ... } - - return (JetCallExpression) parent; - } - return null; - } public static void checkCapturingInClosure(JetSimpleNameExpression expression, BindingTrace trace, JetScope scope) { VariableDescriptor variable = BindingContextUtils.extractVariableDescriptorIfAny(trace.getBindingContext(), expression, true); if (variable != null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java index 10f3b24b9cd..0eadd846114 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java @@ -94,9 +94,12 @@ public class LabelResolver { @Nullable private JetCallExpression getContainingCallExpression(@NotNull JetFunctionLiteralExpression expression) { PsiElement parent = expression.getParent(); - if (parent instanceof JetCallExpression) { + if (parent instanceof JetFunctionLiteralArgument) { // f {} - return (JetCallExpression) parent; + PsiElement call = parent.getParent(); + if (call instanceof JetCallExpression) { + return (JetCallExpression) call; + } } if (parent instanceof JetValueArgument) { diff --git a/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.kt b/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.kt index 9de1ae3232c..0d277cd3a25 100644 --- a/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.kt +++ b/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.kt @@ -55,7 +55,7 @@ fun main1() { 1.{Int.() -> 1}(); {1}(); {(x : Int) -> x}(1) - 1.{Int.(x : Int) -> x}(1) + 1.{Int.(x : Int) -> x}(1); @l{1}() 1.({Int.() -> 1})() 1.(f())() diff --git a/compiler/testData/psi/ByClauses.txt b/compiler/testData/psi/ByClauses.txt index d27ba2f3476..d451342650d 100644 --- a/compiler/testData/psi/ByClauses.txt +++ b/compiler/testData/psi/ByClauses.txt @@ -146,12 +146,13 @@ JetFile: ByClauses.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiElement(RPAR)(')') PsiWhiteSpace(' ') CLASS_BODY @@ -194,12 +195,13 @@ JetFile: ByClauses.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiElement(RBRACKET)(']') PsiWhiteSpace(' ') CLASS_BODY @@ -243,12 +245,13 @@ JetFile: ByClauses.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiElement(RPAR)(')') PsiWhiteSpace(' ') CLASS_BODY @@ -303,12 +306,13 @@ JetFile: ByClauses.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PsiElement(RBRACE)('}') PsiWhiteSpace(' ') diff --git a/compiler/testData/psi/CallWithManyClosures.txt b/compiler/testData/psi/CallWithManyClosures.txt index eec7a958b5c..ceae1bc2367 100644 --- a/compiler/testData/psi/CallWithManyClosures.txt +++ b/compiler/testData/psi/CallWithManyClosures.txt @@ -15,26 +15,29 @@ JetFile: CallWithManyClosures.kt PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PROPERTY PsiElement(val)('val') @@ -47,26 +50,29 @@ JetFile: CallWithManyClosures.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('f') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PROPERTY PsiElement(val)('val') @@ -79,12 +85,13 @@ JetFile: CallWithManyClosures.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('f') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PROPERTY PsiElement(val)('val') @@ -100,12 +107,13 @@ JetFile: CallWithManyClosures.kt PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PROPERTY PsiElement(val)('val') @@ -121,26 +129,29 @@ JetFile: CallWithManyClosures.kt PsiElement(IDENTIFIER)('f') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PROPERTY PsiElement(val)('val') @@ -159,26 +170,29 @@ JetFile: CallWithManyClosures.kt PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace('\n') PROPERTY PsiElement(val)('val') @@ -205,23 +219,26 @@ JetFile: CallWithManyClosures.kt PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') \ No newline at end of file + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/FunctionCalls.txt b/compiler/testData/psi/FunctionCalls.txt index e41f793b9d7..5923b141ca4 100644 --- a/compiler/testData/psi/FunctionCalls.txt +++ b/compiler/testData/psi/FunctionCalls.txt @@ -62,13 +62,14 @@ JetFile: FunctionCalls.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('i') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('s') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('s') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('j') @@ -86,15 +87,16 @@ JetFile: FunctionCalls.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('k') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('s') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('s') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') CALL_EXPRESSION REFERENCE_EXPRESSION @@ -106,15 +108,16 @@ JetFile: FunctionCalls.kt PsiElement(IDENTIFIER)('a') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('s') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('s') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') CALL_EXPRESSION REFERENCE_EXPRESSION @@ -155,15 +158,16 @@ JetFile: FunctionCalls.kt PsiElement(IDENTIFIER)('a') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('s') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('s') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') CALL_EXPRESSION REFERENCE_EXPRESSION @@ -490,4 +494,4 @@ JetFile: FunctionCalls.kt PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiWhiteSpace('\n') - PsiElement(RBRACE)('}') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/Labels.txt b/compiler/testData/psi/Labels.txt index fd1bc2b6d37..5b1aa09fa00 100644 --- a/compiler/testData/psi/Labels.txt +++ b/compiler/testData/psi/Labels.txt @@ -176,38 +176,39 @@ JetFile: Labels.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('filter') PsiWhiteSpace(' ') - LABELED_EXPRESSION - LABEL_QUALIFIER - LABEL - PsiElement(LABEL_IDENTIFIER)('@f') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - IF - PsiElement(if)('if') - PsiWhiteSpace(' ') - PsiElement(LPAR)('(') - CONDITION - INTEGER_CONSTANT - PsiElement(INTEGER_LITERAL)('1') - PsiElement(RPAR)(')') - PsiWhiteSpace(' ') - THEN - RETURN - PsiElement(return)('return') + FUNCTION_LITERAL_ARGUMENT + LABELED_EXPRESSION + LABEL_QUALIFIER + LABEL + PsiElement(LABEL_IDENTIFIER)('@f') + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') PsiWhiteSpace('\n ') - RETURN - PsiElement(return)('return') - LABEL_QUALIFIER - LABEL - PsiElement(LABEL_IDENTIFIER)('@f') - PsiWhiteSpace(' ') - BOOLEAN_CONSTANT - PsiElement(true)('true') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + BLOCK + IF + PsiElement(if)('if') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + THEN + RETURN + PsiElement(return)('return') + PsiWhiteSpace('\n ') + RETURN + PsiElement(return)('return') + LABEL_QUALIFIER + LABEL + PsiElement(LABEL_IDENTIFIER)('@f') + PsiWhiteSpace(' ') + BOOLEAN_CONSTANT + PsiElement(true)('true') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n ') DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION @@ -217,36 +218,37 @@ JetFile: Labels.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('filter') PsiWhiteSpace(' ') - LABELED_EXPRESSION - PsiErrorElement:Label must be named - PsiElement(LABEL_IDENTIFIER)('@') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - IF - PsiElement(if)('if') - PsiWhiteSpace(' ') - PsiElement(LPAR)('(') - CONDITION - INTEGER_CONSTANT - PsiElement(INTEGER_LITERAL)('1') - PsiElement(RPAR)(')') - PsiWhiteSpace(' ') - THEN - RETURN - PsiElement(return)('return') + FUNCTION_LITERAL_ARGUMENT + LABELED_EXPRESSION + PsiErrorElement:Label must be named + PsiElement(LABEL_IDENTIFIER)('@') + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') PsiWhiteSpace('\n ') - RETURN - PsiElement(return)('return') - PsiErrorElement:Label must be named - PsiElement(LABEL_IDENTIFIER)('@') - PsiWhiteSpace(' ') - BOOLEAN_CONSTANT - PsiElement(true)('true') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + BLOCK + IF + PsiElement(if)('if') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + THEN + RETURN + PsiElement(return)('return') + PsiWhiteSpace('\n ') + RETURN + PsiElement(return)('return') + PsiErrorElement:Label must be named + PsiElement(LABEL_IDENTIFIER)('@') + PsiWhiteSpace(' ') + BOOLEAN_CONSTANT + PsiElement(true)('true') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n ') THIS_EXPRESSION REFERENCE_EXPRESSION diff --git a/compiler/testData/psi/StringTemplates.txt b/compiler/testData/psi/StringTemplates.txt index 929754ef42a..0623021b4b5 100644 --- a/compiler/testData/psi/StringTemplates.txt +++ b/compiler/testData/psi/StringTemplates.txt @@ -290,13 +290,14 @@ JetFile: StringTemplates.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('map') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('foo') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + PsiElement(RBRACE)('}') PsiElement(LONG_TEMPLATE_ENTRY_END)('}') LITERAL_STRING_TEMPLATE_ENTRY PsiElement(REGULAR_STRING_PART)('sdfsdf') @@ -319,18 +320,19 @@ JetFile: StringTemplates.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('map') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace(' ') - BLOCK - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('foo') - PsiElement(CLOSING_QUOTE)('"') - PsiWhiteSpace(' ') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace(' ') + BLOCK + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace(' ') + PsiElement(RBRACE)('}') PsiElement(LONG_TEMPLATE_ENTRY_END)('}') LITERAL_STRING_TEMPLATE_ENTRY PsiElement(REGULAR_STRING_PART)('sdfsdf') @@ -353,35 +355,37 @@ JetFile: StringTemplates.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('map') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('foo') - SHORT_STRING_TEMPLATE_ENTRY - PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('sdf') - LONG_STRING_TEMPLATE_ENTRY - PsiElement(LONG_TEMPLATE_ENTRY_START)('${') - PsiWhiteSpace(' ') - CALL_EXPRESSION + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('buzz') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') - PsiElement(LONG_TEMPLATE_ENTRY_END)('}') - PsiElement(CLOSING_QUOTE)('"') - PsiWhiteSpace(' ') - PsiElement(RBRACE)('}') + PsiElement(IDENTIFIER)('sdf') + LONG_STRING_TEMPLATE_ENTRY + PsiElement(LONG_TEMPLATE_ENTRY_START)('${') + PsiWhiteSpace(' ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('buzz') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiElement(LONG_TEMPLATE_ENTRY_END)('}') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace(' ') + PsiElement(RBRACE)('}') PsiElement(LONG_TEMPLATE_ENTRY_END)('}') LITERAL_STRING_TEMPLATE_ENTRY PsiElement(REGULAR_STRING_PART)('sdfsdf') diff --git a/compiler/testData/psi/examples/Builder.txt b/compiler/testData/psi/examples/Builder.txt index 39bd3068cc1..b90e6d5b8d4 100644 --- a/compiler/testData/psi/examples/Builder.txt +++ b/compiler/testData/psi/examples/Builder.txt @@ -51,29 +51,30 @@ JetFile: Builder.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('library') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('classpath') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - SHORT_STRING_TEMPLATE_ENTRY - PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('libs') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('/groovy-...') - PsiElement(CLOSING_QUOTE)('"') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('classpath') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('libs') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('/groovy-...') + PsiElement(CLOSING_QUOTE)('"') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n ') PROPERTY MODIFIER_LIST @@ -97,55 +98,57 @@ JetFile: Builder.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('library') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - DOT_QUALIFIED_EXPRESSION + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK DOT_QUALIFIED_EXPRESSION + DOT_QUALIFIED_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('File') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('gantHome') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('/lib') + PsiElement(CLOSING_QUOTE)('"') + PsiElement(RPAR)(')') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('files') + PsiElement(DOT)('.') CALL_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('File') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - SHORT_STRING_TEMPLATE_ENTRY - PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('gantHome') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('/lib') - PsiElement(CLOSING_QUOTE)('"') - PsiElement(RPAR)(')') - PsiElement(DOT)('.') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('files') - PsiElement(DOT)('.') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('each') - PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('classpath') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT + PsiElement(IDENTIFIER)('each') + PsiWhiteSpace(' ') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + CALL_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + PsiElement(IDENTIFIER)('classpath') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n ') PROPERTY MODIFIER_LIST @@ -169,62 +172,63 @@ JetFile: Builder.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('module') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - BINARY_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('targetLevel') - PsiWhiteSpace(' ') - OPERATION_REFERENCE - PsiElement(EQ)('=') - PsiWhiteSpace(' ') - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('1.5') - PsiElement(CLOSING_QUOTE)('"') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') PsiWhiteSpace('\n ') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('classpath') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('antLayout') - PsiElement(COMMA)(',') + BLOCK + BINARY_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('targetLevel') PsiWhiteSpace(' ') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('gant') - PsiElement(COMMA)(',') + OPERATION_REFERENCE + PsiElement(EQ)('=') PsiWhiteSpace(' ') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('groovy') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('src') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - SHORT_STRING_TEMPLATE_ENTRY - PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('projectHome') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('/antLayout/src') - PsiElement(CLOSING_QUOTE)('"') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('1.5') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('classpath') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('antLayout') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('gant') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('groovy') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('src') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + SHORT_STRING_TEMPLATE_ENTRY + PsiElement(SHORT_TEMPLATE_ENTRY_START)('$') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('projectHome') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('/antLayout/src') + PsiElement(CLOSING_QUOTE)('"') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n') PsiElement(RBRACE)('}') PsiElement(DOT)('.') diff --git a/compiler/testData/psi/examples/Graph.txt b/compiler/testData/psi/examples/Graph.txt index e8e93234f9c..0cd91cb80b2 100644 --- a/compiler/testData/psi/examples/Graph.txt +++ b/compiler/testData/psi/examples/Graph.txt @@ -422,39 +422,41 @@ JetFile: Graph.kt CALL_EXPRESSION REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('filter') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - BINARY_EXPRESSION - DOT_QUALIFIED_EXPRESSION + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + BINARY_EXPRESSION + DOT_QUALIFIED_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('from') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(EQEQ)('==') + PsiWhiteSpace(' ') REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(DOT)('.') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('from') - PsiWhiteSpace(' ') - OPERATION_REFERENCE - PsiElement(EQEQ)('==') - PsiWhiteSpace(' ') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('v') - PsiElement(RBRACE)('}') + PsiElement(IDENTIFIER)('v') + PsiElement(RBRACE)('}') PsiElement(DOT)('.') CALL_EXPRESSION REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('map') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - DOT_QUALIFIED_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(DOT)('.') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('to') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + DOT_QUALIFIED_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('to') + PsiElement(RBRACE)('}') PsiWhiteSpace(' ') PsiComment(EOL_COMMENT)('// type is IIterable>') PsiWhiteSpace('\n\n ') @@ -528,30 +530,31 @@ JetFile: Graph.kt CALL_EXPRESSION REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('foreach') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('dfs') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('visited') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('handler') - PsiElement(RPAR)(')') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dfs') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('visited') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('handler') + PsiElement(RPAR)(')') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n ') FUN PsiElement(fun)('fun') @@ -683,30 +686,31 @@ JetFile: Graph.kt CALL_EXPRESSION REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('foreach') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('dfs') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('visited') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('handler') - PsiElement(RPAR)(')') - PsiElement(RBRACE)('}') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dfs') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('visited') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('handler') + PsiElement(RPAR)(')') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') @@ -810,174 +814,176 @@ JetFile: Graph.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('foreach') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - IF - PsiElement(if)('if') - PsiWhiteSpace(' ') - PsiElement(LPAR)('(') - CONDITION - PREFIX_EXPRESSION - OPERATION_REFERENCE - PsiElement(EXCL)('!') - DOT_QUALIFIED_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('visited') - PsiElement(DOT)('.') - CALL_EXPRESSION + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BLOCK + IF + PsiElement(if)('if') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + PREFIX_EXPRESSION + OPERATION_REFERENCE + PsiElement(EXCL)('!') + DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('add') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(RPAR)(')') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - THEN - CONTINUE - PsiElement(continue)('continue') - PsiWhiteSpace('\n ') - DOT_QUALIFIED_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('pending') - PsiElement(DOT)('.') - CALL_EXPRESSION + PsiElement(IDENTIFIER)('visited') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('add') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(RPAR)(')') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + THEN + CONTINUE + PsiElement(continue)('continue') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('push') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('it') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - WHILE - PsiElement(while)('while') - PsiWhiteSpace(' ') - PsiElement(LPAR)('(') - CONDITION - PREFIX_EXPRESSION - OPERATION_REFERENCE - PsiElement(EXCL)('!') - DOT_QUALIFIED_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('pending') - PsiElement(DOT)('.') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('isEmpty') - PsiElement(RPAR)(')') - PsiWhiteSpace(' ') - BODY - BLOCK - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - PROPERTY - PsiElement(val)('val') - PsiWhiteSpace(' ') - PsiElement(IDENTIFIER)('current') - PsiWhiteSpace(' ') - PsiElement(EQ)('=') - PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('pending') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('push') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('it') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + WHILE + PsiElement(while)('while') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + PREFIX_EXPRESSION + OPERATION_REFERENCE + PsiElement(EXCL)('!') DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('pending') PsiElement(DOT)('.') - CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('isEmpty') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BODY + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('current') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('pop') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('handler') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('current') - PsiElement(RPAR)(')') - PsiElement(SEMICOLON)(';') - PsiWhiteSpace('\n ') - DOT_QUALIFIED_EXPRESSION + PsiElement(IDENTIFIER)('pending') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('pop') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') CALL_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('neighbours') + PsiElement(IDENTIFIER)('handler') VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('current') PsiElement(RPAR)(')') - PsiElement(DOT)('.') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('foreach') - PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace(' ') - VALUE_PARAMETER_LIST - VALUE_PARAMETER - PsiElement(IDENTIFIER)('n') - PsiWhiteSpace(' ') - PsiElement(ARROW)('->') - PsiWhiteSpace('\n ') - BLOCK - IF - PsiElement(if)('if') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('neighbours') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('current') + PsiElement(RPAR)(')') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foreach') + PsiWhiteSpace(' ') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') PsiWhiteSpace(' ') - PsiElement(LPAR)('(') - CONDITION - DOT_QUALIFIED_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('visited') - PsiElement(DOT)('.') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('add') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('n') - PsiElement(RPAR)(')') - PsiElement(RPAR)(')') + VALUE_PARAMETER_LIST + VALUE_PARAMETER + PsiElement(IDENTIFIER)('n') PsiWhiteSpace(' ') - THEN - BLOCK - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - DOT_QUALIFIED_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('pending') - PsiElement(DOT)('.') - CALL_EXPRESSION + PsiElement(ARROW)('->') + PsiWhiteSpace('\n ') + BLOCK + IF + PsiElement(if)('if') + PsiWhiteSpace(' ') + PsiElement(LPAR)('(') + CONDITION + DOT_QUALIFIED_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('push') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT + PsiElement(IDENTIFIER)('visited') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('add') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('n') + PsiElement(RPAR)(')') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + THEN + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('pending') + PsiElement(DOT)('.') + CALL_EXPRESSION REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('n') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') - PsiWhiteSpace('\n ') - PsiComment(BLOCK_COMMENT)('/* alternative\n pending->push(neighbours(current).filter{n => !visited[n])})\n // -> means that if push(x : T) and actual parameter y is IIterable, this compiles into\n y.foreach{ n => push(n) }\n */') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + PsiElement(IDENTIFIER)('push') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('n') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiComment(BLOCK_COMMENT)('/* alternative\n pending->push(neighbours(current).filter{n => !visited[n])})\n // -> means that if push(x : T) and actual parameter y is IIterable, this compiles into\n y.foreach{ n => push(n) }\n */') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n ') PsiElement(RBRACE)('}') PsiWhiteSpace('\n') diff --git a/compiler/testData/psi/examples/With.txt b/compiler/testData/psi/examples/With.txt index 4400744bdcf..0c54da2ccbb 100644 --- a/compiler/testData/psi/examples/With.txt +++ b/compiler/testData/psi/examples/With.txt @@ -105,40 +105,41 @@ JetFile: With.kt PsiElement(IDENTIFIER)('out') PsiElement(RPAR)(')') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - PsiWhiteSpace('\n ') - BLOCK - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('println') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('foo') - PsiElement(CLOSING_QUOTE)('"') - PsiElement(RPAR)(')') - PsiElement(SEMICOLON)(';') + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') PsiWhiteSpace('\n ') - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('print') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - STRING_TEMPLATE - PsiElement(OPEN_QUOTE)('"') - LITERAL_STRING_TEMPLATE_ENTRY - PsiElement(REGULAR_STRING_PART)('bar') - PsiElement(CLOSING_QUOTE)('"') - PsiElement(RPAR)(')') - PsiElement(SEMICOLON)(';') - PsiWhiteSpace('\n ') - PsiElement(RBRACE)('}') + BLOCK + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('println') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('foo') + PsiElement(CLOSING_QUOTE)('"') + PsiElement(RPAR)(')') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('print') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + LITERAL_STRING_TEMPLATE_ENTRY + PsiElement(REGULAR_STRING_PART)('bar') + PsiElement(CLOSING_QUOTE)('"') + PsiElement(RPAR)(')') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n ') DOT_QUALIFIED_EXPRESSION DOT_QUALIFIED_EXPRESSION diff --git a/compiler/testData/psi/propertyDelegate/BracketsInDelegate.txt b/compiler/testData/psi/propertyDelegate/BracketsInDelegate.txt index a7ffe6f2240..1e8860234d1 100644 --- a/compiler/testData/psi/propertyDelegate/BracketsInDelegate.txt +++ b/compiler/testData/psi/propertyDelegate/BracketsInDelegate.txt @@ -13,9 +13,10 @@ JetFile: BracketsInDelegate.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('A') PsiWhiteSpace(' ') - FUNCTION_LITERAL_EXPRESSION - FUNCTION_LITERAL - PsiElement(LBRACE)('{') - BLOCK - - PsiElement(RBRACE)('}') \ No newline at end of file + FUNCTION_LITERAL_ARGUMENT + FUNCTION_LITERAL_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/resolve/calls/AbstractResolvedCallsTest.kt b/compiler/tests/org/jetbrains/jet/resolve/calls/AbstractResolvedCallsTest.kt index 9733991bcd0..c159b38d7fd 100644 --- a/compiler/tests/org/jetbrains/jet/resolve/calls/AbstractResolvedCallsTest.kt +++ b/compiler/tests/org/jetbrains/jet/resolve/calls/AbstractResolvedCallsTest.kt @@ -28,7 +28,6 @@ import java.io.File import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil import org.jetbrains.jet.lang.resolve.calls.model.ArgumentMapping import org.jetbrains.jet.lang.resolve.calls.model.ArgumentMatch -import org.jetbrains.jet.lang.resolve.calls.callUtil.getAllValueArguments import org.jetbrains.jet.renderer.DescriptorRenderer import com.intellij.openapi.util.io.FileUtil import org.jetbrains.jet.lang.psi.ValueArgument @@ -102,14 +101,14 @@ private fun ResolvedCall<*>.renderToText(): String { appendln("This object = ${getThisObject().getText()}") appendln("Receiver argument = ${getReceiverArgument().getText()}") - val valueArguments = getCall().getAllValueArguments() + val valueArguments = getCall().getValueArguments() if (!valueArguments.isEmpty()) { appendln() appendln("Value arguments mapping:") appendln() for (valueArgument in valueArguments) { - val argumentText = valueArgument.getText() + val argumentText = valueArgument!!.getText() val argumentMappingText = getArgumentMapping(valueArgument).getText() appendln("$argumentMappingText $argumentText") diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/surroundWith/statement/KotlinFunctionLiteralSurrounder.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/surroundWith/statement/KotlinFunctionLiteralSurrounder.java index b7e34dfdcae..8d9e9fbe962 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/surroundWith/statement/KotlinFunctionLiteralSurrounder.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/surroundWith/statement/KotlinFunctionLiteralSurrounder.java @@ -45,7 +45,7 @@ public class KotlinFunctionLiteralSurrounder extends KotlinStatementsSurrounder callExpression = (JetCallExpression) container.addAfter(callExpression, statements[statements.length - 1]); container.addBefore(psiFactory.createWhiteSpace(), callExpression); - JetFunctionLiteralExpression bodyExpression = (JetFunctionLiteralExpression) callExpression.getFunctionLiteralArguments().get(0); + JetFunctionLiteralExpression bodyExpression = callExpression.getFunctionLiteralArguments().get(0).getFunctionLiteral(); assert bodyExpression != null : "Body expression should exists for " + callExpression.getText(); JetBlockExpression blockExpression = bodyExpression.getBodyExpression(); assert blockExpression != null : "JetBlockExpression should exists for " + callExpression.getText(); diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java index 1b23052ea3d..0955997efbf 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java @@ -229,10 +229,10 @@ public class JetExpressionMover extends AbstractJetUpDownMover { (JetCallExpression) JetPsiUtil.getOutermostDescendantElement(element, down, IS_CALL_EXPRESSION); if (callExpression == null) return null; - List functionLiterals = callExpression.getFunctionLiteralArguments(); + List functionLiterals = callExpression.getFunctionLiteralArguments(); if (functionLiterals.isEmpty()) return null; - return ((JetFunctionLiteralExpression) functionLiterals.get(0)).getBodyExpression(); + return functionLiterals.get(0).getFunctionLiteral().getBodyExpression(); } @Nullable diff --git a/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt b/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt index 5aedb3d2081..04674955a29 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt @@ -57,6 +57,7 @@ import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace import org.jetbrains.jet.lang.psi.JetPrefixExpression import org.jetbrains.jet.lang.resolve.calls.util.DelegatingCall +import org.jetbrains.jet.lang.psi.JetFunctionLiteralArgument enum class Tail { COMMA @@ -82,18 +83,18 @@ class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: Mo private fun calculateForArgument(expressionWithType: JetExpression): Collection? { val argument = expressionWithType.getParent() as? JetValueArgument ?: return null if (argument.isNamed()) return null //TODO - support named arguments (also do not forget to check for presence of named arguments before) - val argumentList = argument.getParent() as JetValueArgumentList + val argumentList = argument.getParent() as? JetValueArgumentList ?: return null val argumentIndex = argumentList.getArguments().indexOf(argument) val callElement = argumentList.getParent() as? JetCallElement ?: return null return calculateForArgument(callElement, argumentIndex, false) } private fun calculateForFunctionLiteralArgument(expressionWithType: JetExpression): Collection? { - val callExpression = expressionWithType.getParent() as? JetCallExpression + val functionLiteralArgument = expressionWithType.getParent() as? JetFunctionLiteralArgument + val callExpression = functionLiteralArgument?.getParent() as? JetCallExpression if (callExpression != null) { - val arguments = callExpression.getFunctionLiteralArguments() - if (arguments.firstOrNull() == expressionWithType) { - return calculateForArgument(callExpression, callExpression.getValueArguments().size, true) + if (callExpression.getFunctionLiteralArguments().head?.getArgumentExpression() == expressionWithType) { + return calculateForArgument(callExpression, callExpression.getValueArguments().size - 1, true) } } return null diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt index 91bc1a754c6..69bc021a028 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt +++ b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt @@ -125,12 +125,12 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { beforeInside(COLON, EXTEND_COLON_ELEMENTS) { spaceIf(jetSettings.SPACE_BEFORE_EXTEND_COLON) } afterInside(COLON, EXTEND_COLON_ELEMENTS) { spaceIf(jetSettings.SPACE_AFTER_EXTEND_COLON) } - between(VALUE_ARGUMENT_LIST, FUNCTION_LITERAL_EXPRESSION).spaces(1) + between(VALUE_ARGUMENT_LIST, FUNCTION_LITERAL_ARGUMENT).spaces(1) beforeInside(ARROW, FUNCTION_LITERAL).spaceIf(jetSettings.SPACE_BEFORE_LAMBDA_ARROW) aroundInside(ARROW, FUNCTION_TYPE).spaceIf(jetSettings.SPACE_AROUND_FUNCTION_TYPE_ARROW) - betweenInside(REFERENCE_EXPRESSION, FUNCTION_LITERAL_EXPRESSION, CALL_EXPRESSION).spaces(1) + betweenInside(REFERENCE_EXPRESSION, FUNCTION_LITERAL_ARGUMENT, CALL_EXPRESSION).spaces(1) } custom { diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/ConvertAssertToIfWithThrowIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/ConvertAssertToIfWithThrowIntention.kt index 3f0b46cdee8..6f95fdbfa35 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/ConvertAssertToIfWithThrowIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/ConvertAssertToIfWithThrowIntention.kt @@ -41,9 +41,9 @@ public class ConvertAssertToIfWithThrowIntention : JetSelfTargetingIntention null } - return when (argument) { - is JetFunctionLiteralExpression -> argument - else -> null - } + return argument as? JetFunctionLiteralExpression } override fun isApplicableTo(element: JetExpression): Boolean { @@ -66,7 +63,7 @@ public class ConvertToForEachLoopIntention : JetSelfTargetingIntention (selector.getValueArguments().size() + selector.getFunctionLiteralArguments().size()) == 1 + is JetCallExpression -> selector.getValueArguments().size() == 1 else -> false } } diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaInsideParenthesesIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaInsideParenthesesIntention.kt index 321dcf85571..7b1ef01e95d 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaInsideParenthesesIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaInsideParenthesesIntention.kt @@ -17,38 +17,17 @@ package org.jetbrains.jet.plugin.intentions import com.intellij.openapi.editor.Editor -import org.jetbrains.jet.lang.psi.JetCallExpression -import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.psi.JetFunctionLiteralArgument +import org.jetbrains.jet.plugin.util.psiModificationUtil.moveInsideParentheses import org.jetbrains.jet.plugin.caches.resolve.getBindingContext -import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall -public class MoveLambdaInsideParenthesesIntention : JetSelfTargetingIntention( +public class MoveLambdaInsideParenthesesIntention : JetSelfTargetingIntention( "move.lambda.inside.parentheses", javaClass()) { - override fun isApplicableTo(element: JetCallExpression): Boolean = !element.getFunctionLiteralArguments().isEmpty() + override fun isApplicableTo(element: JetFunctionLiteralArgument): Boolean = true - override fun applyTo(element: JetCallExpression, editor: Editor) { - val typeArgs = element.getTypeArgumentList()?.getText() - val exprText = element.getCalleeExpression()?.getText() - if (exprText == null) return - val funName = if (!element.getTypeArguments().isEmpty() && typeArgs != null) "$exprText$typeArgs" else "$exprText" - val sb = StringBuilder() - sb.append("(") - for (value in element.getValueArguments()) { - if (value == null) continue - if (value.getArgumentName() != null) { - sb.append("${value.getArgumentName()?.getText()} = ${value.getArgumentExpression()?.getText()},") - } else { - sb.append("${value.getArgumentExpression()?.getText()},") - } - } - if (element.getValueArguments().any { it?.getArgumentName() != null}) { - val context = element.getBindingContext() - val resolvedCall = element.getResolvedCall(context) - val literalName = resolvedCall?.getResultingDescriptor()?.getValueParameters()?.last?.getName().toString() - sb.append("$literalName = ") - } - val newExpression = "$funName${sb.toString()}${element.getFunctionLiteralArguments()[0].getText()})" - element.replace(JetPsiFactory(element).createExpression(newExpression)) + override fun applyTo(element: JetFunctionLiteralArgument, editor: Editor) { + element.moveInsideParentheses(element.getBindingContext()) } -} \ No newline at end of file +} + diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaOutsideParenthesesIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaOutsideParenthesesIntention.kt index c3e4aa3f6a6..4114106eec1 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaOutsideParenthesesIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/MoveLambdaOutsideParenthesesIntention.kt @@ -22,6 +22,8 @@ import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetLabeledExpression +import org.jetbrains.jet.lang.psi.JetFunctionLiteralArgument +import org.jetbrains.jet.lang.resolve.calls.callUtil.getValueArgumentsInParentheses public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention( "move.lambda.outside.parentheses", javaClass()) { @@ -31,17 +33,17 @@ public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention 0 && isLambdaOrLabeledLambda(args.last?.getArgumentExpression()) } override fun applyTo(element: JetCallExpression, editor: Editor) { - val args = element.getValueArguments() + val args = element.getValueArgumentsInParentheses() val functionLiteral = args.last!!.getArgumentExpression()?.getText() val calleeText = element.getCalleeExpression()?.getText() if (calleeText == null || functionLiteral == null) return - val params = args.subList(0, args.size - 1).map { it?.asElement()?.getText() ?: "" }.makeString(", ", "(", ")") + val params = args.subList(0, args.size - 1).map { it.asElement().getText() ?: "" }.joinToString(", ", "(", ")") val newCall = if (params == "()") { diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/attributeCallReplacements/AttributeCallReplacementIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/attributeCallReplacements/AttributeCallReplacementIntention.kt index 7aafb19d916..03b97c45a15 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/attributeCallReplacements/AttributeCallReplacementIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/attributeCallReplacements/AttributeCallReplacementIntention.kt @@ -44,7 +44,7 @@ public class CallDescription internal ( get() = callElement.getCalleeExpression()?.getText() public val argumentCount: Int - get() = callElement.getValueArguments().size + callElement.getFunctionLiteralArguments().size + get() = callElement.getValueArguments().size public val hasTypeArguments: Boolean get() = callElement.getTypeArgumentList() != null diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddSemicolonAfterFunctionCallFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddSemicolonAfterFunctionCallFix.java index e8f373fe1f0..d98e84843f3 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddSemicolonAfterFunctionCallFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddSemicolonAfterFunctionCallFix.java @@ -23,20 +23,17 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.psi.JetCallExpression; -import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.plugin.JetBundle; import static org.jetbrains.jet.lang.psi.PsiPackage.JetPsiFactory; public class AddSemicolonAfterFunctionCallFix extends JetIntentionAction { - JetFunctionLiteralExpression literal; + private final JetFunctionLiteralArgument functionLiteralArgument; - public AddSemicolonAfterFunctionCallFix(@NotNull JetCallExpression element, @NotNull JetFunctionLiteralExpression literal) { + public AddSemicolonAfterFunctionCallFix(@NotNull JetCallExpression element, @NotNull JetFunctionLiteralArgument functionLiteralArgument) { super(element); - this.literal = literal; + this.functionLiteralArgument = functionLiteralArgument; } @NotNull @@ -59,8 +56,8 @@ public class AddSemicolonAfterFunctionCallFix extends JetIntentionAction())!! + //todo use the right binding context + functionLiteralArgument.moveInsideParenthesesAndReplaceWith(wrappedCall, BindingContext.EMPTY) return } - - val argumentListExt = psiFactory.createCallArguments("(${wrappedCall.getText()})") - val argumentList = enclosingCall.getValueArgumentList() - if (argumentList == null) { - (anchor.getPrevSibling() as? PsiWhiteSpace)?.let { it.delete() } - anchor.replace(argumentListExt) - return - } - - val newArgText = (argumentList.getArguments() + argumentListExt.getArguments()).map { it.getText() }.joinToString(", ", "(", ")") - argumentList.replace(psiFactory.createCallArguments(newArgText)) - anchor.delete() + anchor.replace(wrappedCall) } fun makeCall(function: JetNamedFunction): JetNamedFunction { diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java b/idea/src/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java index 48f971231f8..3f04d3317b3 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java @@ -31,10 +31,12 @@ import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.analyzer.AnalyzerPackage; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.ObservableBindingTrace; @@ -57,6 +59,7 @@ import org.jetbrains.jet.plugin.refactoring.JetNameValidatorImpl; import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle; import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil; import org.jetbrains.jet.plugin.refactoring.introduce.KotlinIntroduceHandlerBase; +import org.jetbrains.jet.plugin.util.psiModificationUtil.PsiModificationUtilPackage; import org.jetbrains.jet.renderer.DescriptorRenderer; import java.util.*; @@ -98,7 +101,6 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { } final JetExpression expression = _expression; boolean noTypeInference = false; - boolean needParentheses = false; if (expression.getParent() instanceof JetQualifiedExpression) { JetQualifiedExpression qualifiedExpression = (JetQualifiedExpression)expression.getParent(); if (qualifiedExpression.getReceiverExpression() != expression) { @@ -109,13 +111,6 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { else if (expression instanceof JetStatementExpression) { showErrorHint(project, editor, JetRefactoringBundle.message("cannot.refactor.no.expression")); return; - } else if (expression.getParent() instanceof JetCallElement) { - if (expression instanceof JetFunctionLiteralExpression) { - needParentheses = true; - } else { - showErrorHint(project, editor, JetRefactoringBundle.message("cannot.refactor.no.expression")); - return; - } } else if (expression.getParent() instanceof JetOperationExpression) { JetOperationExpression operationExpression = (JetOperationExpression)expression.getParent(); @@ -126,7 +121,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { } ResolveSessionForBodies resolveSession = ResolvePackage.getLazyResolveSession(expression); - BindingContext bindingContext = resolveSession.resolveToElement(expression); + final BindingContext bindingContext = resolveSession.resolveToElement(expression); final JetType expressionType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression); //can be null or error type JetScope scope = bindingContext.get(BindingContext.RESOLUTION_SCOPE, expression); if (scope != null) { @@ -176,7 +171,6 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { } final boolean finalNoTypeInference = noTypeInference; - final boolean finalNeedParentheses = needParentheses; Pass callback = new Pass() { @Override public void pass(OccurrencesChooser.ReplaceChoice replaceChoice) { @@ -203,9 +197,10 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { final Ref propertyRef = new Ref(); final ArrayList references = new ArrayList(); final Ref reference = new Ref(); - final Runnable introduceRunnable = introduceVariable(expression, suggestedNames, allReplaces, commonContainer, - commonParent, replaceOccurrence, propertyRef, references, - reference, finalNoTypeInference, finalNeedParentheses, expressionType); + final Runnable introduceRunnable = introduceVariable( + expression, suggestedNames, allReplaces, commonContainer, + commonParent, replaceOccurrence, propertyRef, references, + reference, finalNoTypeInference, expressionType, bindingContext); final boolean finalReplaceOccurrence = replaceOccurrence; CommandProcessor.getInstance().executeCommand(project, new Runnable() { @Override @@ -250,9 +245,10 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { final ArrayList references, final Ref reference, final boolean noTypeInference, - final boolean needParentheses, - final JetType expressionType + final JetType expressionType, + final BindingContext bindingContext ) { + final JetPsiFactory psiFactory = JetPsiFactory(expression); return new Runnable() { @Override public void run() { @@ -274,7 +270,6 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { else { variableText += expression.getText(); } - JetPsiFactory psiFactory = JetPsiFactory(expression); JetProperty property = psiFactory.createProperty(variableText); PsiElement anchor = calculateAnchor(commonParent, commonContainer, allReplaces); if (anchor == null) return; @@ -291,15 +286,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { emptyBody.addAfter(psiFactory.createNewLine(), firstChild); if (replaceOccurrence && commonContainer != null) { for (JetExpression replace : allReplaces) { - boolean isActualExpression = expression == replace; - if (!needParentheses && !(replace.getParent() instanceof JetCallExpression)) { - JetExpression element = (JetExpression) replace.replace(psiFactory.createExpression(suggestedNames[0])); - if (isActualExpression) reference.set(element); - } else { - JetValueArgumentList argumentList = psiFactory.createCallArguments("(" + suggestedNames[0] + ")"); - JetValueArgumentList element = (JetValueArgumentList) replace.replace(argumentList); - if (isActualExpression) reference.set(element.getArguments().get(0).getArgumentExpression()); - } + replaceExpression(replace); } PsiElement oldElement = commonContainer; if (commonContainer instanceof JetWhenEntry) { @@ -390,22 +377,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { } for (JetExpression replace : allReplaces) { if (replaceOccurrence && !needBraces) { - boolean isActualExpression = expression == replace; - - if (!needParentheses && !(replace.getParent() instanceof JetCallExpression)) { - JetExpression element = - (JetExpression)replace.replace(psiFactory.createExpression(suggestedNames[0])); - references.add(element); - if (isActualExpression) reference.set(element); - } else { - JetValueArgumentList argumentList = psiFactory.createCallArguments("(" + suggestedNames[0] + ")"); - JetValueArgumentList element = (JetValueArgumentList) replace.replace(argumentList); - JetExpression argumentExpression = element.getArguments().get(0).getArgumentExpression(); - references.add(argumentExpression); - if (isActualExpression) { - reference.set(argumentExpression); - } - } + replaceExpression(replace); } else if (!needBraces) { replace.delete(); @@ -416,6 +388,25 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { ShortenReferences.INSTANCE$.process(property); } } + + private void replaceExpression(JetExpression replace) { + boolean isActualExpression = expression == replace; + + JetExpression replacement = psiFactory.createExpression(suggestedNames[0]); + JetExpression result; + if (PsiUtilPackage.isFunctionLiteralOutsideParentheses(replace)) { + JetFunctionLiteralArgument functionLiteralArgument = + PsiTreeUtil.getParentOfType(replace, JetFunctionLiteralArgument.class); + JetCallExpression newCallExpression = PsiModificationUtilPackage + .moveInsideParenthesesAndReplaceWith(functionLiteralArgument, replacement, bindingContext); + result = KotlinPackage.last(newCallExpression.getValueArguments()).getArgumentExpression(); + } + else { + result = (JetExpression)replace.replace(replacement); + } + references.add(result); + if (isActualExpression) reference.set(result); + } }; } diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java index ae5eb638b4b..e27f4e586cf 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java @@ -81,19 +81,13 @@ class JetInvokeFunctionReference extends JetSimpleReference i } } - List functionLiteralArguments = getExpression().getFunctionLiteralArguments(); - for (JetExpression functionLiteralArgument : functionLiteralArguments) { - while (functionLiteralArgument instanceof JetLabeledExpression) { - functionLiteralArgument = ((JetLabeledExpression) functionLiteralArgument).getBaseExpression(); - } - - if (functionLiteralArgument instanceof JetFunctionLiteralExpression) { - JetFunctionLiteralExpression functionLiteralExpression = (JetFunctionLiteralExpression) functionLiteralArgument; - list.add(getRange(functionLiteralExpression.getLeftCurlyBrace())); - ASTNode rightCurlyBrace = functionLiteralExpression.getRightCurlyBrace(); - if (rightCurlyBrace != null) { - list.add(getRange(rightCurlyBrace)); - } + List functionLiteralArguments = getExpression().getFunctionLiteralArguments(); + for (JetFunctionLiteralArgument functionLiteralArgument : functionLiteralArguments) { + JetFunctionLiteralExpression functionLiteralExpression = functionLiteralArgument.getFunctionLiteral(); + list.add(getRange(functionLiteralExpression.getLeftCurlyBrace())); + ASTNode rightCurlyBrace = functionLiteralExpression.getRightCurlyBrace(); + if (rightCurlyBrace != null) { + list.add(getRange(rightCurlyBrace)); } } diff --git a/idea/src/org/jetbrains/jet/plugin/util/JetPsiMatcher.java b/idea/src/org/jetbrains/jet/plugin/util/JetPsiMatcher.java index 7461b0697cb..1ac0a8088c5 100644 --- a/idea/src/org/jetbrains/jet/plugin/util/JetPsiMatcher.java +++ b/idea/src/org/jetbrains/jet/plugin/util/JetPsiMatcher.java @@ -121,8 +121,7 @@ public class JetPsiMatcher { if (!checkElementMatch(call1.getCalleeExpression(), call2.getCalleeExpression())) return false; - return checkListMatch(call1.getValueArguments(), call2.getValueArguments(), VALUE_ARGUMENT_CHECKER) && - checkListMatch(call1.getFunctionLiteralArguments(), call2.getFunctionLiteralArguments()); + return checkListMatch(call1.getValueArguments(), call2.getValueArguments(), VALUE_ARGUMENT_CHECKER); } @Override diff --git a/idea/src/org/jetbrains/jet/plugin/util/psiModificationUtil.kt b/idea/src/org/jetbrains/jet/plugin/util/psiModificationUtil.kt new file mode 100644 index 00000000000..6a96da38511 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/util/psiModificationUtil.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.util.psiModificationUtil + +import org.jetbrains.jet.lang.psi.JetFunctionLiteralArgument +import org.jetbrains.jet.lang.psi.JetCallExpression +import org.jetbrains.jet.lang.psi.JetExpression +import org.jetbrains.jet.lang.resolve.BindingContext +import org.jetbrains.jet.lang.resolve.calls.callUtil.getValueArgumentsInParentheses +import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.jet.lang.resolve.calls.model.ArgumentMatch +import org.jetbrains.jet.lang.psi.JetPsiFactory +import com.intellij.psi.PsiWhiteSpace + +fun JetFunctionLiteralArgument.moveInsideParentheses(bindingContext: BindingContext): JetCallExpression { + return moveInsideParenthesesAndReplaceWith(this.getArgumentExpression(), bindingContext) +} + +fun JetFunctionLiteralArgument.moveInsideParenthesesAndReplaceWith( + replacement: JetExpression, + bindingContext: BindingContext +): JetCallExpression { + val oldCallExpression = getParent() as JetCallExpression + val newCallExpression = oldCallExpression.copy() as JetCallExpression + + val psiFactory = JetPsiFactory(getProject()) + val argument = if (newCallExpression.getValueArgumentsInParentheses().any { it.getArgumentName() != null }) { + val resolvedCall = oldCallExpression.getResolvedCall(bindingContext) + val name = (resolvedCall?.getArgumentMapping(this) as? ArgumentMatch)?.valueParameter?.getName()?.toString() + psiFactory.createArgumentWithName(name, replacement) + } + else { + psiFactory.createArgument(replacement) + } + + val functionLiteralArgument = newCallExpression.getFunctionLiteralArguments().head!! + val valueArgumentList = newCallExpression.getValueArgumentList() ?: psiFactory.createCallArguments("()") + + val closingParenthesis = valueArgumentList.getLastChild() + if (valueArgumentList.getArguments().isNotEmpty()) { + valueArgumentList.addBefore(psiFactory.createComma(), closingParenthesis) + valueArgumentList.addBefore(psiFactory.createWhiteSpace(), closingParenthesis) + } + valueArgumentList.addBefore(argument, closingParenthesis) + + (functionLiteralArgument.getPrevSibling() as? PsiWhiteSpace)?.delete() + if (newCallExpression.getValueArgumentList() != null) { + functionLiteralArgument.delete() + } + else { + functionLiteralArgument.replace(valueArgumentList) + } + return oldCallExpression.replace(newCallExpression) as JetCallExpression +} + diff --git a/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt new file mode 100644 index 00000000000..9baeb9c4c9b --- /dev/null +++ b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: true +fun foo() { + bar(2) @l{ it * 3 } +} + +fun bar(a: Int, b: (Int) -> Int) { + b(a) +} diff --git a/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt.after b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt.after new file mode 100644 index 00000000000..e582c3be472 --- /dev/null +++ b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt.after @@ -0,0 +1,8 @@ +// IS_APPLICABLE: true +fun foo() { + bar(2, @l{ it * 3 }) +} + +fun bar(a: Int, b: (Int) -> Int) { + b(a) +} diff --git a/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt new file mode 100644 index 00000000000..051018e7fd7 --- /dev/null +++ b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: true +fun foo() { + bar @l{ it * 3 } +} + +fun bar(b: (Int) -> Int) { + b(42) +} diff --git a/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt.after b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt.after new file mode 100644 index 00000000000..081d675b1c6 --- /dev/null +++ b/idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt.after @@ -0,0 +1,8 @@ +// IS_APPLICABLE: true +fun foo() { + bar(@l{ it * 3 }) +} + +fun bar(b: (Int) -> Int) { + b(42) +} diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/intentions/IntentionTestGenerated.java index 85ddc96d065..2567831c8f0 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/IntentionTestGenerated.java @@ -3616,6 +3616,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest("idea/testData/intentions/moveLambdaInsideParentheses/inapplicable2.kt"); } + @TestMetadata("moveLabeledLambda1.kt") + public void testMoveLabeledLambda1() throws Exception { + doTest("idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda1.kt"); + } + + @TestMetadata("moveLabeledLambda2.kt") + public void testMoveLabeledLambda2() throws Exception { + doTest("idea/testData/intentions/moveLambdaInsideParentheses/moveLabeledLambda2.kt"); + } + @TestMetadata("moveLambda1.kt") public void testMoveLambda1() throws Exception { doTest("idea/testData/intentions/moveLambdaInsideParentheses/moveLambda1.kt");