blob: 922d5e04c3bc27afdfc1c3bbcaa4520c81679326 [file] [log] [blame]
/*
* Copyright 2000-2012 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.refactoring.inline;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceExpression;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.LightRefactoringTestCase;
import com.intellij.refactoring.MockInlineMethodOptions;
import com.intellij.refactoring.util.InlineUtil;
import com.intellij.testFramework.IdeaTestUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
public class InlineMethodTest extends LightRefactoringTestCase {
@NotNull
@Override
protected String getTestDataPath() {
return JavaTestUtil.getJavaTestDataPath();
}
public void testInlineParms() throws Exception {
doTest();
}
public void testInlineWithQualifier() throws Exception {
doTest();
}
public void testInlineWithQualifierFromSuper() throws Exception { doTest(); }
public void testTry() throws Exception {
doTest();
}
public void testTrySynchronized() throws Exception {
doTest();
}
public void testStaticSynchronized() throws Exception {
doTest();
}
public void testSuperInsideHierarchy() throws Exception {
doTest();
}
public void testSideEffect() throws Exception { doTest(); }
public void testInlineWithTry() throws Exception { doTest(); }
public void testVoidWithReturn() throws Exception { doTest(); }
public void testVoidWithReturn1() throws Exception { doTest(); }
public void testScr10884() throws Exception {
doTest();
}
public void testFinalParameters() throws Exception { doTest(); }
public void testFinalParameters1() throws Exception { doTest(); }
public void testScr13831() throws Exception { doTest(); }
public void testNameClash() throws Exception { doTest(); }
public void testArrayAccess() throws Exception { doTest(); }
public void testConflictingField() throws Exception { doTest(); }
public void testCallInFor() throws Exception { doTest(); }
public void testSCR20655() throws Exception { doTest(); }
public void testFieldInitializer() throws Exception { doTest(); }
public void testMethodCallInOtherAnonymousOrInner() throws Exception { doTest(); }
public void testStaticFieldInitializer() throws Exception { doTest(); }
public void testSCR22644() throws Exception { doTest(); }
public void testCallUnderIf() throws Exception { doTest(); }
//This gives extra 'result' local variable, currently I don't see a way to cope with it, todo: think about addional inline possibilities
//public void testLocalVariableResult() throws Exception { doTest(); }
public void testSCR31093() throws Exception { doTest(); }
public void testSCR37742() throws Exception { doTest(); }
public void testChainingConstructor() throws Exception { doTest(); }
public void testChainingConstructor1() throws Exception { doTest(); }
public void testNestedCall() throws Exception { doTest(); }
public void testIDEADEV3672() throws Exception { doTest(); }
public void testIDEADEV5806() throws Exception { doTest(); }
public void testIDEADEV6807() throws Exception { doTest(); }
public void testIDEADEV12616() throws Exception { doTest(); }
public void testVarargs() throws Exception { doTest(); }
public void testVarargs1() throws Exception { doTest(); }
public void testFlatVarargs() throws Exception {doTest();}
public void testFlatVarargs1() throws Exception {doTest();}
public void testEnumConstructor() throws Exception { doTest(); }
public void testEnumConstantConstructorParameter() throws Exception { // IDEADEV-26133
doTest();
}
public void testEnumConstantConstructorParameterComplex() throws Exception { // IDEADEV-26133
doTest();
}
public void testEnumConstantConstructorParameterComplex2() throws Exception { // IDEADEV-26133
doTest();
}
public void testConstantInChainingConstructor() throws Exception { // IDEADEV-28136
doTest();
}
public void testReplaceParameterWithArgumentForConstructor() throws Exception { // IDEADEV-23652
doTest();
}
public void testTailCallReturn() throws Exception { // IDEADEV-27983
doTest();
}
public void testTailCallSimple() throws Exception { // IDEADEV-27983
doTest();
}
public void testTailComment() throws Exception { //IDEADEV-33638
doTest();
}
public void testInferredType() throws Exception {
setLanguageLevel(LanguageLevel.JDK_1_7);
doTest();
}
public void testReplaceGenericsInside() throws Exception {
doTest();
}
public void testStaticMethodWithoutParams() throws Exception {
doTest();
}
public void testWithSuperInside() throws Exception {
doTest();
}
public void testRawSubstitution() throws Exception {
doTest();
}
public void testSubstitution() throws Exception {
doTest();
}
public void testParamNameConflictsWithLocalVar() throws Exception {
doTest();
}
public void testArrayTypeInferenceFromVarargs() throws Exception {
doTest();
}
public void testSuperMethodInAnonymousClass() throws Exception {
doTest();
}
public void testInlineAnonymousClassWithPrivateMethodInside() throws Exception {
doTest();
}
public void testChainedConstructor() throws Exception {
doTestInlineThisOnly();
}
public void testChainedConstructor1() throws Exception {
doTest();
}
public void testMethodUsedInJavadoc() throws Exception {
doTestConflict("Inlined method is used in javadoc");
}
public void testNotAStatement() throws Exception {
doTestConflict("Inlined result would contain parse errors");
}
public void testInSuperCall() throws Exception {
doTestConflict("Inline cannot be applied to multiline method in constructor call");
}
private void doTestConflict(final String conflict) throws Exception {
try {
doTest();
fail("Conflict was not detected");
}
catch (BaseRefactoringProcessor.ConflictsInTestsException e) {
assertEquals(conflict, e.getMessage());
}
}
public void testInlineRunnableRun() throws Exception {
doTestInlineThisOnly();
}
public void testOneLineLambdaVoidCompatibleToBlock() throws Exception {
doTestInlineThisOnly();
}
public void testOneLineLambdaValueCompatibleToBlock() throws Exception {
doTestInlineThisOnly();
}
public void testOneLineLambdaVoidCompatibleOneLine() throws Exception {
doTestInlineThisOnly();
}
public void testOneLineLambdaValueCompatibleOneLine() throws Exception {
doTestInlineThisOnly();
}
public void testOnMethodReference() throws Exception {
doTestInlineThisOnly();
}
public void testNonCodeUsage() throws Exception {
doTest(true);
}
public void testMethodInsideChangeIfStatement() throws Exception {
doTest();
}
public void testSameVarMethodNames() throws Exception {
doTest();
}
public void testThisNameConflict() throws Exception {
doTest();
}
private void doTestInlineThisOnly() {
@NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java";
configureByFile(fileName);
performAction(new MockInlineMethodOptions(){
@Override
public boolean isInlineThisOnly() {
return true;
}
}, false);
checkResultByFile(fileName + ".after");
}
private void doTest() throws Exception {
doTest(false);
}
private void doTest(final boolean nonCode) throws Exception {
String name = getTestName(false);
@NonNls String fileName = "/refactoring/inlineMethod/" + name + ".java";
configureByFile(fileName);
performAction(nonCode);
checkResultByFile(fileName + ".after");
}
private void performAction(final boolean nonCode) {
performAction(new MockInlineMethodOptions(), nonCode);
}
private void performAction(final InlineOptions options, final boolean nonCode) {
PsiElement element = TargetElementUtilBase
.findTargetElement(myEditor, TargetElementUtilBase.ELEMENT_NAME_ACCEPTED | TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED);
final PsiReference ref = myFile.findReferenceAt(myEditor.getCaretModel().getOffset());
PsiReferenceExpression refExpr = ref instanceof PsiReferenceExpression ? (PsiReferenceExpression)ref : null;
assertTrue(element instanceof PsiMethod);
PsiMethod method = (PsiMethod)element;
final boolean condition = InlineMethodProcessor.checkBadReturns(method) && !InlineUtil.allUsagesAreTailCalls(method);
assertFalse("Bad returns found", condition);
final InlineMethodProcessor processor =
new InlineMethodProcessor(getProject(), method, refExpr, myEditor, options.isInlineThisOnly(), nonCode, nonCode);
processor.run();
}
@Override
protected Sdk getProjectJDK() {
return IdeaTestUtil.getMockJdk18();
}
}