From 3079b60adb00ae072375b66e43aee4bb3b5e7ec5 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 30 Oct 2018 17:52:08 +0300 Subject: [PATCH] [groovy] get rid of GrMultiSignature and visitors, use GrSignature and List instead --- .../type/GroovyTypeCheckVisitorHelper.java | 5 +- .../gpp/GppClosureParameterTypeProvider.java | 9 +- .../plugins/groovy/gpp/GppTypeConverter.java | 20 +- .../closureParameters/ClosureDescriptor.java | 22 +- .../lang/psi/GroovyPsiElementFactory.java | 21 +- .../api/signatures/GrClosureSignature.java | 43 --- .../psi/api/signatures/GrMultiSignature.java | 7 - .../GrRecursiveSignatureVisitor.java | 30 -- .../lang/psi/api/signatures/GrSignature.java | 39 +- .../api/signatures/GrSignatureVisitor.java | 31 -- .../controlFlow/impl/ArgumentInstruction.java | 20 +- .../groovy/lang/psi/impl/GrClosureType.java | 57 ++- .../psi/impl/GroovyPsiElementFactoryImpl.java | 4 +- .../signatures/GrClosableSignatureImpl.java | 34 +- .../signatures/GrClosureSignatureUtil.java | 339 ++++++++---------- .../GrClosureSignatureWithNewParameters.java | 37 +- .../GrImmediateClosureSignatureImpl.java | 44 +-- .../signatures/GrMethodSignatureImpl.java | 21 +- .../impl/signatures/GrMultiSignatureImpl.java | 73 ---- .../groovy/lang/psi/impl/signatures/curry.kt | 12 + .../statements/expressions/TypesUtil.java | 20 +- .../DefaultCallExpressionTypeCalculator.java | 4 +- .../groovy/lang/psi/util/GdkMethodUtil.java | 23 +- .../plugins/groovy/lang/psi/util/PsiUtil.java | 31 +- .../groovy/lang/resolve/ResolveUtil.java | 4 +- .../delegatesTo/DefaultDelegatesToProvider.kt | 8 +- .../processors/SubstitutorComputer.java | 6 +- .../ConvertClosureToMethodIntention.java | 25 +- .../ConvertParameterToMapEntryIntention.java | 6 +- .../GroovyParameterInfoHandler.java | 24 +- .../GrMethodCallUsageInfo.java | 20 +- .../changeSignature/GrMethodConflictUtil.java | 47 +-- .../AnonymousFromMapGenerator.java | 20 +- .../convertToJava/ArgumentListGenerator.java | 20 +- .../convertToJava/ClassItemGeneratorImpl.java | 21 +- .../convertToJava/ExpressionGenerator.java | 6 +- .../convertToJava/TypeProvider.java | 20 +- .../inline/GroovyInlineMethodUtil.java | 6 +- .../GrIntroduceClosureParameterProcessor.java | 6 +- .../GroovyIntroduceParameterUtil.java | 4 +- ...troduceParameterMethodUsagesProcessor.java | 4 +- .../java2groovy/OldReferencesResolver.java | 8 +- .../JavaSafeDeleteDelegateForGroovy.java | 26 +- 43 files changed, 357 insertions(+), 870 deletions(-) delete mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrClosureSignature.java delete mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrMultiSignature.java delete mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrRecursiveSignatureVisitor.java delete mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignatureVisitor.java delete mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMultiSignatureImpl.java create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/curry.kt diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/type/GroovyTypeCheckVisitorHelper.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/type/GroovyTypeCheckVisitorHelper.java index 6b446d9b5d98..1ae65530b4d8 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/type/GroovyTypeCheckVisitorHelper.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/type/GroovyTypeCheckVisitorHelper.java @@ -20,7 +20,6 @@ import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; @@ -116,8 +115,8 @@ public class GroovyTypeCheckVisitorHelper { if (args == null) return LocalQuickFix.EMPTY_ARRAY; final List> allErrors = new ArrayList<>(); - final List signatures = GrClosureSignatureUtil.generateSimpleSignatures(signature); - for (GrClosureSignature closureSignature : signatures) { + final List signatures = GrClosureSignatureUtil.generateSimpleSignatures(Collections.singletonList(signature)); + for (GrSignature closureSignature : signatures) { final GrClosureSignatureUtil.MapResultWithError map = GrClosureSignatureUtil.mapSimpleSignatureWithErrors( closureSignature, argumentTypes, id, argumentList, 255 ); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java index 2e371eab20b1..757e46371671 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppClosureParameterTypeProvider.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -113,8 +114,12 @@ public class GppClosureParameterTypeProvider extends AbstractClosureParameterEnh @Nullable public static PsiType getSingleMethodParameterType(@Nullable PsiType type, int index, GrClosableBlock closure) { final PsiType[] signature = findSingleAbstractMethodSignature(type); - if (signature != null && GrClosureSignatureUtil.isSignatureApplicable(GrClosureSignatureUtil.createSignature(closure), signature, closure)) { - return signature.length > index ? signature[index] : PsiType.NULL; + if (signature == null) { + return null; + } + final GrSignature closureSignature = GrClosureSignatureUtil.createSignature(closure); + if (GrClosureSignatureUtil.isSignatureApplicable(Collections.singletonList(closureSignature), signature, closure)) { + return signature.length > index ? signature[index] : PsiType.NULL; } return null; } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index 67c222cabef4..18b57ae20f75 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.gpp; import com.intellij.psi.PsiClass; @@ -30,6 +16,8 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureU import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.ConversionResult; import org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.GrTypeConverter; +import java.util.List; + import static org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil.canAssign; /** @@ -73,7 +61,7 @@ public class GppTypeConverter extends GrTypeConverter { } public static boolean isClosureOverride(PsiType[] methodParameters, GrClosureType closureType, GroovyPsiElement context) { - final GrSignature signature = closureType.getSignature(); + final List signature = closureType.getSignatures(); if (methodParameters != null && GrClosureSignatureUtil.isSignatureApplicable(signature, methodParameters, context)) { return true; } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/completion/closureParameters/ClosureDescriptor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/completion/closureParameters/ClosureDescriptor.java index fe0ad8a746f9..031133438fd2 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/completion/closureParameters/ClosureDescriptor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/completion/closureParameters/ClosureDescriptor.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.completion.closureParameters; import com.intellij.psi.*; @@ -25,7 +11,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyLanguage; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil; import java.util.ArrayList; @@ -87,13 +73,13 @@ public class ClosureDescriptor extends LightElement implements PsiElement { final boolean isConstructor = Boolean.TRUE.equals(myMethod.get("constructor")); final MethodSignature signature = MethodSignatureUtil .createMethodSignature(name, types.toArray(PsiType.createArray(types.size())), method.getTypeParameters(), PsiSubstitutor.EMPTY, isConstructor); - final GrClosureSignature closureSignature = GrClosureSignatureUtil.createSignature(signature); + final GrSignature closureSignature = GrClosureSignatureUtil.createSignature(signature); if (method instanceof ClsMethodImpl) method = ((ClsMethodImpl)method).getSourceMirrorMethod(); final PsiParameter[] parameters = method.getParameterList().getParameters(); final PsiType[] typeArray = ContainerUtil.map(parameters, parameter -> parameter.getType(), PsiType.createArray(parameters.length)); - return GrClosureSignatureUtil.isSignatureApplicable(closureSignature, typeArray, place); + return GrClosureSignatureUtil.isSignatureApplicable(Collections.singletonList(closureSignature), typeArray, place); } private static PsiType convertToPsiType(String type, @NotNull PsiElement place) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java index 04e6261c6946..66b1a6342f31 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java @@ -1,19 +1,4 @@ -/* - * Copyright 2000-2016 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. - */ - +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi; import com.intellij.openapi.components.ServiceManager; @@ -28,7 +13,7 @@ import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocMemberReference; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; @@ -260,7 +245,7 @@ public abstract class GroovyPsiElementFactory implements JVMElementFactory { public abstract GrAnnotation createAnnotationFromText(@NotNull @NonNls String annotationText, @Nullable PsiElement context) throws IncorrectOperationException; @NotNull - public abstract GrMethod createMethodFromSignature(@NotNull String name, @NotNull GrClosureSignature signature); + public abstract GrMethod createMethodFromSignature(@NotNull String name, @NotNull GrSignature signature); @NotNull public GrMethod createMethodFromText(@NotNull CharSequence methodText) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrClosureSignature.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrClosureSignature.java deleted file mode 100644 index 410615f8e709..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrClosureSignature.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000-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.plugins.groovy.lang.psi.api.signatures; - -import com.intellij.psi.PsiSubstitutor; -import com.intellij.psi.PsiType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; - -/** - * @author Maxim.Medvedev - */ -public interface GrClosureSignature extends GrSignature { - GrClosureSignature[] EMPTY_ARRAY = new GrClosureSignature[0]; - - @NotNull PsiSubstitutor getSubstitutor(); - - @NotNull - GrClosureParameter[] getParameters(); - - int getParameterCount(); - - boolean isVarargs(); - - @Nullable - PsiType getReturnType(); - - boolean isCurried(); -} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrMultiSignature.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrMultiSignature.java deleted file mode 100644 index e879dc0871b7..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrMultiSignature.java +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package org.jetbrains.plugins.groovy.lang.psi.api.signatures; - -public interface GrMultiSignature extends GrSignature { - - GrClosureSignature[] getAllSignatures(); -} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrRecursiveSignatureVisitor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrRecursiveSignatureVisitor.java deleted file mode 100644 index bde9e49ea0ef..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrRecursiveSignatureVisitor.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2000-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.plugins.groovy.lang.psi.api.signatures; - -/** - * @author Max Medvedev - */ -public abstract class GrRecursiveSignatureVisitor extends GrSignatureVisitor { - @Override - public void visitMultiSignature(GrMultiSignature signature) { - super.visitMultiSignature(signature); - - for (GrClosureSignature s : signature.getAllSignatures()) { - s.accept(this); - } - } -} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignature.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignature.java index f4de174288d2..fe9244917935 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignature.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignature.java @@ -1,33 +1,28 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.api.signatures; -import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiSubstitutor; import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; -/** - * @author Max Medvedev - */ public interface GrSignature { + boolean isValid(); - @Nullable - GrSignature curry(@NotNull PsiType[] args, int position, @NotNull PsiElement context); + @NotNull + PsiSubstitutor getSubstitutor(); - void accept(@NotNull GrSignatureVisitor visitor); + @NotNull + GrClosureParameter[] getParameters(); + + int getParameterCount(); + + boolean isVarargs(); + + @Nullable + PsiType getReturnType(); + + boolean isCurried(); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignatureVisitor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignatureVisitor.java deleted file mode 100644 index c4b34c6c4568..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/api/signatures/GrSignatureVisitor.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000-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.plugins.groovy.lang.psi.api.signatures; - -/** -* @author Max Medvedev -*/ -public abstract class GrSignatureVisitor { - public void visitClosureSignature(GrClosureSignature signature){ - visitSignature(signature); - } - - public void visitSignature(GrSignature signature){} - - public void visitMultiSignature(GrMultiSignature signature){ - visitSignature(signature); - } -} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ArgumentInstruction.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ArgumentInstruction.java index 76dfc126c94e..00c29e61f8bd 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ArgumentInstruction.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ArgumentInstruction.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.controlFlow.impl; import com.intellij.openapi.diagnostic.Logger; @@ -23,7 +9,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; @@ -60,7 +46,7 @@ public class ArgumentInstruction extends InstructionImpl implements MixinTypeIns PsiType result = null; for (GroovyResolveResult variant : variants) { - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(variant); + GrSignature signature = GrClosureSignatureUtil.createSignature(variant); if (signature == null) continue; if (GrClosureSignatureUtil.mapParametersToArguments(signature, call) != null && !haveNullParameters(call)) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClosureType.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClosureType.java index edfcdb3e3a04..756e6928b2e2 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClosureType.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClosureType.java @@ -5,47 +5,49 @@ import com.intellij.openapi.util.Comparing; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; +import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.CurryKt; import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** * @author ven */ public class GrClosureType extends GrLiteralClassType { - private final GrSignature mySignature; + + private final List mySignatures; private volatile PsiType[] myTypeArgs; private GrClosableBlock myClosure; private GrClosureType(@NotNull LanguageLevel languageLevel, @NotNull GlobalSearchScope scope, @NotNull JavaPsiFacade facade, - @NotNull GrSignature closureSignature, + @NotNull List signatures, boolean shouldInferTypeParameters) { super(languageLevel, scope, facade); - mySignature = closureSignature; + mySignatures = signatures; if (!shouldInferTypeParameters) myTypeArgs = PsiType.EMPTY_ARRAY; } private GrClosureType(@NotNull LanguageLevel level, @NotNull GlobalSearchScope scope, @NotNull JavaPsiFacade facade, - @NotNull GrSignature signature, + @NotNull List signatures, @Nullable PsiType[] typeArgs) { super(level, scope, facade); - - mySignature = signature; + mySignatures = signatures; myTypeArgs = typeArgs; } @@ -78,7 +80,7 @@ public class GrClosureType extends GrLiteralClassType { public PsiType[] inferParameters() { final PsiClass psiClass = resolve(); if (psiClass != null && psiClass.getTypeParameters().length == 1) { - final PsiType type = GrClosureSignatureUtil.getReturnType(mySignature); + final PsiType type = GrClosureSignatureUtil.getReturnType(mySignatures); if (type == PsiType.NULL || type == null) { return new PsiType[]{null}; } @@ -104,17 +106,17 @@ public class GrClosureType extends GrLiteralClassType { return this; } - return new GrClosureType(getLanguageLevel(), getResolveScope(), myFacade, mySignature, false); + return new GrClosureType(getLanguageLevel(), getResolveScope(), myFacade, mySignatures, false); } @Override public boolean isValid() { - return mySignature.isValid(); + return ContainerUtil.all(mySignatures, GrSignature::isValid); } public boolean equals(Object obj) { if (obj instanceof GrClosureType) { - return Comparing.equal(mySignature, ((GrClosureType)obj).mySignature); + return Comparing.equal(mySignatures, ((GrClosureType)obj).mySignatures); } return super.equals(obj); @@ -123,12 +125,12 @@ public class GrClosureType extends GrLiteralClassType { @Override @NotNull public PsiClassType setLanguageLevel(@NotNull final LanguageLevel languageLevel) { - return new GrClosureType(languageLevel, myScope, myFacade, mySignature, myTypeArgs); + return new GrClosureType(languageLevel, myScope, myFacade, mySignatures, myTypeArgs); } @NotNull public static GrClosureType create(@NotNull Iterable results, @NotNull GroovyPsiElement context) { - List signatures = new ArrayList<>(); + List signatures = new ArrayList<>(); for (GroovyResolveResult result : results) { if (result.getElement() instanceof PsiMethod) { signatures.add(GrClosureSignatureUtil.createSignature((PsiMethod)result.getElement(), result.getSubstitutor())); @@ -137,42 +139,39 @@ public class GrClosureType extends GrLiteralClassType { final GlobalSearchScope resolveScope = context.getResolveScope(); final JavaPsiFacade facade = JavaPsiFacade.getInstance(context.getProject()); - if (signatures.size() == 1) { - return create(signatures.get(0), resolveScope, facade, LanguageLevel.JDK_1_5, true); - } - else { - return create(GrClosureSignatureUtil.createMultiSignature(signatures.toArray(GrClosureSignature.EMPTY_ARRAY)), - resolveScope, facade, LanguageLevel.JDK_1_5, true); - } + return create(signatures, resolveScope, facade, LanguageLevel.JDK_1_5, true); } public static GrClosureType create(@NotNull GrClosableBlock closure, boolean shouldInferTypeParameters) { - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature(closure); + final GrSignature signature = GrClosureSignatureUtil.createSignature(closure); final GlobalSearchScope resolveScope = closure.getResolveScope(); final JavaPsiFacade facade = JavaPsiFacade.getInstance(closure.getProject()); - GrClosureType type = create(signature, resolveScope, facade, LanguageLevel.JDK_1_5, shouldInferTypeParameters); + GrClosureType type = create(Collections.singletonList(signature), resolveScope, facade, LanguageLevel.JDK_1_5, shouldInferTypeParameters); type.setClosure(closure); return type; } - public static GrClosureType create(@NotNull GrSignature signature, + @NotNull + public static GrClosureType create(@NotNull List signatures, GlobalSearchScope scope, JavaPsiFacade facade, @NotNull LanguageLevel languageLevel, boolean shouldInferTypeParameters) { - return new GrClosureType(languageLevel, scope, facade, signature, shouldInferTypeParameters); + return new GrClosureType(languageLevel, scope, facade, signatures, shouldInferTypeParameters); } @Nullable public PsiType curry(@NotNull PsiType[] args, int position, @NotNull GroovyPsiElement context) { - final GrSignature newSignature = mySignature.curry(args, position, context); - if (newSignature == null) return null; - return new GrClosureType(myLanguageLevel, myScope, myFacade, newSignature, myTypeArgs); + final List curried = CurryKt.curry(mySignatures, args, position, context); + if (curried.isEmpty()) { + return null; + } + return new GrClosureType(myLanguageLevel, myScope, myFacade, curried, myTypeArgs); } @NotNull - public GrSignature getSignature() { - return mySignature; + public List getSignatures() { + return mySignatures; } @Override diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java index 14f0d8e94042..278dc4664899 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java @@ -27,7 +27,7 @@ import org.jetbrains.plugins.groovy.lang.psi.*; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; @@ -567,7 +567,7 @@ public class GroovyPsiElementFactoryImpl extends GroovyPsiElementFactory { @NotNull @Override - public GrMethod createMethodFromSignature(@NotNull String name, @NotNull GrClosureSignature signature) { + public GrMethod createMethodFromSignature(@NotNull String name, @NotNull GrSignature signature) { StringBuilder builder = new StringBuilder("public"); final PsiType returnType = signature.getReturnType(); if (returnType != null && returnType != PsiType.NULL) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosableSignatureImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosableSignatureImpl.java index 5890dffd10e0..4fb3c722da65 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosableSignatureImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosableSignatureImpl.java @@ -1,37 +1,20 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.impl.signatures; import com.intellij.psi.PsiArrayType; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiSubstitutor; import com.intellij.psi.PsiType; import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; -class GrClosableSignatureImpl implements GrClosureSignature { +class GrClosableSignatureImpl implements GrSignature { + private final GrClosableBlock myBlock; GrClosableSignatureImpl(GrClosableBlock block) { @@ -83,15 +66,4 @@ class GrClosableSignatureImpl implements GrClosureSignature { public boolean isValid() { return myBlock.isValid(); } - - @Nullable - @Override - public GrSignature curry(@NotNull PsiType[] args, int position, @NotNull PsiElement context) { - return GrClosureSignatureUtil.curryImpl(this, args, position, context); - } - - @Override - public void accept(@NotNull GrSignatureVisitor visitor) { - visitor.visitClosureSignature(this); - } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureUtil.java index 4cc1c0c1e352..268883f8adc8 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureUtil.java @@ -23,9 +23,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyMethodResult; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrMultiSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrRecursiveSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; @@ -55,18 +52,14 @@ public class GrClosureSignatureUtil { private GrClosureSignatureUtil() { } - public static GrMultiSignature createMultiSignature(GrClosureSignature[] signatures) { - return new GrMultiSignatureImpl(signatures); - } - @Nullable - public static GrClosureSignature createSignature(GrCall call) { + public static GrSignature createSignature(GrCall call) { if (call instanceof GrMethodCall) { final GrExpression invokedExpression = ((GrMethodCall)call).getInvokedExpression(); final PsiType type = invokedExpression.getType(); if (type instanceof GrClosureType) { - final GrSignature signature = ((GrClosureType)type).getSignature(); - final Trinity[], ApplicabilityResult> trinity = + final List signature = ((GrClosureType)type).getSignatures(); + final Trinity[], ApplicabilityResult> trinity = getApplicableSignature(signature, PsiUtil.getArgumentTypes(invokedExpression, true), call); if (trinity != null) { return trinity.first; @@ -84,42 +77,43 @@ public class GrClosureSignatureUtil { return null; } - public static GrClosureSignature createSignature(MethodSignature signature) { + @NotNull + public static GrSignature createSignature(@NotNull MethodSignature signature) { final PsiType[] types = signature.getParameterTypes(); - GrClosureParameter[] parameters = ContainerUtil.map(types, type -> new GrImmediateClosureParameterImpl(type, null, false, null), new GrClosureParameter[types.length]); + GrClosureParameter[] parameters = ContainerUtil.map(types, type -> + new GrImmediateClosureParameterImpl(type, null, false, null), new GrClosureParameter[types.length] + ); return new GrImmediateClosureSignatureImpl(parameters, null, false, false); } - @NotNull - public static GrClosureSignature createSignature(final GrClosableBlock block) { + public static GrSignature createSignature(final GrClosableBlock block) { return new GrClosableSignatureImpl(block); } @NotNull - public static GrClosureSignature createSignature(@NotNull PsiMethod method, @NotNull PsiSubstitutor substitutor) { + public static GrSignature createSignature(@NotNull PsiMethod method, @NotNull PsiSubstitutor substitutor) { return createSignature(method, substitutor, false); } @NotNull - public static GrClosureSignature createSignature(@NotNull PsiMethod method, - @NotNull PsiSubstitutor substitutor, - boolean eraseParameterTypes) { + public static GrSignature createSignature(@NotNull PsiMethod method, @NotNull PsiSubstitutor substitutor, boolean eraseParameterTypes) { return new GrMethodSignatureImpl(method, substitutor, eraseParameterTypes); } - public static GrClosureSignature removeParam(final GrClosureSignature signature, int i) { + @NotNull + public static GrSignature removeParam(final GrSignature signature, int i) { final GrClosureParameter[] newParams = ArrayUtil.remove(signature.getParameters(), i); return new GrClosureSignatureWithNewParameters(signature, newParams); } @NotNull - public static GrClosureSignature createSignatureWithErasedParameterTypes(final GrClosableBlock closure) { + public static GrSignature createSignatureWithErasedParameterTypes(final GrClosableBlock closure) { return new GrClosableSignatureWithErasedParameters(closure); } @NotNull - public static GrClosureSignature rawSignature(@NotNull final GrClosureSignature signature) { + public static GrSignature rawSignature(@NotNull final GrSignature signature) { final GrClosureParameter[] params = signature.getParameters(); final GrClosureParameter[] closureParams = ContainerUtil.map(params, parameter -> { @@ -130,140 +124,100 @@ public class GrClosureSignatureUtil { return new GrClosureSignatureWithNewParameters(signature, closureParams); } - - public static GrClosureSignature createSignature(PsiParameter[] parameters, @Nullable PsiType returnType) { + @NotNull + public static GrSignature createSignature(PsiParameter[] parameters, @Nullable PsiType returnType) { return new GrImmediateClosureSignatureImpl(parameters, returnType); } - @Nullable - public static PsiType getReturnType(@NotNull final GrSignature signature, @NotNull GrMethodCall expr) { - return getReturnType(signature, PsiUtil.getArgumentTypes(expr.getInvokedExpression(), true), expr); + public static PsiType getReturnType(@NotNull final List signatures, @NotNull GrMethodCall expr) { + return getReturnType(signatures, PsiUtil.getArgumentTypes(expr.getInvokedExpression(), true), expr); } @Nullable - public static PsiType getReturnType(@NotNull final GrSignature signature, @Nullable PsiType[] args, @NotNull GroovyPsiElement context) { - if (signature instanceof GrClosureSignature) return ((GrClosureSignature)signature).getReturnType(); - - if (args == null) { - return TypesUtil.getLeastUpperBoundNullable(new Iterable() { - - @Override - public Iterator iterator() { - return new Iterator() { - private final Iterator it = Arrays.asList(((GrMultiSignature)signature).getAllSignatures()).iterator(); - - @Override - public boolean hasNext() { - return it.hasNext(); - } - - @Override - public PsiType next() { - return it.next().getReturnType(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - }, context.getManager()); + public static PsiType getReturnType(@NotNull final List signatures, @Nullable PsiType[] args, @NotNull GroovyPsiElement context) { + if (signatures.size() == 1) { + return signatures.get(0).getReturnType(); } - final List[], ApplicabilityResult>> results = - getSignatureApplicabilities(signature, args, context); + final PsiManager manager = context.getManager(); + + if (args == null) { + return TypesUtil.getLeastUpperBoundNullable(ContainerUtil.map(signatures, GrSignature::getReturnType), manager); + } + + final List[], ApplicabilityResult>> results = + getSignatureApplicabilities(signatures, args, context); if (results.size() == 1) return results.get(0).first.getReturnType(); - return TypesUtil.getLeastUpperBoundNullable(new Iterable() { - @Override - public Iterator iterator() { - return new Iterator() { - private final Iterator[], ApplicabilityResult>> myIterator = results.iterator(); - - @Override - public boolean hasNext() { - return myIterator.hasNext(); - } - - @Nullable - @Override - public PsiType next() { - return myIterator.next().first.getReturnType(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - }, context.getManager()); + return TypesUtil.getLeastUpperBoundNullable(ContainerUtil.map(results, it -> it.first.getReturnType()), manager); } - public static boolean isSignatureApplicable(@NotNull GrSignature signature, @NotNull PsiType[] args, @NotNull PsiElement context) { + public static boolean isSignatureApplicable(@NotNull List signature, @NotNull PsiType[] args, @NotNull PsiElement context) { return isSignatureApplicableConcrete(signature, args, context) != ApplicabilityResult.inapplicable; } - public static ApplicabilityResult isSignatureApplicableConcrete(@NotNull GrSignature signature, @NotNull final PsiType[] args, @NotNull final PsiElement context) { - final List[], ApplicabilityResult>> results = - getSignatureApplicabilities(signature, args, context); - - if (results.isEmpty()) return ApplicabilityResult.inapplicable; - else if (results.size()==1) return results.get(0).third; - else return ApplicabilityResult.ambiguous; + public static ApplicabilityResult isSignatureApplicableConcrete(@NotNull List signatures, + @NotNull final PsiType[] args, + @NotNull final PsiElement context) { + final List[], ApplicabilityResult>> results = + getSignatureApplicabilities(signatures, args, context); + if (results.isEmpty()) { + return ApplicabilityResult.inapplicable; + } + else if (results.size() == 1) { + return results.get(0).third; + } + else { + return ApplicabilityResult.ambiguous; + } } @Nullable - public static Trinity[], ApplicabilityResult> getApplicableSignature(@NotNull GrSignature signature, + public static Trinity[], ApplicabilityResult> getApplicableSignature(@NotNull List signatures, @Nullable final PsiType[] args, @NotNull final GroovyPsiElement context) { if (args == null) return null; - final List[], ApplicabilityResult>> results = getSignatureApplicabilities(signature, args, context); + final List[], ApplicabilityResult>> results = getSignatureApplicabilities(signatures, args, context); if (results.size() == 1) return results.get(0); else return null; } - private static List[], ApplicabilityResult>> getSignatureApplicabilities(@NotNull GrSignature signature, - @NotNull final PsiType[] args, - @NotNull final PsiElement context) { - final List[], ApplicabilityResult>> results = - new ArrayList<>(); - signature.accept(new GrRecursiveSignatureVisitor() { - @Override - public void visitClosureSignature(GrClosureSignature signature) { - ArgInfo[] map = mapArgTypesToParameters(signature, args, context, false); - if (map != null) { - results.add(new Trinity<>(signature, map, isSignatureApplicableInner(map, signature))); - return; - } + private static List[], ApplicabilityResult>> getSignatureApplicabilities(@NotNull List signatures, + @NotNull final PsiType[] args, + @NotNull final PsiElement context) { + final List[], ApplicabilityResult>> results = new ArrayList<>(); + for (GrSignature signature : signatures) { + ArgInfo[] map = mapArgTypesToParameters(signature, args, context, false); + if (map != null) { + results.add(new Trinity<>(signature, map, isSignatureApplicableInner(map, signature))); + continue; + } - // check for the case foo([1, 2, 3]) if foo(int, int, int) - if (args.length == 1 && PsiUtil.isInMethodCallContext(context)) { - final GrClosureParameter[] parameters = signature.getParameters(); - if (parameters.length == 1 && parameters[0].getType() instanceof PsiArrayType) { - return; - } - PsiType arg = args[0]; - if (arg instanceof GrTupleType) { - PsiType[] _args = ((GrTupleType)arg).getComponentTypesArray(); - map = mapArgTypesToParameters(signature, _args, context, false); - if (map != null) { - results.add(new Trinity<>(signature, map, - isSignatureApplicableInner(map, - signature))); - } + // check for the case foo([1, 2, 3]) if foo(int, int, int) + if (args.length == 1 && PsiUtil.isInMethodCallContext(context)) { + final GrClosureParameter[] parameters = signature.getParameters(); + if (parameters.length == 1 && parameters[0].getType() instanceof PsiArrayType) { + continue; + } + PsiType arg = args[0]; + if (arg instanceof GrTupleType) { + PsiType[] _args = ((GrTupleType)arg).getComponentTypesArray(); + map = mapArgTypesToParameters(signature, _args, context, false); + if (map != null) { + results.add(new Trinity<>(signature, map, + isSignatureApplicableInner(map, + signature))); } } } - }); + } return results; } - private static ApplicabilityResult isSignatureApplicableInner(@NotNull ArgInfo[] infos, @NotNull GrClosureSignature signature) { + private static ApplicabilityResult isSignatureApplicableInner(@NotNull ArgInfo[] infos, @NotNull GrSignature signature) { GrClosureParameter[] parameters = signature.getParameters(); for (int i = 0; i < infos.length; i++) { ArgInfo info = infos[i]; @@ -279,8 +233,8 @@ public class GrClosureSignatureUtil { return ApplicabilityResult.applicable; } - @Nullable - static GrSignature curryImpl(@NotNull GrClosureSignature original, PsiType[] args, int position, @NotNull PsiElement context) { + @NotNull + static List curryImpl(@NotNull GrSignature original, PsiType[] args, int position, @NotNull PsiElement context) { GrClosureParameter[] params = original.getParameters(); List newParams = new ArrayList<>(params.length); @@ -291,7 +245,9 @@ public class GrClosureSignatureUtil { position = params.length - args.length; } - if (position < 0 || position >= params.length) return null; + if (position < 0 || position >= params.length) { + return Collections.emptyList(); + } for (int i = 0; i < params.length; i++) { if (params[i].isOptional()) { @@ -304,7 +260,7 @@ public class GrClosureSignatureUtil { } final PsiType rtype = original.getReturnType(); - final ArrayList result = new ArrayList<>(); + final ArrayList result = new ArrayList<>(); checkAndAddSignature(result, args, position, newParams, rtype, context); for (int i = 0; i < opts.size(); i++) { @@ -312,12 +268,7 @@ public class GrClosureSignatureUtil { checkAndAddSignature(result, args, position, newParams, rtype, context); } - if (result.size() == 1) { - return result.get(0); - } - else { - return new GrMultiSignatureImpl(result.toArray(GrClosureSignature.EMPTY_ARRAY)); - } + return result; } public static boolean isVarArgsImpl(@NotNull GrClosureParameter[] parameters) { @@ -329,7 +280,7 @@ public class GrClosureSignatureUtil { } @Nullable - public static ArgInfo[] mapArgTypesToParameters(@NotNull GrClosureSignature signature, + public static ArgInfo[] mapArgTypesToParameters(@NotNull GrSignature signature, @NotNull PsiType[] args, @NotNull PsiElement context, boolean partial) { @@ -337,11 +288,11 @@ public class GrClosureSignatureUtil { } @Nullable - public static ArgInfo[] mapParametersToArguments(@NotNull GrClosureSignature signature, - @NotNull Arg[] args, - @NotNull Function typeComputer, - @NotNull PsiElement context, - boolean partial) { + public static ArgInfo[] mapParametersToArguments(@NotNull GrSignature signature, + @NotNull Arg[] args, + @NotNull Function typeComputer, + @NotNull PsiElement context, + boolean partial) { LOG.assertTrue(signature.isValid(), signature.getClass()); if (checkForOnlyMapParam(signature, args.length)) return ArgInfo.empty_array(); @@ -364,7 +315,7 @@ public class GrClosureSignatureUtil { return mapSimple(params, args, typeComputer, context, optional, true); } - private static boolean checkForOnlyMapParam(@NotNull GrClosureSignature signature, final int argCount) { + private static boolean checkForOnlyMapParam(@NotNull GrSignature signature, final int argCount) { if (argCount > 0 || signature.isCurried()) return false; final GrClosureParameter[] parameters = signature.getParameters(); if (parameters.length != 1) return false; @@ -421,7 +372,7 @@ public class GrClosureSignatureUtil { return TypesUtil.isAssignableByMethodCallConversion(lType != null ? lType : paramType, rType != null ? rType : argType, context); } - public static void checkAndAddSignature(List list, + public static void checkAndAddSignature(List list, PsiType[] args, int position, List params, @@ -449,7 +400,7 @@ public class GrClosureSignatureUtil { @Nullable - public static GrClosureSignature createSignature(GroovyResolveResult resolveResult) { + public static GrSignature createSignature(GroovyResolveResult resolveResult) { final PsiElement resolved = resolveResult.getElement(); if (!(resolved instanceof PsiMethod)) return null; final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); @@ -547,7 +498,7 @@ public class GrClosureSignatureUtil { } } - private static int getOptionalParamCount(@NotNull GrClosureSignature signature, PsiElement context) { + private static int getOptionalParamCount(@NotNull GrSignature signature, PsiElement context) { GrClosureParameter[] parameters = signature.getParameters(); boolean isCompileStatic = PsiUtil.isCompileStatic(context); if (parameters.length == 1 && !(parameters[0].getType() instanceof PsiPrimitiveType) && !signature.isCurried() && !isCompileStatic) @@ -604,7 +555,7 @@ public class GrClosureSignatureUtil { @NotNull final GrNamedArgument[] namedArgs, @NotNull final GrExpression[] expressionArgs, @NotNull GrClosableBlock[] closureArguments) { - final GrClosureSignature signature; + final GrSignature signature; final PsiParameter[] parameters; final PsiElement element = resolveResult.getElement(); PsiSubstitutor substitutor; @@ -654,13 +605,13 @@ public class GrClosureSignatureUtil { @Nullable - public static ArgInfo[] mapParametersToArguments(@NotNull GrClosureSignature signature, @NotNull GrCall call) { + public static ArgInfo[] mapParametersToArguments(@NotNull GrSignature signature, @NotNull GrCall call) { return mapParametersToArguments(signature, call.getNamedArguments(), call.getExpressionArguments(), call.getClosureArguments(), call, false, false); } @Nullable - public static ArgInfo[] mapParametersToArguments(@NotNull GrClosureSignature signature, + public static ArgInfo[] mapParametersToArguments(@NotNull GrSignature signature, @NotNull GrNamedArgument[] namedArgs, @NotNull GrExpression[] expressionArgs, @NotNull GrClosableBlock[] closureArguments, @@ -702,7 +653,7 @@ public class GrClosureSignatureUtil { return mapParametersToArguments(signature, innerArgs, hasNamedArgs, partial, context); } - private static ArgInfo[] mapParametersToArguments(@NotNull GrClosureSignature signature, + private static ArgInfo[] mapParametersToArguments(@NotNull GrSignature signature, @NotNull List innerArgs, boolean hasNamedArgs, boolean partial, @@ -737,7 +688,7 @@ public class GrClosureSignatureUtil { } public static List generateAllSignaturesForMethod(GrMethod method, PsiSubstitutor substitutor) { - GrClosureSignature signature = createSignature(method, substitutor); + GrSignature signature = createSignature(method, substitutor); String name = method.getName(); PsiTypeParameter[] typeParameters = method.getTypeParameters(); @@ -791,7 +742,7 @@ public class GrClosureSignatureUtil { } public static void generateAllMethodSignaturesByClosureSignature(@NotNull String name, - @NotNull GrClosureSignature signature, + @NotNull GrSignature signature, @NotNull PsiTypeParameter[] typeParameters, @NotNull PsiSubstitutor substitutor, List result) { @@ -819,15 +770,13 @@ public class GrClosureSignatureUtil { } public static List generateAllMethodSignaturesBySignature(@NotNull final String name, - @NotNull final GrSignature signature) { - + @NotNull final List signatures) { final ArrayList result = new ArrayList<>(); - signature.accept(new GrRecursiveSignatureVisitor() { - @Override - public void visitClosureSignature(GrClosureSignature signature) { - generateAllMethodSignaturesByClosureSignature(name, signature, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY, result); - } - }); + + for (GrSignature signature : signatures) { + generateAllMethodSignaturesByClosureSignature(name, signature, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY, result); + } + return result; } @@ -867,30 +816,27 @@ public class GrClosureSignatureUtil { /** - * - * @param signature * @return return type or null if there is some different return types */ @Nullable - public static PsiType getReturnType(GrSignature signature) { - if (signature instanceof GrClosureSignature) { - return ((GrClosureSignature)signature).getReturnType(); + public static PsiType getReturnType(List signatures) { + if (signatures.size() == 1) { + return signatures.get(0).getReturnType(); } - else if (signature instanceof GrMultiSignature) { - final GrClosureSignature[] signatures = ((GrMultiSignature)signature).getAllSignatures(); - if (signatures.length == 0) return null; - final PsiType type = signatures[0].getReturnType(); + else if (signatures.size() > 1) { + final PsiType type = signatures.get(0).getReturnType(); if (type == null) return null; String firstType = type.getCanonicalText(); - for (int i = 1; i < signatures.length; i++) { - final PsiType _type = signatures[i].getReturnType(); + for (int i = 1; i < signatures.size(); i++) { + final PsiType _type = signatures.get(i).getReturnType(); if (_type == null) return null; if (!firstType.equals(_type.getCanonicalText())) return null; } return type; } - - return null; + else { + return null; + } } @@ -907,7 +853,7 @@ public class GrClosureSignatureUtil { } @Nullable - public static MapResultWithError mapSimpleSignatureWithErrors(@NotNull GrClosureSignature signature, + public static MapResultWithError mapSimpleSignatureWithErrors(@NotNull GrSignature signature, @NotNull Arg[] args, @NotNull Function typeComputer, @NotNull GroovyPsiElement context, @@ -947,39 +893,36 @@ public class GrClosureSignatureUtil { return new MapResultWithError(errors); } - public static List generateSimpleSignatures(@NotNull GrSignature signature) { - final List result = new ArrayList<>(); - signature.accept(new GrRecursiveSignatureVisitor() { - @Override - public void visitClosureSignature(GrClosureSignature signature) { - final GrClosureParameter[] original = signature.getParameters(); - final ArrayList parameters = new ArrayList<>(original.length); + public static List generateSimpleSignatures(@NotNull List signatures) { + final List result = new ArrayList<>(); + for (GrSignature signature : signatures) { + final GrClosureParameter[] original = signature.getParameters(); + final ArrayList parameters = new ArrayList<>(original.length); - for (GrClosureParameter parameter : original) { - parameters.add(new GrDelegatingClosureParameter(parameter) { - @Override - public boolean isOptional() { - return false; - } - - @Nullable - @Override - public GrExpression getDefaultInitializer() { - return null; - } - }); - } - - final int pCount = signature.isVarargs() ? signature.getParameterCount() - 2 : signature.getParameterCount() - 1; - for (int i = pCount; i >= 0; i--) { - if (original[i].isOptional()) { - result.add(new GrImmediateClosureSignatureImpl(parameters.toArray(GrClosureParameter.EMPTY_ARRAY), signature.getReturnType(), signature.isVarargs(), false)); - parameters.remove(i); + for (GrClosureParameter parameter : original) { + parameters.add(new GrDelegatingClosureParameter(parameter) { + @Override + public boolean isOptional() { + return false; } - } - result.add(new GrImmediateClosureSignatureImpl(parameters.toArray(GrClosureParameter.EMPTY_ARRAY), signature.getReturnType(), signature.isVarargs(), false)); + + @Nullable + @Override + public GrExpression getDefaultInitializer() { + return null; + } + }); } - }); + + final int pCount = signature.isVarargs() ? signature.getParameterCount() - 2 : signature.getParameterCount() - 1; + for (int i = pCount; i >= 0; i--) { + if (original[i].isOptional()) { + result.add(new GrImmediateClosureSignatureImpl(parameters.toArray(GrClosureParameter.EMPTY_ARRAY), signature.getReturnType(), signature.isVarargs(), false)); + parameters.remove(i); + } + } + result.add(new GrImmediateClosureSignatureImpl(parameters.toArray(GrClosureParameter.EMPTY_ARRAY), signature.getReturnType(), signature.isVarargs(), false)); + } return result; } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureWithNewParameters.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureWithNewParameters.java index dcef5c1ae29f..b3bbc8c6fa3d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureWithNewParameters.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureSignatureWithNewParameters.java @@ -1,35 +1,19 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.impl.signatures; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiSubstitutor; import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; -public class GrClosureSignatureWithNewParameters implements GrClosureSignature { - private final GrClosureSignature myDelegate; +public class GrClosureSignatureWithNewParameters implements GrSignature { + + private final GrSignature myDelegate; private final GrClosureParameter[] myParams; - public GrClosureSignatureWithNewParameters(@NotNull GrClosureSignature delegate, @NotNull GrClosureParameter[] newParams) { + public GrClosureSignatureWithNewParameters(@NotNull GrSignature delegate, @NotNull GrClosureParameter[] newParams) { myDelegate = delegate; myParams = newParams; } @@ -71,15 +55,4 @@ public class GrClosureSignatureWithNewParameters implements GrClosureSignature { public boolean isValid() { return myDelegate.isValid(); } - - @Nullable - @Override - public GrSignature curry(@NotNull PsiType[] args, int position, @NotNull PsiElement context) { - return GrClosureSignatureUtil.curryImpl(this, args, position, context); - } - - @Override - public void accept(@NotNull GrSignatureVisitor visitor) { - visitor.visitClosureSignature(this); - } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrImmediateClosureSignatureImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrImmediateClosureSignatureImpl.java index 9e25456ddd5d..8432eeebedb1 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrImmediateClosureSignatureImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrImmediateClosureSignatureImpl.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.impl.signatures; import com.intellij.openapi.diagnostic.Logger; @@ -21,16 +7,15 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; /** * @author Maxim.Medvedev */ -public class GrImmediateClosureSignatureImpl implements GrClosureSignature { +public class GrImmediateClosureSignatureImpl implements GrSignature { + private static final Logger LOG = Logger.getInstance(GrImmediateClosureSignatureImpl.class); private final boolean myIsVarargs; @@ -99,12 +84,6 @@ public class GrImmediateClosureSignatureImpl implements GrClosureSignature { return myParameters.length; } - @Override - @Nullable - public GrSignature curry(@NotNull PsiType[] args, int position, @NotNull PsiElement context) { - return GrClosureSignatureUtil.curryImpl(this, args, position, context); - } - @Override public boolean isValid() { for (GrClosureParameter parameter : myParameters) { @@ -116,9 +95,9 @@ public class GrImmediateClosureSignatureImpl implements GrClosureSignature { @Override public boolean equals(Object obj) { - if (obj instanceof GrClosureSignature) { - return Comparing.equal(myParameters, ((GrClosureSignature)obj).getParameters()) && - Comparing.equal(myIsVarargs, ((GrClosureSignature)obj).isVarargs()); + if (obj instanceof GrSignature) { + return Comparing.equal(myParameters, ((GrSignature)obj).getParameters()) && + Comparing.equal(myIsVarargs, ((GrSignature)obj).isVarargs()); } return super.equals(obj); } @@ -129,9 +108,9 @@ public class GrImmediateClosureSignatureImpl implements GrClosureSignature { } @Nullable - public static GrClosureSignature getLeastUpperBound(@NotNull GrClosureSignature signature1, - @NotNull GrClosureSignature signature2, - PsiManager manager) { + public static GrSignature getLeastUpperBound(@NotNull GrSignature signature1, + @NotNull GrSignature signature2, + @NotNull PsiManager manager) { GrClosureParameter[] parameters1 = signature1.getParameters(); GrClosureParameter[] parameters2 = signature2.getParameters(); @@ -154,11 +133,6 @@ public class GrImmediateClosureSignatureImpl implements GrClosureSignature { } return null; //todo } - - @Override - public void accept(@NotNull GrSignatureVisitor visitor) { - visitor.visitClosureSignature(this); - } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMethodSignatureImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMethodSignatureImpl.java index 469e6a923da4..4849a7604c0c 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMethodSignatureImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMethodSignatureImpl.java @@ -1,19 +1,19 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.impl.signatures; -import com.intellij.psi.*; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiSubstitutor; +import com.intellij.psi.PsiType; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; -class GrMethodSignatureImpl implements GrClosureSignature { +class GrMethodSignatureImpl implements GrSignature { private final PsiMethod myMethod; private final PsiSubstitutor mySubstitutor; @@ -82,15 +82,4 @@ class GrMethodSignatureImpl implements GrClosureSignature { public boolean isValid() { return myMethod.isValid() && getSubstitutor().isValid(); } - - @Nullable - @Override - public GrSignature curry(@NotNull PsiType[] args, int position, @NotNull PsiElement context) { - return GrClosureSignatureUtil.curryImpl(this, args, position, context); - } - - @Override - public void accept(@NotNull GrSignatureVisitor visitor) { - visitor.visitClosureSignature(this); - } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMultiSignatureImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMultiSignatureImpl.java deleted file mode 100644 index 83ba1577ea47..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrMultiSignatureImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2000-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.plugins.groovy.lang.psi.impl.signatures; - -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrMultiSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignatureVisitor; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * @author Max Medvedev - */ -public class GrMultiSignatureImpl implements GrMultiSignature { - private final GrClosureSignature[] mySignatures; - - public GrMultiSignatureImpl(GrClosureSignature[] signatures) { - mySignatures = signatures; - } - - @Override - public GrClosureSignature[] getAllSignatures() { - return mySignatures; - } - - @Override - public boolean isValid() { - for (GrClosureSignature signature : mySignatures) { - if (!signature.isValid()) return false; - } - return true; - } - - @Override - public GrSignature curry(@NotNull PsiType[] args, int position, @NotNull PsiElement context) { - List newClosures = new ArrayList<>(); - - for (GrClosureSignature old : mySignatures) { - final GrSignature curried = old.curry(args, position, context); - if (curried instanceof GrClosureSignature) { - newClosures.add((GrClosureSignature)curried); - } - else if (curried instanceof GrMultiSignature) { - newClosures.addAll(Arrays.asList(((GrMultiSignature)curried).getAllSignatures())); - } - } - return new GrMultiSignatureImpl(newClosures.toArray(GrClosureSignature.EMPTY_ARRAY)); - } - - @Override - public void accept(@NotNull GrSignatureVisitor visitor) { - visitor.visitMultiSignature(this); - } -} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/curry.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/curry.kt new file mode 100644 index 000000000000..deaa10d98fb8 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/curry.kt @@ -0,0 +1,12 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.lang.psi.impl.signatures + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiType +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature + +fun curry(signatures: List, args: Array, position: Int, context: PsiElement): List { + return signatures.flatMap { + GrClosureSignatureUtil.curryImpl(it, args, position, context) + } +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java index 23d90b9cb988..da6307e00a8a 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java @@ -26,7 +26,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.SpreadState; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotationArrayInitializer; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotationMemberValue; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.impl.*; @@ -370,7 +369,7 @@ public class TypesUtil implements TypeConstants { } @Nullable - public static PsiType getLeastUpperBound(@NotNull PsiType type1, @NotNull PsiType type2, PsiManager manager) { + public static PsiType getLeastUpperBound(@NotNull PsiType type1, @NotNull PsiType type2, @NotNull PsiManager manager) { { PsiType numericLUB = getNumericLUB(type1, type2); if (numericLUB != null) return numericLUB; @@ -415,17 +414,18 @@ public class TypesUtil implements TypeConstants { else if (type1 instanceof GrClosureType && type2 instanceof GrClosureType) { GrClosureType clType1 = (GrClosureType)type1; GrClosureType clType2 = (GrClosureType)type2; - GrSignature signature1 = clType1.getSignature(); - GrSignature signature2 = clType2.getSignature(); + List signatures1 = clType1.getSignatures(); + List signatures2 = clType2.getSignatures(); - if (signature1 instanceof GrClosureSignature && signature2 instanceof GrClosureSignature) { - if (((GrClosureSignature)signature1).getParameterCount() == ((GrClosureSignature)signature2).getParameterCount()) { - final GrClosureSignature signature = GrImmediateClosureSignatureImpl.getLeastUpperBound(((GrClosureSignature)signature1), - ((GrClosureSignature)signature2), manager); + if (signatures1.size() == 1 && signatures2.size() == 1) { + final GrSignature signature1 = signatures1.get(0); + final GrSignature signature2 = signatures2.get(0); + if (signature1.getParameterCount() == signature2.getParameterCount()) { + final GrSignature signature = GrImmediateClosureSignatureImpl.getLeastUpperBound(signature1, signature2, manager); if (signature != null) { GlobalSearchScope scope = clType1.getResolveScope().intersectWith(clType2.getResolveScope()); final LanguageLevel languageLevel = ComparatorUtil.max(clType1.getLanguageLevel(), clType2.getLanguageLevel()); - return GrClosureType.create(signature, scope, JavaPsiFacade.getInstance(manager.getProject()), languageLevel, true); + return GrClosureType.create(Collections.singletonList(signature), scope, JavaPsiFacade.getInstance(manager.getProject()), languageLevel, true); } } } @@ -465,7 +465,7 @@ public class TypesUtil implements TypeConstants { return false; } - private static PsiType genNewListBy(PsiType genericOwner, PsiManager manager) { + private static PsiType genNewListBy(PsiType genericOwner, @NotNull PsiManager manager) { PsiClass list = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_LIST, genericOwner.getResolveScope()); PsiElementFactory factory = JavaPsiFacade.getElementFactory(manager.getProject()); if (list == null) return factory.createTypeFromText(CommonClassNames.JAVA_UTIL_LIST, null); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/DefaultCallExpressionTypeCalculator.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/DefaultCallExpressionTypeCalculator.java index c1ba1f8277d6..d8a70f881e7d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/DefaultCallExpressionTypeCalculator.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/DefaultCallExpressionTypeCalculator.java @@ -108,7 +108,7 @@ public class DefaultCallExpressionTypeCalculator extends GrCallExpressionTypeCal private static PsiType extractReturnTypeFromType(PsiType type, boolean returnTypeIfFail, GrMethodCall callExpression) { PsiType returnType = returnTypeIfFail ? type: null; if (type instanceof GrClosureType) { - returnType = GrClosureSignatureUtil.getReturnType(((GrClosureType)type).getSignature(), callExpression); + returnType = GrClosureSignatureUtil.getReturnType(((GrClosureType)type).getSignatures(), callExpression); } else if (TypesUtil.isPsiClassTypeToClosure(type)) { assert type instanceof PsiClassType; @@ -155,7 +155,7 @@ public class DefaultCallExpressionTypeCalculator extends GrCallExpressionTypeCal if (!(qType instanceof GrClosureType)) return null; if ("call".equals(resolved.getName())) { - return GrClosureSignatureUtil.getReturnType(((GrClosureType)qType).getSignature(), callExpression); + return GrClosureSignatureUtil.getReturnType(((GrClosureType)qType).getSignatures(), callExpression); } else if ("curry".equals(resolved.getName()) || "trampoline".equals(resolved.getName())) { return ((GrClosureType)qType).curry(PsiUtil.getArgumentTypes(refExpr, false), 0, callExpression); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java index 73e6a35a851d..e1d031839154 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java @@ -18,9 +18,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -169,7 +167,7 @@ public class GdkMethodUtil { } @NotNull - private static GrMethod createMethod(@NotNull GrClosureSignature signature, + private static GrMethod createMethod(@NotNull GrSignature signature, @NotNull String name, @NotNull GrAssignmentExpression statement, @NotNull PsiClass closure) { @@ -201,7 +199,7 @@ public class GdkMethodUtil { Pair original = getTypeToMixIn(assignment); if (original == null) return Result.create(null, PsiModificationTracker.MODIFICATION_COUNT); - final Pair signatures = getTypeToMix(assignment); + final Pair, String> signatures = getTypeToMix(assignment); if (signatures == null) return Result.create(null, PsiModificationTracker.MODIFICATION_COUNT); final String name = signatures.second; @@ -210,14 +208,9 @@ public class GdkMethodUtil { final PsiClass closure = JavaPsiFacade.getInstance(statement.getProject()).findClass(GroovyCommonClassNames.GROOVY_LANG_CLOSURE, statement.getResolveScope()); if (closure == null) return Result.create(null, PsiModificationTracker.MODIFICATION_COUNT); - signatures.first.accept(new GrSignatureVisitor() { - @Override - public void visitClosureSignature(GrClosureSignature signature) { - super.visitClosureSignature(signature); - GrMethod method = createMethod(signature, name, assignment, closure); - methods.add(method); - } - }); + for (GrSignature signature : signatures.first) { + methods.add(createMethod(signature, name, assignment, closure)); + } return Result.create(Trinity.create(original.first, original.second, methods), PsiModificationTracker.MODIFICATION_COUNT); } @@ -242,19 +235,17 @@ public class GdkMethodUtil { } @Nullable - private static Pair getTypeToMix(GrAssignmentExpression assignment) { + private static Pair, String> getTypeToMix(GrAssignmentExpression assignment) { GrExpression mixinRef = assignment.getRValue(); if (mixinRef == null) return null; final PsiType type = mixinRef.getType(); if (type instanceof GrClosureType) { - final GrSignature signature = ((GrClosureType)type).getSignature(); - final GrExpression lValue = assignment.getLValue(); assert lValue instanceof GrReferenceExpression; final String name = ((GrReferenceExpression)lValue).getReferenceName(); - return Pair.create(signature, name); + return Pair.create(((GrClosureType)type).getSignatures(), name); } return null; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index 8d1965e605b0..822fda1715d1 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -35,7 +35,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; @@ -79,6 +78,7 @@ import java.util.*; import static com.intellij.psi.CommonClassNames.JAVA_LANG_OBJECT; import static com.intellij.psi.GenericsUtil.isTypeArgumentsApplicable; +import static java.util.Collections.singletonList; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.*; /** @@ -138,13 +138,13 @@ public class PsiUtil { PsiElement place, final boolean eraseParameterTypes) { if (argumentTypes == null) return GrClosureSignatureUtil.ApplicabilityResult.canBeApplicable; - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(method, substitutor, eraseParameterTypes); + GrSignature signature = GrClosureSignatureUtil.createSignature(method, substitutor, eraseParameterTypes); GrClosureSignatureUtil.ApplicabilityResult result = GroovyApplicabilityProvider.checkProviders(argumentTypes, method, substitutor, place, eraseParameterTypes); if (result != null) return result; - result = GrClosureSignatureUtil.isSignatureApplicableConcrete(signature, argumentTypes, place); + result = GrClosureSignatureUtil.isSignatureApplicableConcrete(singletonList(signature), argumentTypes, place); if (result != GrClosureSignatureUtil.ApplicabilityResult.inapplicable && isTypeArgumentsApplicable(method.getTypeParameters(), substitutor, place)) { return result; @@ -154,24 +154,23 @@ public class PsiUtil { final PsiParameter[] parameters = method.getParameterList().getParameters(); if (parameters.length > 0 && parameters[0].getType() instanceof GrMapType && (argumentTypes.length == 0 || !(argumentTypes[0] instanceof GrMapType))) { - return GrClosureSignatureUtil.isSignatureApplicableConcrete(GrClosureSignatureUtil.removeParam(signature, 0), argumentTypes, place); + return GrClosureSignatureUtil.isSignatureApplicableConcrete(singletonList(GrClosureSignatureUtil.removeParam(signature, 0)), argumentTypes, place); } } return GrClosureSignatureUtil.ApplicabilityResult.inapplicable; } public static boolean isApplicable(@Nullable PsiType[] argumentTypes, - GrClosureType type, - GroovyPsiElement context) { + @NotNull GrClosureType type, + @NotNull GroovyPsiElement context) { return isApplicableConcrete(argumentTypes, type, context) != GrClosureSignatureUtil.ApplicabilityResult.inapplicable; } public static GrClosureSignatureUtil.ApplicabilityResult isApplicableConcrete(@Nullable PsiType[] argumentTypes, - GrClosureType type, - GroovyPsiElement context) { + @NotNull GrClosureType type, + @NotNull GroovyPsiElement context) { if (argumentTypes == null) return GrClosureSignatureUtil.ApplicabilityResult.canBeApplicable; - - GrSignature signature = type.getSignature(); + List signature = type.getSignatures(); return GrClosureSignatureUtil.isSignatureApplicableConcrete(signature, argumentTypes, context); } @@ -533,15 +532,15 @@ public class PsiUtil { } private static boolean isRawClosureCall(GrMethodCallExpression call, GroovyResolveResult result, GrClosureType returnType) { - final GrSignature signature = returnType.getSignature(); - GrClosureSignature _signature; - if (signature instanceof GrClosureSignature) { - _signature = (GrClosureSignature)signature; + final List signatures = returnType.getSignatures(); + GrSignature _signature; + if (signatures.size() == 1) { + _signature = signatures.get(0); } else { final PsiType[] types = getArgumentTypes(call.getInvokedExpression(), true); - final Trinity[], GrClosureSignatureUtil.ApplicabilityResult> - resultTrinity = types != null ? GrClosureSignatureUtil.getApplicableSignature(signature, types, call) : null; + final Trinity[], GrClosureSignatureUtil.ApplicabilityResult> + resultTrinity = types != null ? GrClosureSignatureUtil.getApplicableSignature(signatures, types, call) : null; _signature = Trinity.getFirst(resultTrinity); } if (_signature != null) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java index 2d8dd81796a1..7f1aad3a6b06 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java @@ -770,7 +770,7 @@ public class ResolveUtil { if (!(type instanceof GrClosureType)) return false; if (argTypes == null) return true; - final GrSignature signature = ((GrClosureType)type).getSignature(); + final List signature = ((GrClosureType)type).getSignatures(); return GrClosureSignatureUtil.isSignatureApplicable(signature, argTypes, place); } @@ -793,7 +793,7 @@ public class ResolveUtil { return null; } if (type instanceof GrClosureType) { - final GrSignature signature = ((GrClosureType)type).getSignature(); + final List signature = ((GrClosureType)type).getSignatures(); PsiType returnType = GrClosureSignatureUtil.getReturnType(signature, args, expression); return TypesUtil.substituteAndNormalizeType(returnType, candidate.getSubstitutor(), candidate.getSpreadState(), expression); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/delegatesTo/DefaultDelegatesToProvider.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/delegatesTo/DefaultDelegatesToProvider.kt index 74cddb89625f..87b51b967c03 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/delegatesTo/DefaultDelegatesToProvider.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/delegatesTo/DefaultDelegatesToProvider.kt @@ -8,7 +8,7 @@ import com.intellij.psi.util.TypeConversionUtil import groovy.lang.Closure.* import org.jetbrains.plugins.groovy.lang.psi.api.GroovyMethodResult import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression @@ -65,7 +65,7 @@ class DefaultDelegatesToProvider : GrDelegatesToProvider { return DelegatesToInfo(delegateType, strategyValue) } - private fun mapArgs(place: PsiElement, call: GrCall, signature: GrClosureSignature): Array>? { + private fun mapArgs(place: PsiElement, call: GrCall, signature: GrSignature): Array>? { val rawSignature = GrClosureSignatureUtil.rawSignature(signature) return GrClosureSignatureUtil.mapParametersToArguments( rawSignature, call.namedArguments, call.expressionArguments, call.closureArguments, place, false, false @@ -105,7 +105,7 @@ class DefaultDelegatesToProvider : GrDelegatesToProvider { private fun getFromTarget(parameterList: PsiParameterList, delegatesTo: PsiAnnotation, - signature: GrClosureSignature, + signature: GrSignature, map: Array>): PsiType? { val target = GrAnnotationUtil.inferStringAttribute(delegatesTo, "target") ?: return null @@ -122,7 +122,7 @@ class DefaultDelegatesToProvider : GrDelegatesToProvider { } } - private fun inferGenericArgType(signature: GrClosureSignature, targetType: PsiType?, genericIndex: Int, param: Int): PsiType? { + private fun inferGenericArgType(signature: GrSignature, targetType: PsiType?, genericIndex: Int, param: Int): PsiType? { if (targetType !is PsiClassType) return null val result = targetType.resolveGenerics() val psiClass = result.element ?: return null diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java index 63e97bbe6d87..d481993e9d2c 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GrControlFlowOwner; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrClassInitializer; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -169,9 +169,9 @@ public class SubstitutorComputer { @NotNull PsiType[] argTypes) { if (typeParameters.length == 0 || myArgumentTypes == null) return partialSubstitutor; - final GrClosureSignature erasedSignature = GrClosureSignatureUtil.createSignature(method, partialSubstitutor, true); + final GrSignature erasedSignature = GrClosureSignatureUtil.createSignature(method, partialSubstitutor, true); - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature(method, partialSubstitutor); + final GrSignature signature = GrClosureSignatureUtil.createSignature(method, partialSubstitutor); final GrClosureParameter[] params = signature.getParameters(); final GrClosureSignatureUtil.ArgInfo[] argInfos = diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java index 7693b9116680..f7f72ce355fc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java @@ -1,19 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ - +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.intentions.conversions; import com.intellij.openapi.application.ApplicationManager; @@ -28,7 +13,6 @@ import com.intellij.psi.util.MethodSignature; import com.intellij.psi.util.MethodSignatureUtil; import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.util.IncorrectOperationException; -import java.util.HashSet; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.GroovyLanguage; @@ -39,7 +23,6 @@ import org.jetbrains.plugins.groovy.lang.documentation.GroovyPresentationUtil; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; @@ -53,6 +36,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureU import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.Collection; +import java.util.HashSet; import java.util.List; /** @@ -111,8 +95,9 @@ public class ConvertClosureToMethodIntention extends Intention { LOG.assertTrue(initializer != null); final PsiType type = initializer.getType(); LOG.assertTrue(type instanceof GrClosureType); - final GrSignature signature = ((GrClosureType)type).getSignature(); - final List signatures = GrClosureSignatureUtil.generateAllMethodSignaturesBySignature(fieldName, signature); + final List signatures = GrClosureSignatureUtil.generateAllMethodSignaturesBySignature( + fieldName, ((GrClosureType)type).getSignatures() + ); for (MethodSignature s : signatures) { final PsiMethod method = MethodSignatureUtil.findMethodBySignature(containingClass, s, true); if (method != null) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java index b08b58da9319..8ee498531573 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java @@ -33,7 +33,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GrNamedElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrParameterListOwner; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; @@ -211,7 +211,7 @@ public class ConvertParameterToMapEntryIntention extends Intention { } } if (refExpr == null) continue; - final GrClosureSignature signature = generateSignature(owner, refExpr); + final GrSignature signature = generateSignature(owner, refExpr); if (signature == null) continue; GrCall call; if (isExplicitGetterCall) { @@ -321,7 +321,7 @@ public class ConvertParameterToMapEntryIntention extends Intention { } @Nullable - private static GrClosureSignature generateSignature(GrParameterListOwner owner, GrReferenceExpression refExpr) { + private static GrSignature generateSignature(GrParameterListOwner owner, GrReferenceExpression refExpr) { if (owner instanceof PsiMethod) { final GroovyResolveResult resolveResult = refExpr.advancedResolve(); final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java index 4081bfe214a9..ee05dee618c5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java @@ -19,8 +19,7 @@ import org.jetbrains.plugins.groovy.lang.documentation.TypePresentation; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrRecursiveSignatureVisitor; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; @@ -157,12 +156,7 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc } private static void addSignatureVariant(@NotNull final List elementToShow, @NotNull GrClosureType type) { - type.getSignature().accept(new GrRecursiveSignatureVisitor() { - @Override - public void visitClosureSignature(GrClosureSignature signature) { - elementToShow.add(signature); - } - }); + elementToShow.addAll(type.getSignatures()); } private static void filterOutReflectedMethods(List toShow) { @@ -231,8 +225,8 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc } if (argTypes == null) continue; } - else if (objects[i] instanceof GrClosureSignature) { - final GrClosureSignature signature = (GrClosureSignature)objects[i]; + else if (objects[i] instanceof GrSignature) { + final GrSignature signature = (GrSignature)objects[i]; argTypes = PsiUtil.getArgumentTypes(place, false); parameterTypes = PsiType.createArray(signature.getParameterCount()); int j = 0; @@ -304,8 +298,8 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc return; } } - else if (o instanceof GrClosureSignature) { - if (!((GrClosureSignature)o).isValid()) { + else if (o instanceof GrSignature) { + if (!((GrSignature)o).isValid()) { context.setUIComponentEnabled(false); return; } @@ -377,8 +371,8 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc } else if (element instanceof PsiClass) { buffer.append("no parameters"); } - else if (element instanceof GrClosureSignature) { - GrClosureParameter[] parameters = ((GrClosureSignature)element).getParameters(); + else if (element instanceof GrSignature) { + GrClosureParameter[] parameters = ((GrSignature)element).getParameters(); if (parameters.length > 0) { for (int i = 0; i < parameters.length; i++) { if (i > 0) buffer.append(", "); @@ -396,7 +390,7 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc int endOffset = buffer.length(); if (context.isUIComponentEnabled() && - (i == currentParameter || (i == parameters.length - 1 && ((GrClosureSignature)element).isVarargs() && currentParameter >= parameters.length))) { + (i == currentParameter || (i == parameters.length - 1 && ((GrSignature)element).isVarargs() && currentParameter >= parameters.length))) { highlightStartOffset = startOffset; highlightEndOffset = endOffset; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java index f9f81af8a7f6..7a9fb5679729 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.changeSignature; import com.intellij.psi.PsiClass; @@ -27,7 +13,7 @@ import com.intellij.refactoring.changeSignature.PossiblyIncorrectUsage; import com.intellij.usageView.UsageInfo; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil; @@ -73,7 +59,7 @@ public class GrMethodCallUsageInfo extends UsageInfo implements PossiblyIncorrec } } } - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(method, mySubstitutor); + GrSignature signature = GrClosureSignatureUtil.createSignature(method, mySubstitutor); myToChangeArguments = isToChangeArguments; myToCatchExceptions = isToCatchExceptions; final GrCall call = GroovyRefactoringUtil.getCallExpressionByMethodReference(element); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodConflictUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodConflictUtil.java index 49a5c8a39789..42dd4e53b81e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodConflictUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodConflictUtil.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2013 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.changeSignature; import com.intellij.psi.*; @@ -20,8 +6,6 @@ import com.intellij.psi.util.MethodSignature; import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.plugins.groovy.lang.documentation.GroovyPresentationUtil; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrRecursiveSignatureVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; @@ -75,26 +59,21 @@ public class GrMethodConflictUtil { } if (!(returnType instanceof GrClosureType)) return; - final GrSignature signature = ((GrClosureType)returnType).getSignature(); - signature.accept(new GrRecursiveSignatureVisitor() { - @Override - public void visitClosureSignature(GrClosureSignature signature) { - NextSignature: - for (MethodSignature prototypeSignature : prototypeSignatures) { - final GrClosureParameter[] params = signature.getParameters(); - final PsiType[] types = prototypeSignature.getParameterTypes(); - if (types.length != params.length) continue; - for (int i = 0; i < types.length; i++) { - if (!TypesUtil.isAssignableByMethodCallConversion(types[i], params[i].getType(), refactoredMethod.getParameterList())) { - continue NextSignature; - } + final List signatures = ((GrClosureType)returnType).getSignatures(); + for (GrSignature signature : signatures) { + NextSignature: + for (MethodSignature prototypeSignature : prototypeSignatures) { + final GrClosureParameter[] params = signature.getParameters(); + final PsiType[] types = prototypeSignature.getParameterTypes(); + if (types.length != params.length) continue; + for (int i = 0; i < types.length; i++) { + if (!TypesUtil.isAssignableByMethodCallConversion(types[i], params[i].getType(), refactoredMethod.getParameterList())) { + continue NextSignature; } - conflicts.putValue(getter, GroovyRefactoringBundle.message("refactored.method.will.cover.closure.property", name, RefactoringUIUtil.getDescription(getter.getContainingClass(), false))); } + conflicts.putValue(getter, GroovyRefactoringBundle.message("refactored.method.will.cover.closure.property", name, RefactoringUIUtil.getDescription(getter.getContainingClass(), false))); } - }); - - + } } private static void checkForMethodSignatureOverload(PsiClass clazz, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/AnonymousFromMapGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/AnonymousFromMapGenerator.java index 75fad5f98662..4094fcb0745f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/AnonymousFromMapGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/AnonymousFromMapGenerator.java @@ -1,24 +1,10 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.intellij.psi.*; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -89,7 +75,7 @@ public class AnonymousFromMapGenerator { final GrParameter[] parameters = actual.toArray(GrParameter.EMPTY_ARRAY); - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature(parameters, clReturnType); + final GrSignature signature = GrClosureSignatureUtil.createSignature(parameters, clReturnType); final GrMethod pattern = factory.createMethodFromSignature(name, signature); PsiMethod found = null; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java index cdde0efa0aa6..fec1d84074e8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.intellij.openapi.diagnostic.Logger; @@ -23,7 +9,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -49,7 +35,7 @@ class ArgumentListGenerator { myExpressionGenerator = new ExpressionGenerator(builder, context); } - public void generate(@Nullable GrClosureSignature signature, + public void generate(@Nullable GrSignature signature, @NotNull GrExpression[] exprs, @NotNull GrNamedArgument[] namedArgs, @NotNull GrClosableBlock[] clArgs, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassItemGeneratorImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassItemGeneratorImpl.java index 2ffce2bb414d..5ed2d9ef60e9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassItemGeneratorImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassItemGeneratorImpl.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2016 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.google.common.collect.ImmutableSortedSet; @@ -21,7 +7,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightMethodBuilder; import com.intellij.util.containers.ContainerUtil; -import java.util.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.noReturnMethod.MissingReturnInspection; @@ -31,7 +16,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotationMemberValue; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; @@ -76,7 +61,7 @@ public class ClassItemGeneratorImpl implements ClassItemGenerator { final GrArgumentList argumentList = constant.getArgumentList(); if (argumentList != null) { final GroovyResolveResult resolveResult = constant.advancedResolve(); - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(resolveResult); + GrSignature signature = GrClosureSignatureUtil.createSignature(resolveResult); new ArgumentListGenerator(builder, context.extend()).generate( signature, argumentList.getExpressionArguments(), diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java index a50e08af8e36..c4efb51e5107 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java @@ -24,7 +24,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; import org.jetbrains.plugins.groovy.lang.psi.api.formatter.GrControlStatement; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; @@ -213,7 +213,7 @@ public class ExpressionGenerator extends Generator { final GrArgumentList argList = newExpression.getArgumentList(); if (argList != null) { - GrClosureSignature signature = null; + GrSignature signature = null; final GroovyResolveResult resolveResult = newExpression.advancedResolve(); final PsiElement constructor = resolveResult.getElement(); @@ -1342,7 +1342,7 @@ public class ExpressionGenerator extends Generator { } } builder.append(method.getName()); - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature(method, substitutor); + final GrSignature signature = GrClosureSignatureUtil.createSignature(method, substitutor); new ArgumentListGenerator(builder, this.context).generate(signature, exprs, namedArgs, closures, context); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/TypeProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/TypeProvider.java index 099e47ca736d..10459e4790e2 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/TypeProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/TypeProvider.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2013 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.intellij.psi.*; @@ -20,7 +6,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.MethodReferencesSearch; import gnu.trove.TIntArrayList; import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; @@ -122,7 +108,7 @@ public class TypeProvider { } if (!paramInds.isEmpty()) { - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature(method, PsiSubstitutor.EMPTY); + final GrSignature signature = GrClosureSignatureUtil.createSignature(method, PsiSubstitutor.EMPTY); MethodReferencesSearch.search(method, true).forEach(psiReference -> { final PsiElement element = psiReference.getElement(); final PsiManager manager = element.getManager(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java index db91961870f5..12d52729a01e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineMethodUtil.java @@ -24,7 +24,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrBlockStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrIfStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; @@ -430,7 +430,7 @@ public class GroovyInlineMethodUtil { Project project = call.getProject(); final GroovyResolveResult resolveResult = call.advancedResolve(); - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(method, resolveResult.getSubstitutor()); + GrSignature signature = GrClosureSignatureUtil.createSignature(method, resolveResult.getSubstitutor()); if (signature == null) { return; @@ -456,7 +456,7 @@ public class GroovyInlineMethodUtil { } @Nullable - private static GrExpression inferArg(GrClosureSignature signature, + private static GrExpression inferArg(GrSignature signature, GrParameter[] parameters, GrParameter parameter, GrClosureSignatureUtil.ArgInfo argInfo, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java index 54743e128e6b..85e12178be24 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GrIntroduceClosureParameterProcessor.java @@ -35,7 +35,7 @@ import org.jetbrains.plugins.groovy.GroovyLanguage; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -386,7 +386,7 @@ public class GrIntroduceClosureParameterProcessor extends BaseRefactoringProcess final GrExpression anchor = getAnchorForArgument(oldArgs, toReplaceIn.isVarArgs(), toReplaceIn.getParameterList()); - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(callExpression); + GrSignature signature = GrClosureSignatureUtil.createSignature(callExpression); if (signature == null) signature = GrClosureSignatureUtil.createSignature(toReplaceIn); final GrClosureSignatureUtil.ArgInfo[] actualArgs = GrClosureSignatureUtil @@ -567,7 +567,7 @@ public class GrIntroduceClosureParameterProcessor extends BaseRefactoringProcess final GroovyResolveResult resolveResult = methodCall.advancedResolve(); final PsiElement resolved = resolveResult.getElement(); LOG.assertTrue(resolved instanceof PsiMethod); - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature((PsiMethod)resolved, resolveResult.getSubstitutor()); + final GrSignature signature = GrClosureSignatureUtil.createSignature((PsiMethod)resolved, resolveResult.getSubstitutor()); final GrClosureSignatureUtil.ArgInfo[] argInfos = GrClosureSignatureUtil.mapParametersToArguments(signature, methodCall); LOG.assertTrue(argInfos != null); settings.parametersToRemove().forEach(value -> { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GroovyIntroduceParameterUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GroovyIntroduceParameterUtil.java index ffc240e2c3ff..6a3602cdca78 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GroovyIntroduceParameterUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/GroovyIntroduceParameterUtil.java @@ -27,7 +27,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrParameterListOwner; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; @@ -212,7 +212,7 @@ public class GroovyIntroduceParameterUtil { final GroovyResolveResult resolveResult = methodCall.advancedResolve(); final PsiElement resolved = resolveResult.getElement(); LOG.assertTrue(resolved instanceof PsiMethod); - final GrClosureSignature signature = GrClosureSignatureUtil.createSignature((PsiMethod)resolved, resolveResult.getSubstitutor()); + final GrSignature signature = GrClosureSignatureUtil.createSignature((PsiMethod)resolved, resolveResult.getSubstitutor()); final GrClosureSignatureUtil.ArgInfo[] argInfos = GrClosureSignatureUtil.mapParametersToArguments(signature, methodCall); LOG.assertTrue(argInfos != null); settings.parametersToRemove().forEach(value -> { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java index f65a362cdfba..89869bd00763 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java @@ -26,7 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyLanguage; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrParameterListOwner; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; @@ -88,7 +88,7 @@ public class GroovyIntroduceParameterMethodUsagesProcessor implements IntroduceP PsiMethod method = PsiTreeUtil.getParentOfType(argList, PsiMethod.class); - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(callExpression); + GrSignature signature = GrClosureSignatureUtil.createSignature(callExpression); if (signature == null) signature = GrClosureSignatureUtil.createSignature(data.getMethodToSearchFor(), PsiSubstitutor.EMPTY); final GrClosureSignatureUtil.ArgInfo[] actualArgs = GrClosureSignatureUtil diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/OldReferencesResolver.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/OldReferencesResolver.java index 34198c021604..0e2f547db74d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/OldReferencesResolver.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/parameter/java2groovy/OldReferencesResolver.java @@ -13,14 +13,13 @@ import com.intellij.refactoring.IntroduceParameterRefactoring; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; -import java.util.HashMap; import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -33,6 +32,7 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -57,7 +57,7 @@ public class OldReferencesResolver { private final PsiElement myParameterInitializer; private final PsiManager myManager; private final PsiParameter[] myParameters; - private final GrClosureSignature mySignature; + private final GrSignature mySignature; private final Set myParamsToNotInline = new HashSet<>(); @@ -66,7 +66,7 @@ public class OldReferencesResolver { PsiElement toReplaceIn, int replaceFieldsWithGetters, PsiElement parameterInitializer, - final GrClosureSignature signature, + final GrSignature signature, final GrClosureSignatureUtil.ArgInfo[] actualArgs, PsiParameter[] parameters) throws IncorrectOperationException { myContext = context; myExpr = expr; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/safeDelete/JavaSafeDeleteDelegateForGroovy.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/safeDelete/JavaSafeDeleteDelegateForGroovy.java index b77723c732cd..bf60eca93781 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/safeDelete/JavaSafeDeleteDelegateForGroovy.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/safeDelete/JavaSafeDeleteDelegateForGroovy.java @@ -1,31 +1,19 @@ -/* - * Copyright 2000-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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.refactoring.safeDelete; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiParameter; +import com.intellij.psi.PsiReference; import com.intellij.refactoring.safeDelete.JavaSafeDeleteDelegate; import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteReferenceJavaDeleteUsageInfo; import com.intellij.usageView.UsageInfo; -import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocMethodReference; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocReferenceElement; -import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature; +import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil; @@ -52,7 +40,7 @@ public class JavaSafeDeleteDelegateForGroovy implements JavaSafeDeleteDelegate { call = (GrCall)element.getParent(); } if (call != null) { - GrClosureSignature signature = GrClosureSignatureUtil.createSignature(call); + GrSignature signature = GrClosureSignatureUtil.createSignature(call); if (signature == null) return;//todo ??? GrClosureSignatureUtil.ArgInfo[] argInfos = GrClosureSignatureUtil.mapParametersToArguments(signature, call); if (argInfos == null) return; //todo???