diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java index f8bd27d96569..8ea47ee40156 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java @@ -237,6 +237,7 @@ public class CreateFromUsageUtils { throws IncorrectOperationException { PsiManager psiManager = method.getManager(); JVMElementFactory factory = JVMElementFactories.getFactory(method.getLanguage(), method.getProject()); + if (factory == null) return; PsiParameterList parameterList = method.getParameterList(); @@ -244,9 +245,11 @@ public class CreateFromUsageUtils { GuessTypeParameters guesser = new GuessTypeParameters(JavaPsiFacade.getElementFactory(method.getProject())); + CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(psiManager); final PsiClass containingClass = method.getContainingClass(); final boolean isInterface = containingClass != null && containingClass.isInterface(); - for (int i = 0; i < arguments.size(); i++) { + //255 is the maximum number of method parameters + for (int i = 0; i < Math.min(arguments.size(), 255); i++) { Pair arg = arguments.get(i); PsiExpression exp = arg.first; @@ -268,11 +271,11 @@ public class CreateFromUsageUtils { } PsiParameter parameter; if (parameterList.getParametersCount() <= i) { - parameter = factory.createParameter(names[0], argType); + PsiParameter param = factory.createParameter(names[0], argType); if (isInterface) { - PsiUtil.setModifierProperty(parameter, PsiModifier.FINAL, false); + PsiUtil.setModifierProperty(param, PsiModifier.FINAL, false); } - parameter = (PsiParameter) parameterList.add(parameter); + parameter = codeStyleManager.performActionWithFormatterDisabled(() -> (PsiParameter) parameterList.add(param)); } else { parameter = parameterList.getParameters()[i]; } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java index d2e5dee43390..c6cbb38b5a9d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java @@ -249,6 +249,10 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { final Editor newEditor = positionCursor(project, targetFile, method); if (newEditor == null) return; Template template = builder.buildTemplate(); + if (arguments.size() > 20) { + template.setToShortenLongNames(false); + template.setToReformat(false); + } newEditor.getCaretModel().moveToOffset(rangeMarker.getStartOffset()); newEditor.getDocument().deleteString(rangeMarker.getStartOffset(), rangeMarker.getEndOffset()); rangeMarker.dispose(); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateMethodFromUsagePerformanceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateMethodFromUsagePerformanceTest.java new file mode 100644 index 000000000000..b18f201a748e --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateMethodFromUsagePerformanceTest.java @@ -0,0 +1,39 @@ +/* + * 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. + */ +package com.intellij.codeInsight.daemon.quickFix; + +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.testFramework.PlatformTestUtil; +import com.intellij.testFramework.SkipSlowTestLocally; + +@SkipSlowTestLocally +public class CreateMethodFromUsagePerformanceTest extends LightQuickFixTestCase { + + public void testWithHugeNumberOfParameters() { + PlatformTestUtil.startPerformanceTest("100 args for a new method", 200000, () -> { + configureFromFileText("Foo.java", "class Foo {{ foo(" + StringUtil.repeat("\"a\", ", 5000) + " \"a\");}}"); + doAction("Create method 'foo'"); + }) + .useLegacyScaling() + .assertTiming(); + } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage"; + } + +}