/******************************************************************************* * Copyright (c) 2005, 2014 Wind River Systems, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Markus Schorn - initial API and implementation * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.ui.tests.refactoring.rename; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatusEntry; import org.eclipse.cdt.internal.ui.refactoring.rename.CRefactoringArgument; import org.eclipse.cdt.internal.ui.refactoring.rename.CRefactory; import org.eclipse.cdt.internal.ui.refactoring.rename.CRenameProcessor; import org.eclipse.cdt.internal.ui.refactoring.rename.CRenameRefactoring; import org.eclipse.cdt.internal.ui.refactoring.rename.TextSearchWrapper; /** * @author markus.schorn@windriver.com */ public class RenameTestBase extends RefactoringTests { private static final IProgressMonitor NPM = new NullProgressMonitor(); protected RenameTestBase(String name) { super(name); } protected RenameTestBase() { } /** * @param element the CElement to rename * @param newName the new name for the element * @return the change produced by refactoring * @throws Exception */ protected Change getRefactorChanges(IFile file, int offset, String newName) throws Exception { CRenameRefactoring refactoring = createRefactoring(file, offset, newName); refactoring.getProcessor().lockIndex(); try { RefactoringStatus rs = checkConditions(refactoring); if (!rs.hasError()) { Change change = refactoring.createChange(new NullProgressMonitor()); return change; } fail("Input check on " + newName + " failed. " + rs.getEntryMatchingSeverity(RefactoringStatus.ERROR)); // rs.getFirstMessage(RefactoringStatus.ERROR) is not the message displayed in // the UI for renaming a method to a constructor, the first message which is only // a warning is shown in the UI. If you click preview, then the error and the warning // is shown. return null; } finally { refactoring.getProcessor().unlockIndex(); } } protected CRenameRefactoring createRefactoring(IFile file, int offset, String newName) { CRefactoringArgument arg= new CRefactoringArgument(file, offset, 0); CRenameProcessor processor= new CRenameProcessor(CRefactory.getInstance(), arg); processor.setReplacementText(newName); processor.setSelectedOptions(0xFFFF & ~CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH); processor.setExhaustiveSearchScope(TextSearchWrapper.SCOPE_WORKSPACE); return new CRenameRefactoring(processor); } protected String[] getRefactorMessages(IFile file, int offset, String newName) throws Exception { String[] result; CRenameRefactoring refactoring = createRefactoring(file, offset, newName); refactoring.getProcessor().lockIndex(); try { RefactoringStatus rs = checkConditions(refactoring); if (!rs.hasWarning()) { fail("Input check on " + newName + " passed. There should have been warnings or errors."); return null; } RefactoringStatusEntry[] rse = rs.getEntries(); result = new String[rse.length]; for (int i= 0; i < rse.length; i++) { RefactoringStatusEntry entry = rse[i]; result[i]= entry.getMessage(); } return result; } finally { refactoring.getProcessor().unlockIndex(); } } protected RefactoringStatus checkConditions(IFile file, int offset, String newName) throws Exception { CRenameRefactoring refactoring = createRefactoring(file, offset, newName); refactoring.getProcessor().lockIndex(); try { return checkConditions(refactoring); } finally { refactoring.getProcessor().unlockIndex(); } } private RefactoringStatus checkConditions(CRenameRefactoring refactoring) throws CoreException { RefactoringStatus rs = refactoring.checkInitialConditions(new NullProgressMonitor()); if (!rs.hasError()) { rs= refactoring.checkFinalConditions(new NullProgressMonitor()); } return rs; } protected int getRefactorSeverity(IFile file, int offset, String newName) throws Exception { CRenameRefactoring refactoring = createRefactoring(file, offset, newName); refactoring.getProcessor().lockIndex(); try { RefactoringStatus rs = checkConditions(refactoring); return rs.getSeverity(); } finally { refactoring.getProcessor().unlockIndex(); } } protected int countOccurrences(String contents, String lookup) { int idx= contents.indexOf(lookup); int count= 0; while (idx >= 0) { count++; idx= contents.indexOf(lookup, idx + lookup.length()); } return count; } protected void waitForIndexer() throws InterruptedException { waitForIndexer(cproject); } @Override protected IFile importFile(String fileName, String contents) throws Exception { IFile result= super.importFile(fileName, contents); waitForIndexer(); return result; } }