diff options
author | Sergey Prigogin | 2012-02-24 04:44:17 +0000 |
---|---|---|
committer | Sergey Prigogin | 2012-02-24 04:44:17 +0000 |
commit | 2f2f09fd9752d6b6ea67cac31cab66451fb969bd (patch) | |
tree | 5ca4a477fd16f09ab77c0fda99216374c656e607 | |
parent | 688a0e6f7500232e57a736c832b29995bae1a75d (diff) | |
download | org.eclipse.cdt-2f2f09fd9752d6b6ea67cac31cab66451fb969bd.tar.gz org.eclipse.cdt-2f2f09fd9752d6b6ea67cac31cab66451fb969bd.tar.xz org.eclipse.cdt-2f2f09fd9752d6b6ea67cac31cab66451fb969bd.zip |
Use shared AST in Toggle Function refactoring. This change concudes
the transition to CRefactoring2, which is now called CRefactoring.
49 files changed, 552 insertions, 1349 deletions
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModelUtil.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModelUtil.java index e02cd261fe1..a3e56d8012d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModelUtil.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModelUtil.java @@ -40,12 +40,11 @@ import org.eclipse.core.runtime.IPath; * @noinstantiate This class is not intended to be instantiated by clients. */ public class CoreModelUtil { - - /* - * Returns whether the given path matches one of the exclusion patterns. + /** + * Returns whether the given path matches one of the exclusion patterns. * @param resourcePath * @param exclusionPatterns - * @return + * @return <code>true</code> if the given path matches one of the exclusion patterns. */ public static boolean isExcludedPath(IPath resourcePath, IPath[] exclusionPatterns) { int length = exclusionPatterns.length; @@ -56,24 +55,19 @@ public class CoreModelUtil { return isExcluded(resourcePath, fullCharExclusionPatterns); } - /* + /** * Returns whether the given resource matches one of the exclusion patterns. - * - * @see IClasspathEntry#getExclusionPatterns */ public final static boolean isExcluded(IResource resource, char[][] exclusionPatterns) { IPath path = resource.getFullPath(); - // ensure that folders are only excluded if all of their children are - // excluded + // Ensure that folders are only excluded if all of their children are excluded. if (resource.getType() == IResource.FOLDER) path = path.append("*"); //$NON-NLS-1$ return isExcluded(path, exclusionPatterns); } - /* + /** * Returns whether the given resource path matches one of the exclusion patterns. - * - * @see IClasspathEntry#getExclusionPatterns */ public final static boolean isExcluded(IPath resourcePath, char[][] exclusionPatterns) { if (exclusionPatterns == null) @@ -93,7 +87,7 @@ public class CoreModelUtil { /* * if b is a prefix of a return true. */ - static boolean prefixOfCharArray (char[] a, char[] b) { + static boolean prefixOfCharArray(char[] a, char[] b) { if (a == b) return true; if (a == null || b == null) @@ -110,7 +104,6 @@ public class CoreModelUtil { return false; } return true; - } /** diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/RefactoringTestBase.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/RefactoringTestBase.java index 8a92bc824ab..6963b4af42b 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/RefactoringTestBase.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/RefactoringTestBase.java @@ -49,7 +49,7 @@ import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.ui.testplugin.CTestPlugin; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringContext; /** @@ -165,8 +165,8 @@ public abstract class RefactoringTestBase extends BaseTestCase { Refactoring refactoring = createRefactoring(); RefactoringContext context; - if (refactoring instanceof CRefactoring2) { - context = new CRefactoringContext((CRefactoring2) refactoring); + if (refactoring instanceof CRefactoring) { + context = new CRefactoringContext((CRefactoring) refactoring); } else { context = new RefactoringContext(refactoring); } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/togglefunction/ToggleRefactoringTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/togglefunction/ToggleRefactoringTest.java index cf7e1e241f6..d9b74681705 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/togglefunction/ToggleRefactoringTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/togglefunction/ToggleRefactoringTest.java @@ -49,7 +49,7 @@ public class ToggleRefactoringTest extends RefactoringTestBase { @Override protected Refactoring createRefactoring() { - refactoring = new ToggleRefactoring(getSelectedFile(), getSelection(), getCProject()); + refactoring = new ToggleRefactoring(getSelectedTranslationUnit(), getSelection(), getCProject()); return refactoring; } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/DefinitionFinderTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/DefinitionFinderTest.java index 975818e0adf..7d9ff572f11 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/DefinitionFinderTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/DefinitionFinderTest.java @@ -27,13 +27,13 @@ import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.ui.tests.refactoring.RefactoringTestBase; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringContext; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; import org.eclipse.cdt.internal.ui.refactoring.utils.DefinitionFinder; public class DefinitionFinderTest extends RefactoringTestBase { - private static class DummyRefactoring extends CRefactoring2 { + private static class DummyRefactoring extends CRefactoring { public DummyRefactoring(ICElement element, ISelection selection, ICProject project) { super(element, selection, project); } @@ -64,7 +64,7 @@ public class DefinitionFinderTest extends RefactoringTestBase { } @Override - protected CRefactoring2 createRefactoring() { + protected CRefactoring createRefactoring() { return new DummyRefactoring(getSelectedTranslationUnit(), getSelection(), getCProject()); } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/TranslationUnitHelperTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/TranslationUnitHelperTest.java deleted file mode 100644 index 6455dbc0cce..00000000000 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/TranslationUnitHelperTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2012 Institute for Software, HSR Hochschule fuer Technik - * Rapperswil, University of applied sciences and others - * 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: - * Institute for Software - initial API and implementation - * Sergey Prigogin (Google) - *******************************************************************************/ -package org.eclipse.cdt.ui.tests.refactoring.utils; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.ltk.core.refactoring.Refactoring; -import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; -import org.eclipse.ltk.core.refactoring.RefactoringStatus; - -import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.ui.tests.refactoring.RefactoringTestBase; - -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; -import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; -import org.eclipse.cdt.internal.ui.refactoring.utils.TranslationUnitHelper; - -public class TranslationUnitHelperTest extends RefactoringTestBase { - private static class DummyRefactoring extends CRefactoring { - - public DummyRefactoring(IFile file, ISelection selection, ICElement element, ICProject proj) { - super(file, selection, element, proj); - } - - @Override - public RefactoringStatus checkFinalConditions(IProgressMonitor progressMonitor) throws CoreException, OperationCanceledException { - return null; - } - - @Override - protected RefactoringDescriptor getRefactoringDescriptor() { - return null; - } - - @Override - protected void collectModifications(IProgressMonitor pm, ModificationCollector collector) - throws CoreException, OperationCanceledException { - } - } - - public TranslationUnitHelperTest() { - super(); - } - - public TranslationUnitHelperTest(String name) { - super(name); - } - - @Override - protected Refactoring createRefactoring() { - return new DummyRefactoring(getSelectedFile(), getSelection(), null, getCProject()); - } - - private void assertFirstNodeIsAtOffset(int offset) throws Exception { - IASTTranslationUnit ast = TranslationUnitHelper.loadTranslationUnit(getSelectedFile(), false); - IASTNode firstNode = TranslationUnitHelper.getFirstNode(ast); - assertEquals(offset, firstNode.getNodeLocations()[0].getNodeOffset()); - } - - //A.h - //#ifndef A_H_ - //#define A_H_ - // - //class A { - //public: - // A(); - // void foo(); - //}; - // - //#endif /*A_H_*/ - public void testBeforeClass() throws Exception { - assertFirstNodeIsAtOffset(27); - } - - //A.h - //typedef int nummere; - // - //class A { - //public: - // A(); - //}; - public void testBeforeTypedef() throws Exception { - assertFirstNodeIsAtOffset(0); - } -} diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/UtilTestSuite.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/UtilTestSuite.java index 77a9a2cd380..859ef45ced8 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/UtilTestSuite.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/UtilTestSuite.java @@ -23,7 +23,6 @@ public class UtilTestSuite extends TestSuite { public static Test suite() throws Exception { UtilTestSuite suite = new UtilTestSuite(); suite.addTest(IdentifierHelperTest.suite()); - suite.addTestSuite(TranslationUnitHelperTest.class); suite.addTestSuite(DefinitionFinderTest.class); suite.addTestSuite(PseudoNameGeneratorTest.class); suite.addTestSuite(NameComposerTest.class); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SourceHeaderPartnerFinder.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SourceHeaderPartnerFinder.java index 4c7487720f8..0b6f27d39eb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SourceHeaderPartnerFinder.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SourceHeaderPartnerFinder.java @@ -330,13 +330,13 @@ public final class SourceHeaderPartnerFinder { } public static ITranslationUnit getPartnerTranslationUnit(ITranslationUnit tu, - CRefactoringContext astCache) throws CoreException { + CRefactoringContext refactoringContext) throws CoreException { ITranslationUnit partnerUnit= getPartnerFileFromFilename(tu); if (partnerUnit == null) { // Search partner file based on definition/declaration association IProgressMonitor monitor= new NullProgressMonitor(); - IASTTranslationUnit ast = astCache.getAST(tu, monitor); + IASTTranslationUnit ast = refactoringContext.getAST(tu, monitor); PartnerFileVisitor visitor = new PartnerFileVisitor(); ast.accept(visitor); partnerUnit = createTranslationUnit(visitor.getPartnerFileLocation(), tu.getCProject()); @@ -344,12 +344,12 @@ public final class SourceHeaderPartnerFinder { return partnerUnit; } - private static ITranslationUnit createTranslationUnit(IPath partnerFileLoation, ICProject cProject) { + private static ITranslationUnit createTranslationUnit(IPath partnerFileLoation, ICProject project) { ITranslationUnit partnerUnit = null; if (partnerFileLoation != null) { partnerUnit= (ITranslationUnit) CoreModel.getDefault().create(partnerFileLoation); if (partnerUnit == null) { - partnerUnit= CoreModel.getDefault().createTranslationUnitFrom(cProject.getCProject(), + partnerUnit= CoreModel.getDefault().createTranslationUnitFrom(project, partnerFileLoation); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java index c23f9b955f1..798ddf66a29 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2008, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,16 +7,22 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Institute for Software - initial API and implementation + * Institute for Software - initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.Region; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ltk.core.refactoring.Change; @@ -24,12 +30,15 @@ import org.eclipse.ltk.core.refactoring.Refactoring; import org.eclipse.ltk.core.refactoring.RefactoringChangeDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; +import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; +import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker; +import org.eclipse.ltk.core.refactoring.participants.ValidateEditChecker; import org.eclipse.osgi.util.NLS; -import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration; import org.eclipse.cdt.core.dom.ast.IASTProblemExpression; @@ -38,9 +47,9 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId; import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ISourceRange; @@ -48,51 +57,176 @@ import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.internal.corext.util.CModelUtil; + import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper; /** - * The base class for all other refactorings, provides some common implementations for - * condition checking, change generating, selection handling and translation unit loading. - * @deprecated Use CRefactoring2. + * The base class for all AST based refactorings, provides some common implementations for + * AST creation, condition checking, change generating, and selection handling. */ -@Deprecated public abstract class CRefactoring extends Refactoring { - private static final int AST_STYLE = - ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT | ITranslationUnit.AST_SKIP_INDEXED_HEADERS; - protected String name = Messages.Refactoring_name; - protected IFile file; + protected final ICProject project; protected final ITranslationUnit tu; - protected Region region; - protected RefactoringStatus initStatus; - protected IASTTranslationUnit ast; - protected ICProject project; - private IIndex fIndex; - - public CRefactoring(IFile file, ISelection selection, ICElement element, ICProject proj) { - project = proj; - if (element instanceof ISourceReference) { - ISourceReference sourceRef= (ISourceReference) element; - this.tu = sourceRef.getTranslationUnit(); - IResource res= tu.getResource(); - if (res instanceof IFile) - this.file= (IFile) res; + protected Region selectedRegion; + protected final RefactoringStatus initStatus; + protected CRefactoringContext refactoringContext; + + public CRefactoring(ICElement element, ISelection selection, ICProject project) { + this.project = project; + this.initStatus= new RefactoringStatus(); + if (!(element instanceof ISourceReference)) { + this.tu = null; + initStatus.addFatalError(Messages.Refactoring_SelectionNotValid); + return; + } + + ISourceReference sourceRef= (ISourceReference) element; + tu = CModelUtil.toWorkingCopy(sourceRef.getTranslationUnit()); + + if (selection instanceof ITextSelection) { + this.selectedRegion = SelectionHelper.getRegion(selection); + } else { try { - final ISourceRange sourceRange = sourceRef.getSourceRange(); - this.region = new Region(sourceRange.getIdStartPos(), sourceRange.getIdLength()); + ISourceRange sourceRange = sourceRef.getSourceRange(); + this.selectedRegion = new Region(sourceRange.getIdStartPos(), sourceRange.getIdLength()); } catch (CModelException e) { CUIPlugin.log(e); } - } else { - this.file = file; - this.tu = (ITranslationUnit) CCorePlugin.getDefault().getCoreModel().create(file); - this.region = SelectionHelper.getRegion(selection); } + } - this.initStatus= new RefactoringStatus(); - if (this.file == null || region == null) { - initStatus.addFatalError(Messages.Refactoring_SelectionNotValid); + public void setContext(CRefactoringContext refactoringContext) { + Assert.isNotNull(refactoringContext); + this.refactoringContext = refactoringContext; + } + + @Override + public final RefactoringStatus checkFinalConditions(IProgressMonitor pm) + throws CoreException, OperationCanceledException { + if (pm == null) + pm = new NullProgressMonitor(); + pm.beginTask(Messages.CRefactoring_checking_final_conditions, 6); + + CheckConditionsContext context = createCheckConditionsContext(); + RefactoringStatus result = checkFinalConditions(new SubProgressMonitor(pm, 5), context); + if (result.hasFatalError()) { + pm.done(); + return result; } + if (pm.isCanceled()) + throw new OperationCanceledException(); + + result.merge(context.check(new SubProgressMonitor(pm, 1))); + pm.done(); + return result; + } + + protected RefactoringStatus checkFinalConditions(IProgressMonitor subProgressMonitor, + CheckConditionsContext checkContext) throws CoreException, OperationCanceledException { + return new RefactoringStatus(); + } + + @Override + public RefactoringStatus checkInitialConditions(IProgressMonitor pm) + throws CoreException, OperationCanceledException { + SubMonitor sm = SubMonitor.convert(pm, 10); + sm.subTask(Messages.Refactoring_PM_LoadTU); + if (isProgressMonitorCanceld(sm, initStatus)) { + return initStatus; + } + IASTTranslationUnit ast = getAST(tu, sm); + if (ast == null) { + initStatus.addError(NLS.bind(Messages.Refactoring_ParsingError, tu.getPath())); + return initStatus; + } + if (isProgressMonitorCanceld(sm, initStatus)) { + return initStatus; + } + sm.subTask(Messages.Refactoring_PM_CheckTU); + checkAST(ast); + sm.worked(2); + sm.subTask(Messages.Refactoring_PM_InitRef); + sm.done(); + return initStatus; + } + + protected static boolean isProgressMonitorCanceld(IProgressMonitor sm, RefactoringStatus status) { + if (sm.isCanceled()) { + status.addFatalError(Messages.Refactoring_CanceledByUser); + return true; + } + return false; + } + + @Override + public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { + ModificationCollector collector = new ModificationCollector(); + collectModifications(pm, collector); + CCompositeChange finalChange = collector.createFinalChange(); + finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor())); + return finalChange; + } + + abstract protected RefactoringDescriptor getRefactoringDescriptor(); + + abstract protected void collectModifications(IProgressMonitor pm, ModificationCollector collector) + throws CoreException, OperationCanceledException; + + @Override + public String getName() { + return name; + } + + /** + * Returns the translation unit where the refactoring started. + */ + public ITranslationUnit getTranslationUnit() { + return tu; + } + + protected IASTTranslationUnit getAST(ITranslationUnit tu, IProgressMonitor pm) + throws CoreException, OperationCanceledException { + return refactoringContext.getAST(tu, pm); + } + + protected IIndex getIndex() throws OperationCanceledException, CoreException { + return refactoringContext.getIndex(); + } + + protected boolean checkAST(IASTTranslationUnit ast) { + ProblemFinder problemFinder = new ProblemFinder(initStatus); + ast.accept(problemFinder); + return problemFinder.hasProblem(); + } + + protected List<IASTName> findAllMarkedNames(IASTTranslationUnit ast) { + final List<IASTName> names = new ArrayList<IASTName>(); + + ast.accept(new ASTVisitor() { + { + shouldVisitNames = true; + } + + @Override + public int visit(IASTName name) { + if (name.isPartOfTranslationUnitFile() && + SelectionHelper.doesNodeOverlapWithRegion(name, selectedRegion) && + !(name instanceof ICPPASTQualifiedName)) { + names.add(name); + } + return super.visit(name); + } + }); + return names; + } + + private CheckConditionsContext createCheckConditionsContext() throws CoreException { + CheckConditionsContext result= new CheckConditionsContext(); + result.add(new ValidateEditChecker(getValidationContext())); + result.add(new ResourceChangeChecker()); + return result; } private class ProblemFinder extends ASTVisitor { @@ -102,7 +236,7 @@ public abstract class CRefactoring extends Refactoring { public ProblemFinder(RefactoringStatus status) { this.status = status; } - + { shouldVisitProblems = true; shouldVisitDeclarations = true; @@ -116,7 +250,7 @@ public abstract class CRefactoring extends Refactoring { addWarningToState(); return ASTVisitor.PROCESS_CONTINUE; } - + @Override public int visit(IASTDeclaration declaration) { if (declaration instanceof IASTProblemDeclaration) { @@ -124,7 +258,7 @@ public abstract class CRefactoring extends Refactoring { } return ASTVisitor.PROCESS_CONTINUE; } - + @Override public int visit(IASTExpression expression) { if (expression instanceof IASTProblemExpression) { @@ -152,7 +286,7 @@ public abstract class CRefactoring extends Refactoring { public boolean hasProblem() { return problemFound; } - + private void addWarningToState() { if (!problemFound) { status.addWarning(Messages.Refactoring_CompileErrorInTU); @@ -160,147 +294,4 @@ public abstract class CRefactoring extends Refactoring { } } } - - @Override - public RefactoringStatus checkFinalConditions(IProgressMonitor pm) - throws CoreException, OperationCanceledException { - RefactoringStatus status = new RefactoringStatus(); - return status; - } - - @Override - public RefactoringStatus checkInitialConditions(IProgressMonitor pm) - throws CoreException, OperationCanceledException { - SubMonitor sm = SubMonitor.convert(pm, 10); - sm.subTask(Messages.Refactoring_PM_LoadTU); - if (isProgressMonitorCanceld(sm, initStatus)) { - return initStatus; - } - if (!loadTranslationUnit(initStatus, sm.newChild(8))) { - initStatus.addError(Messages.Refactoring_CantLoadTU); - return initStatus; - } - if (isProgressMonitorCanceld(sm, initStatus)) { - return initStatus; - } - sm.subTask(Messages.Refactoring_PM_CheckTU); - translationUnitHasProblem(); - if (translationUnitIsAmbiguous()) { - initStatus.addError(Messages.Refactoring_Ambiguity); - } - sm.worked(2); - sm.subTask(Messages.Refactoring_PM_InitRef); - sm.done(); - return initStatus; - } - - protected static boolean isProgressMonitorCanceld(IProgressMonitor sm, RefactoringStatus status) { - if (sm.isCanceled()) { - status.addFatalError(Messages.Refactoring_CanceledByUser); - return true; - } - return false; - } - - @Override - public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { - ModificationCollector collector = new ModificationCollector(); - collectModifications(pm, collector); - CCompositeChange finalChange = null; - try { - lockIndex(); - finalChange = collector.createFinalChange(); - } catch (InterruptedException e) { - throw new OperationCanceledException(); - } finally { - unlockIndex(); - } - - finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor())); - return finalChange; - } - - abstract protected RefactoringDescriptor getRefactoringDescriptor(); - - abstract protected void collectModifications(IProgressMonitor pm, ModificationCollector collector) - throws CoreException, OperationCanceledException; - - @Override - public String getName() { - return name; - } - - protected boolean loadTranslationUnit(RefactoringStatus status, IProgressMonitor mon) { - SubMonitor subMonitor = SubMonitor.convert(mon, 10); - if (tu != null) { - try { - subMonitor.subTask(Messages.Refactoring_PM_ParseTU); - ast = tu.getAST(fIndex, AST_STYLE); - if (ast == null) { - subMonitor.done(); - return false; - } - subMonitor.worked(2); - if (isProgressMonitorCanceld(subMonitor, initStatus)) { - return true; - } - subMonitor.subTask(Messages.Refactoring_PM_MergeComments); - - subMonitor.worked(8); - } catch (CoreException e) { - status.addFatalError(e.getMessage()); - subMonitor.done(); - return false; - } - } else { - status.addFatalError(NLS.bind(Messages.CRefactoring_FileNotFound, tu.getPath().toString())); - subMonitor.done(); - return false; - } - subMonitor.done(); - return true; - } - - protected boolean translationUnitHasProblem() { - ProblemFinder pf = new ProblemFinder(initStatus); - ast.accept(pf); - return pf.hasProblem(); - } - - protected boolean translationUnitIsAmbiguous() { - // ambiguities are resolved before the tu is passed to the refactoring. - return false; - } - - public void lockIndex() throws CoreException, InterruptedException { - if (fIndex == null) { - ICProject[] projects= CoreModel.getDefault().getCModel().getCProjects(); - fIndex= CCorePlugin.getIndexManager().getIndex(projects); - } - fIndex.acquireReadLock(); - } - - public void unlockIndex() { - if (fIndex != null) { - fIndex.releaseReadLock(); - } - // Marc-Andre Laperle : I don't think we want to null this out, - // if the lock is acquired twice then the lock can only be released once - //fIndex= null; - } - - public IIndex getIndex() { - return fIndex; - } - - /** - * Returns the translation unit where the refactoring started. - */ - public ITranslationUnit getTranslationUnit() { - return tu; - } - - public IASTTranslationUnit getUnit() { - return ast; - } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring2.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring2.java deleted file mode 100644 index 977d6bced89..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring2.java +++ /dev/null @@ -1,299 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2011 Institute for Software, HSR Hochschule fuer Technik - * Rapperswil, University of applied sciences and others - * 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: - * Institute for Software - initial API and implementation - * Sergey Prigogin (Google) - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.refactoring; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.jface.text.ITextSelection; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.ltk.core.refactoring.Change; -import org.eclipse.ltk.core.refactoring.Refactoring; -import org.eclipse.ltk.core.refactoring.RefactoringChangeDescriptor; -import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; -import org.eclipse.ltk.core.refactoring.RefactoringStatus; -import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; -import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker; -import org.eclipse.ltk.core.refactoring.participants.ValidateEditChecker; -import org.eclipse.osgi.util.NLS; - -import org.eclipse.cdt.core.dom.ast.ASTVisitor; -import org.eclipse.cdt.core.dom.ast.IASTDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTExpression; -import org.eclipse.cdt.core.dom.ast.IASTName; -import org.eclipse.cdt.core.dom.ast.IASTProblem; -import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTProblemExpression; -import org.eclipse.cdt.core.dom.ast.IASTProblemStatement; -import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId; -import org.eclipse.cdt.core.dom.ast.IASTStatement; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.dom.ast.IASTTypeId; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; -import org.eclipse.cdt.core.index.IIndex; -import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.ISourceRange; -import org.eclipse.cdt.core.model.ISourceReference; -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.ui.CUIPlugin; - -import org.eclipse.cdt.internal.corext.util.CModelUtil; - -import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper; - -/** - * The base class for all AST based refactorings, provides some common implementations for - * AST creation, condition checking, change generating, and selection handling. - * This class is intended as a replacement for CRefactoring. - */ -public abstract class CRefactoring2 extends Refactoring { - protected String name = Messages.Refactoring_name; - protected final ICProject project; - protected final ITranslationUnit tu; - protected Region selectedRegion; - protected final RefactoringStatus initStatus; - protected CRefactoringContext refactoringContext; - - public CRefactoring2(ICElement element, ISelection selection, ICProject project) { - this.project = project; - this.initStatus= new RefactoringStatus(); - if (!(element instanceof ISourceReference)) { - this.tu = null; - initStatus.addFatalError(Messages.Refactoring_SelectionNotValid); - return; - } - - ISourceReference sourceRef= (ISourceReference) element; - tu = CModelUtil.toWorkingCopy(sourceRef.getTranslationUnit()); - - if (selection instanceof ITextSelection) { - this.selectedRegion = SelectionHelper.getRegion(selection); - } else { - try { - ISourceRange sourceRange = sourceRef.getSourceRange(); - this.selectedRegion = new Region(sourceRange.getIdStartPos(), sourceRange.getIdLength()); - } catch (CModelException e) { - CUIPlugin.log(e); - } - } - } - - - public void setContext(CRefactoringContext refactoringContext) { - Assert.isNotNull(refactoringContext); - this.refactoringContext = refactoringContext; - } - - @Override - public final RefactoringStatus checkFinalConditions(IProgressMonitor pm) - throws CoreException, OperationCanceledException { - if (pm == null) - pm = new NullProgressMonitor(); - pm.beginTask(Messages.CRefactoring_checking_final_conditions, 6); - - CheckConditionsContext context = createCheckConditionsContext(); - RefactoringStatus result = checkFinalConditions(new SubProgressMonitor(pm, 5), context); - if (result.hasFatalError()) { - pm.done(); - return result; - } - if (pm.isCanceled()) - throw new OperationCanceledException(); - - result.merge(context.check(new SubProgressMonitor(pm, 1))); - pm.done(); - return result; - } - - protected RefactoringStatus checkFinalConditions(IProgressMonitor subProgressMonitor, - CheckConditionsContext checkContext) throws CoreException, OperationCanceledException { - return new RefactoringStatus(); - } - - @Override - public RefactoringStatus checkInitialConditions(IProgressMonitor pm) - throws CoreException, OperationCanceledException { - SubMonitor sm = SubMonitor.convert(pm, 10); - sm.subTask(Messages.Refactoring_PM_LoadTU); - if (isProgressMonitorCanceld(sm, initStatus)) { - return initStatus; - } - IASTTranslationUnit ast = getAST(tu, sm); - if (ast == null) { - initStatus.addError(NLS.bind(Messages.Refactoring_ParsingError, tu.getPath())); - return initStatus; - } - if (isProgressMonitorCanceld(sm, initStatus)) { - return initStatus; - } - sm.subTask(Messages.Refactoring_PM_CheckTU); - checkAST(ast); - sm.worked(2); - sm.subTask(Messages.Refactoring_PM_InitRef); - sm.done(); - return initStatus; - } - - protected static boolean isProgressMonitorCanceld(IProgressMonitor sm, RefactoringStatus status) { - if (sm.isCanceled()) { - status.addFatalError(Messages.Refactoring_CanceledByUser); - return true; - } - return false; - } - - @Override - public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { - ModificationCollector collector = new ModificationCollector(); - collectModifications(pm, collector); - CCompositeChange finalChange = collector.createFinalChange(); - finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor())); - return finalChange; - } - - abstract protected RefactoringDescriptor getRefactoringDescriptor(); - - abstract protected void collectModifications(IProgressMonitor pm, ModificationCollector collector) - throws CoreException, OperationCanceledException; - - @Override - public String getName() { - return name; - } - - /** - * Returns the translation unit where the refactoring started. - */ - public ITranslationUnit getTranslationUnit() { - return tu; - } - - protected IASTTranslationUnit getAST(ITranslationUnit tu, IProgressMonitor pm) - throws CoreException, OperationCanceledException { - return refactoringContext.getAST(tu, pm); - } - - protected IIndex getIndex() throws OperationCanceledException, CoreException { - return refactoringContext.getIndex(); - } - - protected boolean checkAST(IASTTranslationUnit ast) { - ProblemFinder problemFinder = new ProblemFinder(initStatus); - ast.accept(problemFinder); - return problemFinder.hasProblem(); - } - - protected List<IASTName> findAllMarkedNames(IASTTranslationUnit ast) { - final List<IASTName> names = new ArrayList<IASTName>(); - - ast.accept(new ASTVisitor() { - { - shouldVisitNames = true; - } - - @Override - public int visit(IASTName name) { - if (name.isPartOfTranslationUnitFile() && - SelectionHelper.doesNodeOverlapWithRegion(name, selectedRegion) && - !(name instanceof ICPPASTQualifiedName)) { - names.add(name); - } - return super.visit(name); - } - }); - return names; - } - - private CheckConditionsContext createCheckConditionsContext() throws CoreException { - CheckConditionsContext result= new CheckConditionsContext(); - result.add(new ValidateEditChecker(getValidationContext())); - result.add(new ResourceChangeChecker()); - return result; - } - - private class ProblemFinder extends ASTVisitor { - private boolean problemFound = false; - private final RefactoringStatus status; - - public ProblemFinder(RefactoringStatus status) { - this.status = status; - } - - { - shouldVisitProblems = true; - shouldVisitDeclarations = true; - shouldVisitExpressions = true; - shouldVisitStatements = true; - shouldVisitTypeIds = true; - } - - @Override - public int visit(IASTProblem problem) { - addWarningToState(); - return ASTVisitor.PROCESS_CONTINUE; - } - - @Override - public int visit(IASTDeclaration declaration) { - if (declaration instanceof IASTProblemDeclaration) { - addWarningToState(); - } - return ASTVisitor.PROCESS_CONTINUE; - } - - @Override - public int visit(IASTExpression expression) { - if (expression instanceof IASTProblemExpression) { - addWarningToState(); - } - return ASTVisitor.PROCESS_CONTINUE; - } - - @Override - public int visit(IASTStatement statement) { - if (statement instanceof IASTProblemStatement) { - addWarningToState(); - } - return ASTVisitor.PROCESS_CONTINUE; - } - - @Override - public int visit(IASTTypeId typeId) { - if (typeId instanceof IASTProblemTypeId) { - addWarningToState(); - } - return ASTVisitor.PROCESS_CONTINUE; - } - - public boolean hasProblem() { - return problemFound; - } - - private void addWarningToState() { - if (!problemFound) { - status.addWarning(Messages.Refactoring_CompileErrorInTU); - problemFound = true; - } - } - } -} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContext.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContext.java index 2bb1a923fbb..9dc38f553c1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContext.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContext.java @@ -47,7 +47,7 @@ public class CRefactoringContext extends RefactoringContext { private IIndex fIndex; private IASTTranslationUnit fSharedAST; - public CRefactoringContext(CRefactoring2 refactoring) { + public CRefactoringContext(CRefactoring refactoring) { super(refactoring); refactoring.setContext(this); fASTCache = new ConcurrentHashMap<ITranslationUnit, IASTTranslationUnit>(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContribution.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContribution.java index f72aeda196e..4b9c3729873 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContribution.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringContribution.java @@ -32,11 +32,7 @@ public abstract class CRefactoringContribution extends RefactoringContribution { if (descriptor instanceof CRefactoringDescriptor) { CRefactoringDescriptor refDesc = (CRefactoringDescriptor) descriptor; return refDesc.getParameterMap(); - } if (descriptor instanceof CRefactoringDescription) { - CRefactoringDescription refDesc = (CRefactoringDescription) descriptor; - return refDesc.getParameterMap(); - } else { - return super.retrieveArgumentMap(descriptor); } + return super.retrieveArgumentMap(descriptor); } }
\ No newline at end of file diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescription.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescription.java deleted file mode 100644 index 86999000b95..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescription.java +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Institute for Software, HSR Hochschule fuer Technik - * Rapperswil, University of applied sciences and others. - * 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: - * Institute for Software (IFS)- initial API and implementation - ******************************************************************************/ -package org.eclipse.cdt.internal.ui.refactoring; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Map; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.text.TextSelection; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; - -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.ui.CUIPlugin; - -import org.eclipse.cdt.internal.core.resources.ResourceLookup; - -/** - * @author Emanuel Graf IFS - * @deprecated Use {@link CRefactoringDescriptor} instead. - */ -@Deprecated -public abstract class CRefactoringDescription extends RefactoringDescriptor { - public static final String FILE_NAME = "fileName"; //$NON-NLS-1$ - public static final String SELECTION = "selection"; //$NON-NLS-1$ - protected Map<String, String> arguments; - - public CRefactoringDescription(String id, String project, String description, String comment, - int flags, Map<String, String> arguments) { - super(id, project, description, comment, flags); - this.arguments = arguments; - } - - public Map<String, String> getParameterMap() { - return arguments; - } - - protected ISelection getSelection() throws CoreException { - String selectStrings[] = arguments.get(SELECTION).split(","); //$NON-NLS-1$ - if (selectStrings.length < 2) { - throw new CoreException(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, "Illegal selection")); //$NON-NLS-1$ - } - int offset = Integer.parseInt(selectStrings[0]); - int length = Integer.parseInt(selectStrings[1]); - return new TextSelection(offset, length); - } - - protected ICProject getCProject() throws CoreException { - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getProject()); - ICProject cProject = CoreModel.getDefault().create(project); - if (cProject == null) { - throw new CoreException(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, "Unknown Project")); //$NON-NLS-1$ - } - return cProject; - } - - protected IFile getFile() throws CoreException { - try { - String filename = arguments.get(FILE_NAME); - return ResourceLookup.selectFileForLocationURI(new URI(filename), - ResourcesPlugin.getWorkspace().getRoot().getProject(getProject())); - } catch (URISyntaxException e) { - throw new CoreException(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, e.getMessage(), e)); - } - } -}
\ No newline at end of file diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescriptor.java index 9d3824050f9..0481355551f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescriptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoringDescriptor.java @@ -55,11 +55,11 @@ public abstract class CRefactoringDescriptor extends RefactoringDescriptor { } @Override - public abstract CRefactoring2 createRefactoring(RefactoringStatus status) throws CoreException; + public abstract CRefactoring createRefactoring(RefactoringStatus status) throws CoreException; @Override public CRefactoringContext createRefactoringContext(RefactoringStatus status) throws CoreException { - CRefactoring2 refactoring= createRefactoring(status); + CRefactoring refactoring= createRefactoring(status); if (refactoring == null) return null; return new CRefactoringContext(refactoring); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner.java index 38cbefd6f23..0e68c093763 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner.java @@ -1,46 +1,48 @@ -/*******************************************************************************
- * Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
- * Rapperswil, University of applied sciences and others
- * 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:
- * Institute for Software - initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.internal.ui.refactoring;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.IShellProvider;
-
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ICProject;
-
-/**
- * Base class for all refactoring runners.
- *
- * @deprecated Use RefactoringRunner2.
- *
- * @author Emanuel Graf
- */
-@Deprecated
-public abstract class RefactoringRunner {
- protected IFile file;
- protected ISelection selection;
- protected ICElement celement;
- protected IShellProvider shellProvider;
- protected ICProject project;
-
- public RefactoringRunner(IFile file, ISelection selection, ICElement element,
- IShellProvider shellProvider, ICProject cProject) {
- this.file = file;
- this.selection = selection;
- this.celement= element;
- this.shellProvider= shellProvider;
- this.project = cProject;
- }
-
- public abstract void run();
-}
+/******************************************************************************* + * Copyright (c) 2011, 2012 Google, Inc and others. + * 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: + * Sergey Prigogin (Google) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.refactoring; + +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.window.IShellProvider; +import org.eclipse.ltk.ui.refactoring.RefactoringWizard; + +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICProject; + +/** + * Base class for all refactoring runners. + */ +public abstract class RefactoringRunner { + protected final ISelection selection; + protected final ICElement element; + protected final ICProject project; + protected final IShellProvider shellProvider; + + public RefactoringRunner(ICElement element, ISelection selection, IShellProvider shellProvider, + ICProject cProject) { + this.selection = selection; + this.element= element; + this.project = cProject; + this.shellProvider= shellProvider; + } + + public abstract void run(); + + protected final void run(RefactoringWizard wizard, CRefactoring refactoring, int saveMode) { + CRefactoringContext context = new CRefactoringContext(refactoring); + try { + RefactoringStarter starter = new RefactoringStarter(); + starter.activate(wizard, shellProvider.getShell(), refactoring.getName(), saveMode); + } finally { + context.dispose(); + } + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner2.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner2.java deleted file mode 100644 index 17e023f70fb..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringRunner2.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2012 Google, Inc and others. - * 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: - * Sergey Prigogin (Google) - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.refactoring; - -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.window.IShellProvider; -import org.eclipse.ltk.ui.refactoring.RefactoringWizard; - -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ICProject; - -/** - * Base class for all refactoring runners. This class is intended as a replacement - * for RefactoringRunner. - */ -public abstract class RefactoringRunner2 { - protected final ISelection selection; - protected final ICElement element; - protected final ICProject project; - private final IShellProvider shellProvider; - - public RefactoringRunner2(ICElement element, ISelection selection, IShellProvider shellProvider, - ICProject cProject) { - this.selection = selection; - this.element= element; - this.project = cProject; - this.shellProvider= shellProvider; - } - - public abstract void run(); - - protected final void run(RefactoringWizard wizard, CRefactoring2 refactoring, int saveMode) { - CRefactoringContext context = new CRefactoringContext(refactoring); - try { - RefactoringStarter starter = new RefactoringStarter(); - starter.activate(wizard, shellProvider.getShell(), refactoring.getName(), saveMode); - } finally { - context.dispose(); - } - } -} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringStarter.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringStarter.java index cdcb0c57429..94e371fb855 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringStarter.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/RefactoringStarter.java @@ -25,7 +25,7 @@ public class RefactoringStarter { public boolean activate(RefactoringWizard wizard, Shell parent, String dialogTitle, int saveMode) { RefactoringSaveHelper saveHelper= new RefactoringSaveHelper(saveMode); - if (!canActivate(saveHelper, parent)) + if (!saveHelper.saveEditors(parent)) return false; try { @@ -46,8 +46,4 @@ public class RefactoringStarter { public RefactoringStatus getInitialConditionCheckingStatus() { return fStatus; } - - private boolean canActivate(RefactoringSaveHelper saveHelper, Shell shell) { - return saveHelper.saveEditors(shell); - } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java index 1e5d6f17a04..078b3732eeb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java @@ -66,13 +66,12 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; import org.eclipse.cdt.internal.ui.refactoring.ClassMemberInserter; import org.eclipse.cdt.internal.ui.refactoring.MethodContext; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; import org.eclipse.cdt.internal.ui.refactoring.utils.NodeHelper; -import org.eclipse.cdt.internal.ui.refactoring.utils.TranslationUnitHelper; import org.eclipse.cdt.internal.ui.util.NameComposer; /** @@ -80,7 +79,7 @@ import org.eclipse.cdt.internal.ui.util.NameComposer; * * @author Mirko Stocker */ -public class ExtractConstantRefactoring extends CRefactoring2 { +public class ExtractConstantRefactoring extends CRefactoring { public static final String ID = "org.eclipse.cdt.ui.refactoring.extractconstant.ExtractConstantRefactoring"; //$NON-NLS-1$ @@ -344,11 +343,27 @@ public class ExtractConstantRefactoring extends CRefactoring2 { } else { IASTDeclaration nodes = getConstNodesGlobal(constName, ast.getASTNodeFactory()); ASTRewrite rewriter = collector.rewriterForTranslationUnit(ast); - rewriter.insertBefore(ast, TranslationUnitHelper.getFirstNode(ast), nodes, + rewriter.insertBefore(ast, getFirstNode(ast), nodes, new TextEditGroup(Messages.ExtractConstantRefactoring_CreateConstant)); } } + /** + * @return the first node in the translation unit or null + */ + private static IASTNode getFirstNode(IASTTranslationUnit ast) { + IASTDeclaration firstNode = null; + for (IASTDeclaration each : ast.getDeclarations()) { + if (firstNode == null) { + firstNode = each; + } else if (each.getNodeLocations() != null && + each.getNodeLocations()[0].getNodeOffset() < firstNode.getNodeLocations()[0].getNodeOffset()) { + firstNode = each; + } + } + return firstNode; + } + @Override protected RefactoringDescriptor getRefactoringDescriptor() { Map<String, String> arguments = getArgumentMap(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringDescriptor.java index 2ca37c2c39b..4a28cadfb65 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringDescriptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringDescriptor.java @@ -21,7 +21,7 @@ import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum; @@ -39,7 +39,7 @@ public class ExtractConstantRefactoringDescriptor extends CRefactoringDescriptor } @Override - public CRefactoring2 createRefactoring(RefactoringStatus status) + public CRefactoring createRefactoring(RefactoringStatus status) throws CoreException { ISelection selection = getSelection(); ICProject project = getCProject(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringRunner.java index 382fccdcab7..cbba395b3df 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoringRunner.java @@ -18,13 +18,13 @@ import org.eclipse.jface.window.IShellProvider; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner2; +import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; /** * @author Emanuel Graf */ -public class ExtractConstantRefactoringRunner extends RefactoringRunner2 { +public class ExtractConstantRefactoringRunner extends RefactoringRunner { public ExtractConstantRefactoringRunner(ICElement element, ISelection selection, IShellProvider shellProvider, ICProject cProject) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java index 7eacbea7c7a..6e294bdc6b0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java @@ -105,7 +105,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ASTWriterVisitor; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; import org.eclipse.cdt.internal.ui.refactoring.ClassMemberInserter; import org.eclipse.cdt.internal.ui.refactoring.Container; @@ -122,7 +122,7 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.NodeHelper; import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper; import org.eclipse.cdt.internal.ui.viewsupport.BasicElementLabels; -public class ExtractFunctionRefactoring extends CRefactoring2 { +public class ExtractFunctionRefactoring extends CRefactoring { public static final String ID = "org.eclipse.cdt.internal.ui.refactoring.extractfunction.ExtractFunctionRefactoring"; //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringDescriptor.java index 2c04b1e8e62..92a03a90c54 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringDescriptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringDescriptor.java @@ -21,7 +21,7 @@ import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum; @@ -40,7 +40,7 @@ public class ExtractFunctionRefactoringDescriptor extends CRefactoringDescriptor } @Override - public CRefactoring2 createRefactoring(RefactoringStatus status) throws CoreException { + public CRefactoring createRefactoring(RefactoringStatus status) throws CoreException { ISelection selection = getSelection(); ICProject project = getCProject(); ExtractFunctionRefactoring refactoring = diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringRunner.java index 2186c7fe1b9..dbfd49434ea 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoringRunner.java @@ -18,13 +18,13 @@ import org.eclipse.jface.window.IShellProvider; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner2; +import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; /** * @author Emanuel Graf */ -public class ExtractFunctionRefactoringRunner extends RefactoringRunner2 { +public class ExtractFunctionRefactoringRunner extends RefactoringRunner { public ExtractFunctionRefactoringRunner(ICElement element, ISelection selection, IShellProvider shellProvider, ICProject cProject) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java index 69e9c4133a5..f2fff7c0092 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java @@ -67,7 +67,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; import org.eclipse.cdt.internal.ui.refactoring.NodeContainer; @@ -83,7 +83,7 @@ import org.eclipse.cdt.internal.ui.util.NameComposer; * * @author Tom Ball */ -public class ExtractLocalVariableRefactoring extends CRefactoring2 { +public class ExtractLocalVariableRefactoring extends CRefactoring { public static final String ID = "org.eclipse.cdt.internal.ui.refactoring.extractlocalvariable.ExtractLocalVariableRefactoring"; //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringDescriptor.java index 46a7ce73886..d4efbd7b831 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringDescriptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringDescriptor.java @@ -21,7 +21,7 @@ import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2;
+import org.eclipse.cdt.internal.ui.refactoring.CRefactoring;
import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor;
/**
@@ -37,7 +37,7 @@ public class ExtractLocalVariableRefactoringDescriptor extends CRefactoringDescr }
@Override
- public CRefactoring2 createRefactoring(RefactoringStatus status) throws CoreException {
+ public CRefactoring createRefactoring(RefactoringStatus status) throws CoreException {
ISelection selection = getSelection();
ICProject proj = getCProject();
ExtractLocalVariableRefactoring refactoring =
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringRunner.java index 82921f9fca3..45b0fcdc77b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoringRunner.java @@ -18,7 +18,7 @@ import org.eclipse.jface.window.IShellProvider; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner2;
+import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner;
import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper;
/**
@@ -26,7 +26,7 @@ import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; *
* @author Tom Ball
*/
-public class ExtractLocalVariableRefactoringRunner extends RefactoringRunner2 {
+public class ExtractLocalVariableRefactoringRunner extends RefactoringRunner {
public ExtractLocalVariableRefactoringRunner(ICElement element, ISelection selection,
IShellProvider shellProvider, ICProject cProject) {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java index 0c3c64630a9..854a0ab8ed1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java @@ -46,7 +46,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ContainerNode; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.ClassMemberInserter; import org.eclipse.cdt.internal.ui.refactoring.Container; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; @@ -59,7 +59,7 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum; /** * @author Thomas Corbat */ -public class GenerateGettersAndSettersRefactoring extends CRefactoring2 { +public class GenerateGettersAndSettersRefactoring extends CRefactoring { private final class CompositeTypeSpecFinder extends ASTVisitor { private final int start; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoringRunner.java index f20eda89b80..cf7beb31ab0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoringRunner.java @@ -22,13 +22,13 @@ import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner2; +import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; /** * @author Thomas Corbat */ -public class GenerateGettersAndSettersRefactoringRunner extends RefactoringRunner2 { +public class GenerateGettersAndSettersRefactoringRunner extends RefactoringRunner { public GenerateGettersAndSettersRefactoringRunner(ICElement element, ISelection selection, IShellProvider shellProvider, ICProject cProject) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoring.java index 54209408621..18d8d571577 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoring.java @@ -60,7 +60,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.corext.util.CModelUtil; import org.eclipse.cdt.internal.ui.editor.ITranslationUnitEditorInput; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; import org.eclipse.cdt.internal.ui.refactoring.ClassMemberInserter; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; @@ -72,7 +72,7 @@ import org.eclipse.cdt.internal.ui.util.EditorUtility; /** * @author Guido Zgraggen IFS */ -public class HideMethodRefactoring extends CRefactoring2 { +public class HideMethodRefactoring extends CRefactoring { public static final String ID = "org.eclipse.cdt.internal.ui.refactoring.hidemethod.HideMethodRefactoring"; //$NON-NLS-1$ private IASTName methodName; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringDescriptor.java index 2b593ba344f..a7f80da1289 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringDescriptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringDescriptor.java @@ -21,7 +21,7 @@ import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.CRefactoringDescriptor; /** @@ -35,7 +35,7 @@ public class HideMethodRefactoringDescriptor extends CRefactoringDescriptor { } @Override - public CRefactoring2 createRefactoring(RefactoringStatus status) throws CoreException { + public CRefactoring createRefactoring(RefactoringStatus status) throws CoreException { ISelection selection = getSelection(); ICProject proj = getCProject(); return new HideMethodRefactoring(getTranslationUnit(), selection, proj); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringRunner.java index 539b53d267d..7c92ae39961 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/hidemethod/HideMethodRefactoringRunner.java @@ -18,13 +18,13 @@ import org.eclipse.jface.window.IShellProvider; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner2; +import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; /** * @author Guido Zgraggen IFS */ -public class HideMethodRefactoringRunner extends RefactoringRunner2 { +public class HideMethodRefactoringRunner extends RefactoringRunner { public HideMethodRefactoringRunner(ICElement element, ISelection selection, IShellProvider shellProvider, ICProject cProject) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java index f43c5cc9473..d795fbdb5ef 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java @@ -60,7 +60,7 @@ import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; -import org.eclipse.cdt.internal.ui.refactoring.CRefactoring2; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; import org.eclipse.cdt.internal.ui.refactoring.utils.Checks; import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper; @@ -73,7 +73,7 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper; * * @author Mirko Stocker, Lukas Felber, Emanuel Graf */ -public class ImplementMethodRefactoring extends CRefactoring2 { +public class ImplementMethodRefactoring extends CRefactoring { private ICPPASTFunctionDeclarator createdMethodDeclarator; private ImplementMethodData data; private MethodDefinitionInsertLocationFinder methodDefinitionInsertLocationFinder; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoringRunner.java index 3277463bfa6..5c37e6c4393 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoringRunner.java @@ -19,13 +19,13 @@ import org.eclipse.jface.window.IShellProvider; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner2; +import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; /** * @author Lukas Felber */ -public class ImplementMethodRefactoringRunner extends RefactoringRunner2 { +public class ImplementMethodRefactoringRunner extends RefactoringRunner { public ImplementMethodRefactoringRunner(ICElement element, ISelection selection, IShellProvider shellProvider, ICProject cProject) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/IToggleRefactoringStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/IToggleRefactoringStrategy.java index 29c1f66918e..2324fe320cc 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/IToggleRefactoringStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/IToggleRefactoringStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,12 +7,15 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; +import org.eclipse.core.runtime.CoreException; + import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; public interface IToggleRefactoringStrategy { - public void run(ModificationCollector modifications); + public void run(ModificationCollector modifications) throws CoreException; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.java index 21d62075dab..859204977be 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,7 +7,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Emanuel Graf IFS - initial API and implementation + * Emanuel Graf IFS - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; @@ -18,12 +19,10 @@ public class Messages extends NLS { public static String DeclaratorFinder_NoDeclarator; public static String DeclaratorFinder_MultipleDeclarators; public static String RefactoringJob_UndoName; - public static String ToggleFileCreator_andMove; public static String ToggleFileCreator_CanNotCreateNewFile; - public static String ToggleFileCreator_CreateNewFile; + public static String ToggleFileCreator_CreateNewFilePrompt; public static String ToggleFileCreator_NewImplFile; public static String ToggleFileCreator_NoTuForSibling; - public static String ToggleFileCreator_QMark; public static String ToggleFromClassToInHeaderStrategy_DefAndDecInsideClass; public static String EditGroupName; public static String ToggleFromImplementationToHeaderOrClassStrategy_CanNotCreateNewFile; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.properties index d422dd488e6..3df90919dad 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/Messages.properties @@ -7,18 +7,17 @@ # http://www.eclipse.org/legal/epl-v10.html # # Contributors: -# Martin Schwab & Thomas Kallenberg - initial API and implementation +# Martin Schwab & Thomas Kallenberg - initial API and implementation +# Sergey Prigogin (Google) ############################################################################### DeclaratorFinder_NestedFunction=Nested function declarations not supported DeclaratorFinder_NoDeclarator=Cannot work without declarator DeclaratorFinder_MultipleDeclarators=Cannot work with multiple declarators RefactoringJob_UndoName=Toggle function definition -ToggleFileCreator_andMove=\ and move -ToggleFileCreator_CanNotCreateNewFile=Cannot create new file change -ToggleFileCreator_CreateNewFile=Create a new file named: +ToggleFileCreator_CanNotCreateNewFile=Cannot create new file ''{0}'' +ToggleFileCreator_CreateNewFilePrompt=Create a new file ''{0}'' and move {1}? ToggleFileCreator_NewImplFile=New Implementation file? ToggleFileCreator_NoTuForSibling=Cannot find translation unit for sibling file -ToggleFileCreator_QMark=? ToggleFromClassToInHeaderStrategy_DefAndDecInsideClass=Definition and Declaration both inside class. Behavior is undefined. ToggleFromImplementationToHeaderOrClassStrategy_CanNotCreateNewFile=Cannot create new File ToggleFromImplementationToHeaderOrClassStrategy_CanNotToggle=Not a free function. Cannot decide where to toggle diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/RefactoringJob.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/RefactoringJob.java index 633574d5628..a82607e5593 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/RefactoringJob.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/RefactoringJob.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,7 +7,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Institute for Software - initial API and implementation + * Institute for Software - initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; @@ -20,18 +21,19 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.IUndoManager; import org.eclipse.ltk.core.refactoring.NullChange; -import org.eclipse.ltk.core.refactoring.Refactoring; import org.eclipse.ltk.core.refactoring.RefactoringCore; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoringContext; + class RefactoringJob extends Job { public final static Object FAMILY_TOGGLE_DEFINITION = new Object(); - private final Refactoring refactoring; + private final ToggleRefactoring refactoring; - RefactoringJob(Refactoring refactoring) { - super("'toggle function definition' code automation"); //$NON-NLS-1$ + RefactoringJob(ToggleRefactoring refactoring) { + super("Toggle Function Definition code automation"); //$NON-NLS-1$ this.refactoring = refactoring; setPriority(Job.SHORT); } @@ -43,6 +45,7 @@ class RefactoringJob extends Job { @Override protected IStatus run(IProgressMonitor monitor) { + CRefactoringContext context = new CRefactoringContext(refactoring); IUndoManager undoManager = RefactoringCore.getUndoManager(); Change change = new NullChange(); Change undoChange = new NullChange(); @@ -64,6 +67,7 @@ class RefactoringJob extends Job { } catch (CoreException e) { CUIPlugin.log("Failure during generation of changes.", e); //$NON-NLS-1$ } finally { + context.dispose(); undoChange.initializeValidationData(monitor); undoManager.changePerformed(change, success); try { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java index 12685e93b9f..7067a58562f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,25 +7,27 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModelUtil; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; -import org.eclipse.cdt.internal.ui.refactoring.Container; import org.eclipse.cdt.internal.ui.refactoring.CreateFileChange; public class ToggleFileCreator { @@ -38,8 +40,8 @@ public class ToggleFileCreator { this.context = context; this.ending = ending; } - - public IASTTranslationUnit loadTranslationUnit() { + + public ITranslationUnit getTranslationUnit() { String filename; if (context.getDeclaration() != null) { filename = context.getDeclaration().getContainingFilename(); @@ -54,11 +56,10 @@ public class ToggleFileCreator { } filename = filename.replaceAll("\\w*" + other + "$", EMPTY_STRING) + getNewFileName(); //$NON-NLS-1$//$NON-NLS-2$ IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(filename)); - IASTTranslationUnit result = null; + ITranslationUnit result = null; try { - result = CoreModelUtil.findTranslationUnitForLocation(file.getFullPath(), null).getAST(); + result = CoreModelUtil.findTranslationUnitForLocation(file.getFullPath(), null); } catch (CModelException e) { - } catch (CoreException e) { } if (result == null) { throw new NotSupportedException(Messages.ToggleFileCreator_NoTuForSibling); @@ -66,14 +67,17 @@ public class ToggleFileCreator { return result; } - public void createNewFile() { + public IFile createNewFile() { String filename = getNewFileName(); + IPath path = new Path(getPath() + filename); try { - CreateFileChange change = new CreateFileChange(filename, new Path(getPath() + filename), - EMPTY_STRING, context.getSelectionFile().getCharset()); + CreateFileChange change = new CreateFileChange(filename, path, EMPTY_STRING, + context.getSelectionFile().getCharset()); change.perform(new NullProgressMonitor()); + return (IFile) change.getModifiedElement(); } catch (CoreException e) { - throw new NotSupportedException(Messages.ToggleFileCreator_CanNotCreateNewFile); + throw new NotSupportedException(NLS.bind(Messages.ToggleFileCreator_CanNotCreateNewFile, + path.toString())); } } @@ -81,24 +85,23 @@ public class ToggleFileCreator { if (context.isSettedDefaultAnswer()) { return context.getDefaultAnswer(); } - final Container<Boolean> answer = new Container<Boolean>(); + final boolean[] answer = new boolean[1]; Runnable r = new Runnable() { @Override public void run() { Shell shell = CUIPlugin.getDefault().getWorkbench().getWorkbenchWindows()[0].getShell(); - String functionname; + String functionName; if (context.getDeclaration() != null) { - functionname = context.getDeclaration().getRawSignature(); + functionName = context.getDeclaration().getRawSignature(); } else { - functionname = context.getDefinition().getDeclarator().getRawSignature(); + functionName = context.getDefinition().getDeclarator().getRawSignature(); } - boolean createnew = MessageDialog.openQuestion(shell, Messages.ToggleFileCreator_NewImplFile, - Messages.ToggleFileCreator_CreateNewFile + getNewFileName() + Messages.ToggleFileCreator_andMove + functionname + Messages.ToggleFileCreator_QMark); - answer.setObject(createnew); + answer[0] = MessageDialog.openQuestion(shell, Messages.ToggleFileCreator_NewImplFile, + NLS.bind(Messages.ToggleFileCreator_CreateNewFilePrompt, getNewFileName(), functionName)); } }; PlatformUI.getWorkbench().getDisplay().syncExec(r); - return answer.getObject(); + return answer[0]; } public String getIncludeStatement() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromClassToInHeaderStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromClassToInHeaderStrategy.java index ef595429c68..3922ae1e3d4 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromClassToInHeaderStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromClassToInHeaderStrategy.java @@ -7,7 +7,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; @@ -33,7 +33,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; public class ToggleFromClassToInHeaderStrategy implements IToggleRefactoringStrategy { - protected TextEditGroup infoText = new TextEditGroup(Messages.EditGroupName); private ToggleRefactoringContext context; @@ -61,7 +60,7 @@ public class ToggleFromClassToInHeaderStrategy implements IToggleRefactoringStra private IASTNode getNewDefinition(IASTNode parentNamespace) { IASTNode newDefinition = ToggleNodeHelper.getQualifiedNameDefinition( - context.getDefinition(), context.getDefinitionUnit(), parentNamespace); + context.getDefinition(), context.getDefinitionAST(), parentNamespace); ((IASTFunctionDefinition) newDefinition).setBody( context.getDefinition().getBody().copy(CopyStyle.withLocations)); if (newDefinition instanceof ICPPASTFunctionWithTryBlock) { @@ -76,7 +75,7 @@ public class ToggleFromClassToInHeaderStrategy implements IToggleRefactoringStra if (templdecl != null) { newDefinition = templdecl; } - newDefinition.setParent(context.getDefinitionUnit()); + newDefinition.setParent(context.getDefinitionAST()); return newDefinition; } @@ -84,7 +83,7 @@ public class ToggleFromClassToInHeaderStrategy implements IToggleRefactoringStra IASTNode parentNamespace = CPPVisitor.findAncestorWithType(context.getDefinition(), ICPPASTNamespaceDefinition.class); if (parentNamespace == null) - parentNamespace = context.getDefinitionUnit(); + parentNamespace = context.getDefinitionAST(); return parentNamespace; } @@ -99,13 +98,13 @@ public class ToggleFromClassToInHeaderStrategy implements IToggleRefactoringStra ModificationCollector modifications, IASTSimpleDeclaration newDeclaration) { ASTRewrite rewriter = modifications.rewriterForTranslationUnit( - context.getDefinitionUnit()); + context.getDefinitionAST()); rewriter.replace(context.getDefinition(), newDeclaration, infoText); return rewriter; } private IASTSimpleDeclaration getNewDeclaration() { - INodeFactory factory = context.getDefinitionUnit().getASTNodeFactory(); + INodeFactory factory = context.getDefinitionAST().getASTNodeFactory(); IASTDeclSpecifier newDeclSpecifier = context.getDefinition().getDeclSpecifier().copy(CopyStyle.withLocations); newDeclSpecifier.setInline(false); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromImplementationToHeaderOrClassStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromImplementationToHeaderOrClassStrategy.java index cc0e910dd92..a1ea8336546 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromImplementationToHeaderOrClassStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromImplementationToHeaderOrClassStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,12 +7,15 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; import java.util.List; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; import org.eclipse.text.edits.TextEditGroup; import org.eclipse.cdt.core.dom.ast.IASTComment; @@ -37,8 +40,8 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.CPPASTAllVisitor; public class ToggleFromImplementationToHeaderOrClassStrategy implements IToggleRefactoringStrategy { private ToggleRefactoringContext context; private TextEditGroup infoText; - private IASTTranslationUnit other_tu; - private ASTLiteralNode includenode; + private IASTTranslationUnit otherAst; + private ASTLiteralNode includeNode; public ToggleFromImplementationToHeaderOrClassStrategy(ToggleRefactoringContext context) { this.context = context; @@ -50,34 +53,34 @@ public class ToggleFromImplementationToHeaderOrClassStrategy implements IToggleR } @Override - public void run(ModificationCollector modifications) { + public void run(ModificationCollector modifications) throws CoreException { newFileCheck(); - ASTRewrite implast = modifications.rewriterForTranslationUnit(context.getDefinitionUnit()); - List<IASTComment>leadingComments = implast.getComments(context.getDefinition(), CommentPosition.leading); - removeDefinitionFromImplementation(implast); - if (includenode != null) { - implast.insertBefore(context.getDefinitionUnit(), - context.getDefinitionUnit().getChildren()[0], includenode, infoText); + ASTRewrite implAst = modifications.rewriterForTranslationUnit(context.getDefinitionAST()); + List<IASTComment>leadingComments = implAst.getComments(context.getDefinition(), CommentPosition.leading); + removeDefinitionFromImplementation(implAst); + if (includeNode != null) { + implAst.insertBefore(context.getDefinitionAST(), + context.getDefinitionAST().getChildren()[0], includeNode, infoText); } - if (context.getDeclarationUnit() != null) { + if (context.getDeclarationAST() != null) { addDefinitionToClass(modifications, leadingComments); } else { addDefinitionToHeader(modifications, leadingComments); } } - private void newFileCheck() { - if (context.getDeclarationUnit() == null) { + private void newFileCheck() throws CoreException { + if (context.getDeclarationAST() == null) { if (isFreeFunction(context.getDefinition())) { throw new NotSupportedException(Messages.ToggleFromImplementationToHeaderOrClassStrategy_CanNotToggle); } - other_tu = context.getTUForSiblingFile(); - if (other_tu == null) { - ToggleFileCreator filecreator = new ToggleFileCreator(context, ".h"); //$NON-NLS-1$ - if (filecreator.askUserForFileCreation(context)) { - filecreator.createNewFile(); - other_tu = filecreator.loadTranslationUnit(); - includenode = new ASTLiteralNode(filecreator.getIncludeStatement() + "\n\n"); //$NON-NLS-1$ + otherAst = context.getASTForPartnerFile(); + if (otherAst == null) { + ToggleFileCreator fileCreator = new ToggleFileCreator(context, ".h"); //$NON-NLS-1$ + if (fileCreator.askUserForFileCreation(context)) { + IFile file = fileCreator.createNewFile(); + otherAst = context.getAST(file, null); + includeNode = new ASTLiteralNode(fileCreator.getIncludeStatement() + "\n\n"); //$NON-NLS-1$ } else { throw new NotSupportedException(Messages.ToggleFromImplementationToHeaderOrClassStrategy_CanNotCreateNewFile); } @@ -86,13 +89,13 @@ public class ToggleFromImplementationToHeaderOrClassStrategy implements IToggleR } private void addDefinitionToHeader(ModificationCollector modifications, List<IASTComment> leadingComments) { - ASTRewrite headerRewrite = modifications.rewriterForTranslationUnit(other_tu); + ASTRewrite headerRewrite = modifications.rewriterForTranslationUnit(otherAst); IASTFunctionDefinition newDefinition = ToggleNodeHelper.createFunctionSignatureWithEmptyBody( context.getDefinition().getDeclSpecifier().copy(CopyStyle.withLocations), context.getDefinition().getDeclarator().copy(CopyStyle.withLocations), context.getDefinition().copy(CopyStyle.withLocations)); - newDefinition.setParent(other_tu); - headerRewrite.insertBefore(other_tu.getTranslationUnit(), null, newDefinition, infoText); + newDefinition.setParent(otherAst); + headerRewrite.insertBefore(otherAst.getTranslationUnit(), null, newDefinition, infoText); restoreBody(headerRewrite, newDefinition, modifications); for (IASTComment comment : leadingComments) { headerRewrite.addComment(newDefinition, comment, CommentPosition.leading); @@ -101,9 +104,9 @@ public class ToggleFromImplementationToHeaderOrClassStrategy implements IToggleR private void addDefinitionToClass(ModificationCollector modifications, List<IASTComment> leadingComments) { ASTRewrite headerRewrite = modifications.rewriterForTranslationUnit( - context.getDeclarationUnit()); + context.getDeclarationAST()); IASTFunctionDefinition newDefinition = ToggleNodeHelper.createInClassDefinition( - context.getDeclaration(), context.getDefinition(), context.getDeclarationUnit()); + context.getDeclaration(), context.getDefinition(), context.getDeclarationAST()); newDefinition.setParent(getParent()); restoreBody(headerRewrite, newDefinition, modifications); headerRewrite.replace(context.getDeclaration().getParent(), newDefinition, infoText); @@ -119,7 +122,7 @@ public class ToggleFromImplementationToHeaderOrClassStrategy implements IToggleR if (parent != null) { parentnode = parent; } else { - parentnode =context.getDeclarationUnit(); + parentnode =context.getDeclarationAST(); } return parentnode; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToClassStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToClassStrategy.java index 0b907ef4dde..7329c1865f8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToClassStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToClassStrategy.java @@ -36,7 +36,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; public class ToggleFromInHeaderToClassStrategy implements IToggleRefactoringStrategy { - private TextEditGroup infoText; private ToggleRefactoringContext context; @@ -67,8 +66,7 @@ public class ToggleFromInHeaderToClassStrategy implements IToggleRefactoringStra IASTNode parentTemplateDeclaration = ToggleNodeHelper.getParentTemplateDeclaration(context.getDeclaration()); - if (parentTemplateDeclaration instanceof ICPPASTTemplateDeclaration) { - } else { + if (!(parentTemplateDeclaration instanceof ICPPASTTemplateDeclaration)) { restoreLeadingComments(rewriter, newDefinition); } } @@ -84,7 +82,7 @@ public class ToggleFromInHeaderToClassStrategy implements IToggleRefactoringStra } private ASTRewrite removeDefinition(ModificationCollector modifications) { - ASTRewrite rewriter = modifications.rewriterForTranslationUnit(context.getDefinitionUnit()); + ASTRewrite rewriter = modifications.rewriterForTranslationUnit(context.getDefinitionAST()); IASTNode parentRemovePoint = ToggleNodeHelper.getParentRemovePoint(context.getDefinition()); rewriter.remove(parentRemovePoint, infoText); return rewriter; @@ -92,7 +90,7 @@ public class ToggleFromInHeaderToClassStrategy implements IToggleRefactoringStra private IASTFunctionDefinition getNewDefinition() { IASTFunctionDefinition newDefinition = ToggleNodeHelper.createInClassDefinition( - context.getDeclaration(), context.getDefinition(), context.getDefinitionUnit()); + context.getDeclaration(), context.getDefinition(), context.getDefinitionAST()); newDefinition.setBody(context.getDefinition().getBody().copy(CopyStyle.withLocations)); if (newDefinition instanceof ICPPASTFunctionWithTryBlock) { ICPPASTFunctionWithTryBlock newTryFun = (ICPPASTFunctionWithTryBlock) newDefinition; @@ -105,9 +103,8 @@ public class ToggleFromInHeaderToClassStrategy implements IToggleRefactoringStra IASTNode parent = CPPVisitor.findAncestorWithType(context.getDefinition(), ICPPASTCompositeTypeSpecifier.class); if (parent != null) { newDefinition.setParent(parent); - } - else { - newDefinition.setParent(context.getDefinitionUnit()); + } else { + newDefinition.setParent(context.getDefinitionAST()); } return newDefinition; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java index 5369155e003..ad241ab3aef 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java @@ -14,6 +14,8 @@ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; import java.util.List; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; import org.eclipse.text.edits.TextEditGroup; import org.eclipse.cdt.core.dom.ast.ASTVisitor; @@ -58,7 +60,7 @@ import org.eclipse.cdt.internal.ui.refactoring.Container; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefactoringStrategy { - private IASTTranslationUnit implUnit; + private IASTTranslationUnit implAst; private ToggleRefactoringContext context; private TextEditGroup infoText; private ASTLiteralNode includeNode; @@ -69,11 +71,10 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact } @Override - public void run(ModificationCollector collector) { + public void run(ModificationCollector collector) throws CoreException { if (!newFileCheck()) { return; } -// newFileCheck(); ICPPASTFunctionDefinition newDefinition = getNewDefinition(); if (context.getDeclaration() != null) { removeDefinitionFromHeader(collector); @@ -81,9 +82,9 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact replaceDefinitionWithDeclaration(collector); } - ASTRewrite implRewrite = collector.rewriterForTranslationUnit(implUnit); + ASTRewrite implRewrite = collector.rewriterForTranslationUnit(implAst); if (includeNode != null) { - implRewrite.insertBefore(implUnit, null, includeNode, infoText); + implRewrite.insertBefore(implAst, null, includeNode, infoText); } IASTNode insertionParent = null; @@ -94,20 +95,20 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact insertionParent = searchNamespaceInImplementation(parent.getName()); if (insertionParent == null) { insertionParent = createNamespace(parent); - implRewrite = implRewrite.insertBefore(implUnit.getTranslationUnit(), + implRewrite = implRewrite.insertBefore(implAst.getTranslationUnit(), null, insertionParent, infoText); } } else { - insertionParent = implUnit.getTranslationUnit(); + insertionParent = implAst.getTranslationUnit(); } newDefinition.setParent(insertionParent); IASTNode insertionPoint = findInsertionPoint(insertionParent, - context.getDeclarationUnit()); + context.getDeclarationAST()); ASTRewrite newRewriter = implRewrite.insertBefore(insertionParent, insertionPoint, newDefinition, infoText); - copyCommentsToNewFile(newDefinition, newRewriter, collector.rewriterForTranslationUnit(context.getDefinitionUnit())); + copyCommentsToNewFile(newDefinition, newRewriter, collector.rewriterForTranslationUnit(context.getDefinitionAST())); restoreLeadingComments(newDefinition, newRewriter, collector); } @@ -241,14 +242,14 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact }); } - private boolean newFileCheck() { - implUnit = context.getTUForSiblingFile(); - if (implUnit == null) { - ToggleFileCreator filecreator = new ToggleFileCreator(context, ".cpp"); //$NON-NLS-1$ - if (filecreator.askUserForFileCreation(context)) { - filecreator.createNewFile(); - implUnit = filecreator.loadTranslationUnit(); - includeNode = new ASTLiteralNode(filecreator.getIncludeStatement()); + private boolean newFileCheck() throws CoreException { + implAst = context.getASTForPartnerFile(); + if (implAst == null) { + ToggleFileCreator fileCreator = new ToggleFileCreator(context, ".cpp"); //$NON-NLS-1$ + if (fileCreator.askUserForFileCreation(context)) { + IFile file = fileCreator.createNewFile(); + implAst = context.getAST(file, null); + includeNode = new ASTLiteralNode(fileCreator.getIncludeStatement()); return true; } else { return false; @@ -268,7 +269,7 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact private IASTNode findInsertionPoint(IASTNode insertionParent, IASTTranslationUnit unit) { IASTFunctionDeclarator declarator = context.getDeclaration(); if (unit == null) { - unit = context.getDefinitionUnit(); + unit = context.getDefinitionAST(); } if (declarator == null) { declarator = context.getDefinition().getDeclarator(); @@ -280,7 +281,7 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact private void restoreLeadingComments(ICPPASTFunctionDefinition newDefinition, ASTRewrite newRewriter, ModificationCollector collector) { - ASTRewrite rw = collector.rewriterForTranslationUnit(context.getDefinitionUnit()); + ASTRewrite rw = collector.rewriterForTranslationUnit(context.getDefinitionAST()); List<IASTComment>comments = rw.getComments(context.getDefinition(), CommentPosition.leading); if (comments != null) { for (IASTComment comment : comments) { @@ -295,7 +296,7 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact private void replaceDefinitionWithDeclaration(ModificationCollector collector) { IASTSimpleDeclaration newdeclarator = ToggleNodeHelper.createDeclarationFromDefinition(context.getDefinition()); - ASTRewrite rewrite = collector.rewriterForTranslationUnit(context.getDefinitionUnit()); + ASTRewrite rewrite = collector.rewriterForTranslationUnit(context.getDefinitionAST()); rewrite.replace(context.getDefinition(), newdeclarator, infoText); } @@ -343,19 +344,19 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact private CPPASTNamespaceDefinition createNamespace(ICPPASTNamespaceDefinition parent_namespace) { CPPASTNamespaceDefinition insertionParent = new CPPASTNamespaceDefinition( parent_namespace.getName().copy(CopyStyle.withLocations)); - insertionParent.setParent(implUnit); + insertionParent.setParent(implAst); return insertionParent; } private void removeDefinitionFromHeader(ModificationCollector collector) { ASTRewrite header_rewrite = collector.rewriterForTranslationUnit( - context.getDefinitionUnit()); + context.getDefinitionAST()); header_rewrite.remove(ToggleNodeHelper.getParentRemovePoint(context.getDefinition()), infoText); } private IASTNode searchNamespaceInImplementation(final IASTName name) { final Container<IASTNode> result = new Container<IASTNode>(); - this.implUnit.accept(new ASTVisitor() { + this.implAst.accept(new ASTVisitor() { { shouldVisitNamespaces = true; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleNodeHelper.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleNodeHelper.java index 29bf60f1a65..e78249906cc 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleNodeHelper.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleNodeHelper.java @@ -16,11 +16,6 @@ import java.util.List; import java.util.ListIterator; import java.util.Stack; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.Path; - -import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTComment; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; @@ -46,15 +41,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.rewrite.ASTRewrite; import org.eclipse.cdt.core.dom.rewrite.ASTRewrite.CommentPosition; -import org.eclipse.cdt.core.index.IIndex; -import org.eclipse.cdt.core.index.IIndexFile; -import org.eclipse.cdt.core.index.IIndexInclude; -import org.eclipse.cdt.core.index.IndexLocationFactory; -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.model.CoreModelUtil; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCompoundStatement; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDefinition; @@ -64,8 +50,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTemplateId; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTypeId; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; -import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; import org.eclipse.cdt.internal.ui.refactoring.utils.NodeHelper; @@ -82,8 +66,7 @@ public class ToggleNodeHelper extends NodeHelper { } } - private static ArrayList<ICPPASTConstructorChainInitializer> - getInitializerList(IASTFunctionDefinition definition) { + private static List<ICPPASTConstructorChainInitializer> getInitializerList(IASTFunctionDefinition definition) { ArrayList<ICPPASTConstructorChainInitializer> initalizers = new ArrayList<ICPPASTConstructorChainInitializer>(); @@ -95,8 +78,7 @@ public class ToggleNodeHelper extends NodeHelper { return initalizers; } - static IASTSimpleDeclaration createDeclarationFromDefinition( - IASTFunctionDefinition oldDefinition) { + static IASTSimpleDeclaration createDeclarationFromDefinition(IASTFunctionDefinition oldDefinition) { IASTDeclarator newDeclarator = oldDefinition.getDeclarator().copy(CopyStyle.withLocations); IASTDeclSpecifier newDeclSpec = oldDefinition.getDeclSpecifier().copy(CopyStyle.withLocations); IASTSimpleDeclaration newDeclaration = new CPPASTSimpleDeclaration(newDeclSpec); @@ -133,8 +115,7 @@ public class ToggleNodeHelper extends NodeHelper { return newFuncDecl; } - private static void copyInitializerList(ICPPASTFunctionDefinition newFunc, - IASTFunctionDefinition oldFunc) { + private static void copyInitializerList(ICPPASTFunctionDefinition newFunc, IASTFunctionDefinition oldFunc) { for (ICPPASTConstructorChainInitializer initializer : getInitializerList(oldFunc)) { initializer.setParent(newFunc); newFunc.addMemberInitializer(initializer); @@ -168,12 +149,12 @@ public class ToggleNodeHelper extends NodeHelper { } private static ICPPASTTemplateDeclaration addTemplateDeclarationsInOrder( - ArrayList<ICPPASTTemplateDeclaration> templdecs, IASTFunctionDefinition newfunc) { - ListIterator<ICPPASTTemplateDeclaration> iter1 = templdecs.listIterator(); + ArrayList<ICPPASTTemplateDeclaration> templDecs, IASTFunctionDefinition newFunction) { + ListIterator<ICPPASTTemplateDeclaration> iter1 = templDecs.listIterator(); ICPPASTTemplateDeclaration child = null; while (iter1.hasNext()) { child = iter1.next(); - child.setDeclaration(newfunc); + child.setDeclaration(newFunction); ListIterator<ICPPASTTemplateDeclaration> iter2 = iter1; if (iter2.hasNext()) { ICPPASTTemplateDeclaration parent = iter2.next(); @@ -185,8 +166,7 @@ public class ToggleNodeHelper extends NodeHelper { return child; } - private static ArrayList<ICPPASTTemplateDeclaration> getAllTemplateDeclaration( - IASTNode node) { + private static ArrayList<ICPPASTTemplateDeclaration> getAllTemplateDeclaration(IASTNode node) { ArrayList<ICPPASTTemplateDeclaration> templdecs = new ArrayList<ICPPASTTemplateDeclaration>(); while (node.getParent() != null) { node = node.getParent(); @@ -198,10 +178,10 @@ public class ToggleNodeHelper extends NodeHelper { } static IASTFunctionDefinition createInClassDefinition(IASTFunctionDeclarator dec, - IASTFunctionDefinition def, IASTTranslationUnit insertionunit) { + IASTFunctionDefinition def, IASTTranslationUnit insertionAst) { IASTFunctionDeclarator declarator = dec.copy(CopyStyle.withLocations); - ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) def.getDeclSpecifier().copy( - CopyStyle.withLocations); + ICPPASTDeclSpecifier declSpec = + (ICPPASTDeclSpecifier) def.getDeclSpecifier().copy(CopyStyle.withLocations); declSpec.setInline(false); if (ToggleNodeHelper.isVirtual(dec)) { declSpec.setVirtual(true); @@ -263,8 +243,8 @@ public class ToggleNodeHelper extends NodeHelper { return qName; } - private static Stack<IASTNode> getQualifiedNames( - IASTFunctionDeclarator declarator, IASTNode limiter, IASTNode node) { + private static Stack<IASTNode> getQualifiedNames(IASTFunctionDeclarator declarator, + IASTNode limiter, IASTNode node) { IASTName lastName = declarator.getName(); Stack<IASTNode> nodes = new Stack<IASTNode>(); while (node.getParent() != null && node.getParent() != limiter) { @@ -294,12 +274,12 @@ public class ToggleNodeHelper extends NodeHelper { private static ICPPASTTemplateId getTemplateParameter(IASTNode node, IASTName name) { ICPPASTTemplateId templateID = new CPPASTTemplateId(); templateID.setTemplateName(name.copy(CopyStyle.withLocations)); - for(IASTNode child : node.getChildren()) { + for (IASTNode child : node.getChildren()) { if (child instanceof ICPPASTSimpleTypeTemplateParameter) { - ICPPASTSimpleTypeTemplateParameter tempcild = (ICPPASTSimpleTypeTemplateParameter) child; + ICPPASTSimpleTypeTemplateParameter tempChild = (ICPPASTSimpleTypeTemplateParameter) child; CPPASTNamedTypeSpecifier namedTypeSpecifier = new CPPASTNamedTypeSpecifier(); - namedTypeSpecifier.setName(tempcild.getName().copy(CopyStyle.withLocations)); + namedTypeSpecifier.setName(tempChild.getName().copy(CopyStyle.withLocations)); CPPASTTypeId id = new CPPASTTypeId(); id.setDeclSpecifier(namedTypeSpecifier); @@ -309,54 +289,6 @@ public class ToggleNodeHelper extends NodeHelper { return templateID; } - /** - * @deprecated Use SourceHeaderPartnerHelper - */ - @Deprecated - static IASTTranslationUnit getSiblingFile(IFile file, IASTTranslationUnit ast) throws CoreException { - ICProject cProject = CoreModel.getDefault().create(file).getCProject(); - ICProject[] projects = CoreModel.getDefault().getCModel().getCProjects(); - IIndex projectIndex = CCorePlugin.getIndexManager().getIndex(projects); - try { - projectIndex.acquireReadLock(); - - IIndexFile[] thisFileVariants = projectIndex.getFiles(ast.getLinkage().getLinkageID(), - IndexLocationFactory.getWorkspaceIFL(file)); - String fileName = ToggleNodeHelper.getFilenameWithoutExtension( - file.getFullPath().toString()); - if (ast.isHeaderUnit()) { - for (IIndexFile thisFile : thisFileVariants) { - for (IIndexInclude include : projectIndex.findIncludedBy(thisFile)) { - if (ToggleNodeHelper.getFilenameWithoutExtension(include.getIncludedBy().getLocation().getFullPath()).equals(fileName)) { - ITranslationUnit tu = CoreModelUtil.findTranslationUnitForLocation(include.getIncludedBy().getLocation().getURI(), cProject); - return tu.getAST(projectIndex, ITranslationUnit.AST_SKIP_ALL_HEADERS); - } - } - } - } else { - for (IIndexFile thisFile : thisFileVariants) { - for (IIndexInclude include : projectIndex.findIncludes(thisFile)) { - if (ToggleNodeHelper.getFilenameWithoutExtension(include.getFullName()).equals(fileName)) { - if (include.getIncludesLocation() == null) { - throw new NotSupportedException("The include file does not exist"); //$NON-NLS-1$ - } - String loc = include.getIncludesLocation().getFullPath(); - ICElement tufile = CoreModel.getDefault().create(new Path(loc)); - if (tufile instanceof TranslationUnit) { - return ((TranslationUnit) tufile).getAST(null, ITranslationUnit.AST_SKIP_ALL_HEADERS); - } - } - } - } - } - } catch (InterruptedException e) { - // Ignore - } finally { - projectIndex.releaseReadLock(); - } - return null; - } - public static String getFilenameWithoutExtension(String filename) { int indexP = filename.lastIndexOf('.'); int indexS = filename.lastIndexOf('/'); @@ -395,31 +327,31 @@ public class ToggleNodeHelper extends NodeHelper { * Gets comments inside the body of a function. * @return The body as a string and all the catch handlers */ - public static String getBody(IASTFunctionDefinition oldDefinition, IASTTranslationUnit oldUnit, + public static String getBody(IASTFunctionDefinition oldDefinition, IASTTranslationUnit ast, ModificationCollector modifications) { - return getBodyOnly(oldDefinition, oldUnit, modifications) - + getCatchHandlers(oldDefinition, oldUnit, modifications); + return getBodyOnly(oldDefinition, ast, modifications) + + getCatchHandlers(oldDefinition, ast, modifications); } - private static String getBodyOnly(IASTFunctionDefinition oldDefinition, IASTTranslationUnit oldUnit, + private static String getBodyOnly(IASTFunctionDefinition oldDefinition, IASTTranslationUnit ast, ModificationCollector modifications) { String leadingComments = getCommentsAsString(getLeadingCommentsFromNode(oldDefinition.getBody(), - oldUnit, modifications)); + ast, modifications)); String trailingComments = getCommentsAsString(getTrailingComments(oldDefinition.getBody(), - oldUnit, modifications)); + ast, modifications)); return leadingComments + oldDefinition.getBody().getRawSignature() + trailingComments; } - private static String getCatchHandlers(IASTFunctionDefinition oldDefinition, IASTTranslationUnit oldUnit, + private static String getCatchHandlers(IASTFunctionDefinition oldDefinition, IASTTranslationUnit ast, ModificationCollector modifications) { if (oldDefinition instanceof ICPPASTFunctionWithTryBlock) { ICPPASTCatchHandler[] oldCatches = ((ICPPASTFunctionWithTryBlock) oldDefinition).getCatchHandlers(); String allCatchHandlers = ""; //$NON-NLS-1$ for (int i = 0; i < oldCatches.length; i++) { - String lead = getCommentsAsString(getLeadingCommentsFromNode(oldCatches[i], oldUnit, + String lead = getCommentsAsString(getLeadingCommentsFromNode(oldCatches[i], ast, modifications)); - String trail = getCommentsAsString(getTrailingComments(oldCatches[i], oldUnit, modifications)); + String trail = getCommentsAsString(getTrailingComments(oldCatches[i], ast, modifications)); allCatchHandlers += lead + oldCatches[i].getRawSignature() + trail; } return allCatchHandlers; @@ -428,14 +360,14 @@ public class ToggleNodeHelper extends NodeHelper { } private static List<IASTComment> getLeadingCommentsFromNode(IASTNode existingNode, - IASTTranslationUnit oldUnit, ModificationCollector modifications) { - ASTRewrite rw = modifications.rewriterForTranslationUnit(oldUnit); + IASTTranslationUnit ast, ModificationCollector modifications) { + ASTRewrite rw = modifications.rewriterForTranslationUnit(ast); return rw.getComments(existingNode, CommentPosition.leading); } private static List<IASTComment> getTrailingComments(IASTNode existingNode, - IASTTranslationUnit oldUnit, ModificationCollector modifications) { - ASTRewrite rw = modifications.rewriterForTranslationUnit(oldUnit); + IASTTranslationUnit ast, ModificationCollector modifications) { + ASTRewrite rw = modifications.rewriterForTranslationUnit(ast); return rw.getComments(existingNode, CommentPosition.trailing); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoring.java index a5ff382e85d..23c2b7c08a0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoring.java @@ -12,24 +12,18 @@ ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; -import org.eclipse.ui.ide.IDE; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexManager; +import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; - import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; @@ -42,14 +36,11 @@ public class ToggleRefactoring extends CRefactoring { private ITextSelection selection; private IToggleRefactoringStrategy strategy; private ToggleRefactoringContext context; - private IIndex fIndex; - public ToggleRefactoring(IFile file, ITextSelection selection, ICProject proj) { - super(file, selection, null, proj); - if (selection == null || file == null || project == null) + public ToggleRefactoring(ICElement element, ITextSelection selection, ICProject project) { + super(element, selection, project); + if (selection == null || tu.getResource() == null || project == null) initStatus.addFatalError(Messages.ToggleRefactoring_InvalidSelection); - if (!IDE.saveAllEditors(new IResource[] { ResourcesPlugin.getWorkspace().getRoot() }, false)) - initStatus.addFatalError(Messages.ToggleRefactoring_CanNotSaveFiles); this.selection = selection; } @@ -60,19 +51,15 @@ public class ToggleRefactoring extends CRefactoring { pm.subTask(Messages.ToggleRefactoring_WaitingForIndexer); prepareIndexer(pm); pm.subTask(Messages.ToggleRefactoring_AnalyseSelection); - context = new ToggleRefactoringContext(fIndex, file, selection); + context = new ToggleRefactoringContext(refactoringContext, getIndex(), tu, selection); strategy = new ToggleStrategyFactory(context).getAppropriateStategy(); - } catch (InterruptedException e) { } catch (NotSupportedException e) { initStatus.addFatalError(e.getMessage()); - } finally { - fIndex.releaseReadLock(); } - return initStatus; } - private void prepareIndexer(IProgressMonitor pm) throws CoreException, InterruptedException { + private void prepareIndexer(IProgressMonitor pm) throws CoreException { IIndexManager im = CCorePlugin.getIndexManager(); while (!im.isProjectIndexed(project)) { im.joinIndexer(500, pm); @@ -81,14 +68,11 @@ public class ToggleRefactoring extends CRefactoring { } if (!im.isProjectIndexed(project)) throw new NotSupportedException(Messages.ToggleRefactoring_NoIndex); - IndexerPreferences.set(project.getProject(), IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG, Boolean.TRUE.toString()); - fIndex = CCorePlugin.getIndexManager().getIndex(project); - fIndex.acquireReadLock(); } @Override - protected void collectModifications(IProgressMonitor pm, - ModificationCollector modifications) throws CoreException { + protected void collectModifications(IProgressMonitor pm, ModificationCollector modifications) + throws CoreException { pm.subTask(Messages.ToggleRefactoring_CalculateModifications); strategy.run(modifications); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringContext.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringContext.java index b32e43375e1..2e0c1cefa33 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringContext.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringContext.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,14 +7,15 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jface.text.ITextSelection; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; @@ -27,30 +28,38 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.CoreModelUtil; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; +import org.eclipse.cdt.internal.corext.util.CModelUtil; +import org.eclipse.cdt.internal.ui.editor.SourceHeaderPartnerFinder; +import org.eclipse.cdt.internal.ui.refactoring.CRefactoringContext; import org.eclipse.cdt.internal.ui.refactoring.IndexToASTNameHelper; -import org.eclipse.cdt.internal.ui.refactoring.utils.TranslationUnitHelper; public class ToggleRefactoringContext { private IASTFunctionDefinition targetDefinition; private IASTFunctionDeclarator targetDeclaration; - private IASTTranslationUnit targetDefinitionUnit; - private IASTTranslationUnit targetDeclarationUnit; - private IIndex index; - private IASTTranslationUnit selectionUnit; - private IFile selectionFile; + private IASTTranslationUnit targetDefinitionAST; + private IASTTranslationUnit targetDeclarationAST; + private final CRefactoringContext refactoringContext; + private final IIndex index; + private final ITranslationUnit selectionTU; + private IASTTranslationUnit selectionAST; private IBinding binding; private IASTName selectionName; private boolean defaultAnswer; private boolean settedDefaultAnswer; - public ToggleRefactoringContext(IIndex index, IFile file, ITextSelection selection) { + public ToggleRefactoringContext(CRefactoringContext refactoringContext, IIndex index, + ITranslationUnit translationUnit, ITextSelection selection) + throws OperationCanceledException, CoreException { + this.refactoringContext = refactoringContext; this.index = index; - this.selectionFile = file; - findSelectionUnit(); + this.selectionTU = translationUnit; + findSelectionAST(); findSelectedFunctionDeclarator(selection); findBinding(); findDeclaration(); @@ -58,7 +67,7 @@ public class ToggleRefactoringContext { } public void findSelectedFunctionDeclarator(ITextSelection selection) { - selectionName = new DeclaratorFinder(selection, selectionUnit).getName(); + selectionName = new DeclaratorFinder(selection, selectionAST).getName(); } public void findBinding() { @@ -80,12 +89,12 @@ public class ToggleRefactoringContext { throw new NotSupportedException( Messages.ToggleRefactoringContext_MultipleDeclarations); for (IIndexName iname : decnames) { - selectionUnit = getTUForNameInFile(iname); + selectionAST = getASTForIndexName(iname); IASTName astname = IndexToASTNameHelper.findMatchingASTName( - selectionUnit, iname, index); + selectionAST, iname, index); if (astname != null) { targetDeclaration = findFunctionDeclarator(astname); - targetDeclarationUnit = selectionUnit; + targetDeclarationAST = selectionAST; break; } } @@ -101,11 +110,11 @@ public class ToggleRefactoringContext { throw new NotSupportedException(Messages.ToggleRefactoringContext_MultipleDefinitions); } for (IIndexName iname : defnames) { - IASTTranslationUnit unit = getTUForNameInFile(iname); + IASTTranslationUnit unit = getASTForIndexName(iname); IASTName astname = IndexToASTNameHelper.findMatchingASTName(unit, iname, index); if (astname != null) { targetDefinition = findFunctionDefinition(astname); - targetDefinitionUnit = unit; + targetDefinitionAST = unit; break; } } @@ -124,51 +133,51 @@ public class ToggleRefactoringContext { return targetDefinition; } - public IASTTranslationUnit getDeclarationUnit() { - return targetDeclarationUnit; + public IASTTranslationUnit getDeclarationAST() { + return targetDeclarationAST; } - public IASTTranslationUnit getDefinitionUnit() { - return targetDefinitionUnit; + public IASTTranslationUnit getDefinitionAST() { + return targetDefinitionAST; + } + + public ITranslationUnit getSelectionTU() { + return selectionTU; } public IFile getSelectionFile() { - return selectionFile; + return (IFile) selectionTU.getResource(); } - public IASTTranslationUnit getTUForSiblingFile() { - IASTTranslationUnit unit = getDeclarationUnit(); - if (unit == null) - unit = getDefinitionUnit(); - try { - return ToggleNodeHelper.getSiblingFile(getSelectionFile(), unit); - } catch (CoreException e) { - CUIPlugin.log(e); + public IASTTranslationUnit getASTForPartnerFile() throws CoreException { + ITranslationUnit tu = + SourceHeaderPartnerFinder.getPartnerTranslationUnit(selectionTU, refactoringContext); + if (tu == null) return null; - } + return refactoringContext.getAST(tu, null); } - - private void findSelectionUnit() { - try { - selectionUnit = TranslationUnitHelper.loadTranslationUnit(selectionFile, true); - } catch (Exception e) { - } - if (selectionUnit == null) + + private void findSelectionAST() throws OperationCanceledException, CoreException { + selectionAST = refactoringContext.getAST(selectionTU, null); + if (selectionAST == null) throw new NotSupportedException(Messages.ToggleRefactoringContext_NoTuFound); } - private IASTTranslationUnit getTUForNameInFile(IIndexName iname) + private IASTTranslationUnit getASTForIndexName(IIndexName indexName) throws CModelException, CoreException { - if (isSameFileAsInTU(iname)) { - return selectionUnit; + if (isSameFileAsInTU(indexName)) { + return selectionAST; } - IPath path = new Path(iname.getFileLocation().getFileName()); - return TranslationUnitHelper.loadTranslationUnit(path.toString(), true); + ITranslationUnit tu = CoreModelUtil.findTranslationUnitForLocation( + indexName.getFile().getLocation(), null); + if (tu == null) + return null; + return refactoringContext.getAST(tu, null); } - private boolean isSameFileAsInTU(IIndexName iname) { - return iname.getFileLocation().getFileName().equals( - selectionUnit.getFileLocation().getFileName()); + private boolean isSameFileAsInTU(IIndexName indexName) { + return indexName.getFileLocation().getFileName().equals( + selectionAST.getFileLocation().getFileName()); } private IASTFunctionDeclarator findFunctionDeclarator(IASTNode node) { @@ -197,4 +206,13 @@ public class ToggleRefactoringContext { public boolean isSettedDefaultAnswer() { return settedDefaultAnswer; } + + public IASTTranslationUnit getAST(IFile file, IProgressMonitor pm) + throws OperationCanceledException, CoreException { + ITranslationUnit tu = CoreModelUtil.findTranslationUnit(file); + if (tu == null) + return null; + tu = CModelUtil.toWorkingCopy(tu); + return refactoringContext.getAST(tu, pm); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringRunner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringRunner.java index bdcec69bca3..3afa39b335d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringRunner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleRefactoringRunner.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,11 +7,11 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; -import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.window.IShellProvider; @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; +import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper; /** * Responsible for scheduling a job which runs the ToggleRefactoring. Differs @@ -29,21 +30,24 @@ import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner; */ public class ToggleRefactoringRunner extends RefactoringRunner { - private ToggleRefactoring refactoring; - - public ToggleRefactoringRunner(IFile file, ITextSelection selection, - ICElement element, IShellProvider shellProvider, ICProject project) { - super(file, selection, element, shellProvider, project); - refactoring = new ToggleRefactoring(file, selection, project); + public ToggleRefactoringRunner(ICElement element, ITextSelection selection, + IShellProvider shellProvider, ICProject project) { + super(element, selection, shellProvider, project); } @Override public void run() { Job[] jobs = Job.getJobManager().find(RefactoringJob.FAMILY_TOGGLE_DEFINITION); if (jobs.length > 0) { - CUIPlugin.log("no concurrent toggling allowed", new NotSupportedException("")); //$NON-NLS-1$//$NON-NLS-2$ + CUIPlugin.log("No concurrent toggling allowed", new NotSupportedException("")); //$NON-NLS-1$//$NON-NLS-2$ return; } + RefactoringSaveHelper saveHelper= new RefactoringSaveHelper(RefactoringSaveHelper.SAVE_REFACTORING); + if (!saveHelper.saveEditors(shellProvider.getShell())) + return; + + ToggleRefactoring refactoring = + new ToggleRefactoring(element, (ITextSelection) selection, project); new RefactoringJob(refactoring).schedule(); } }
\ No newline at end of file diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleStrategyFactory.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleStrategyFactory.java index a00a29180c0..296b526d1e9 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleStrategyFactory.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleStrategyFactory.java @@ -17,7 +17,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; public class ToggleStrategyFactory { - private ToggleRefactoringContext context; public ToggleStrategyFactory(ToggleRefactoringContext context) { @@ -27,7 +26,7 @@ public class ToggleStrategyFactory { public IToggleRefactoringStrategy getAppropriateStategy() { if (context.getDefinition() == null) throw new NotSupportedException(Messages.ToggleStrategyFactory_NoDefinitionFound); - if (!context.getDefinitionUnit().isHeaderUnit()) + if (!context.getDefinitionAST().isHeaderUnit()) return new ToggleFromImplementationToHeaderOrClassStrategy(context); if (isInClassSituation()) return new ToggleFromClassToInHeaderStrategy(context); @@ -40,7 +39,7 @@ public class ToggleStrategyFactory { private boolean isinHeaderSituation() { return (context.getDefinition() != null) - && (context.getDefinitionUnit().isHeaderUnit()); + && (context.getDefinitionAST().isHeaderUnit()); } private boolean isInClassSituation() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/TogglingActionDelegate.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/TogglingActionDelegate.java index 2efb26f53a2..6f089c0e699 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/TogglingActionDelegate.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/TogglingActionDelegate.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,11 +7,11 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; -import org.eclipse.core.resources.IFile; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; @@ -20,8 +20,7 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.IWorkingCopy; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; /** @@ -31,11 +30,8 @@ import org.eclipse.cdt.ui.CUIPlugin; * Order of execution is: constructor, init, selectionChanged, run */ public class TogglingActionDelegate implements IWorkbenchWindowActionDelegate { - private IWorkbenchWindow window; private TextSelection selection; - private ICProject project; - private IFile file; @Override public void init(IWorkbenchWindow window) { @@ -45,36 +41,27 @@ public class TogglingActionDelegate implements IWorkbenchWindowActionDelegate { @Override public void selectionChanged(IAction action, ISelection selection) { - boolean isTextSelection = selection != null - && selection instanceof TextSelection; + boolean isTextSelection = selection != null && selection instanceof TextSelection; action.setEnabled(isTextSelection); if (!isTextSelection) return; - //get our own selection due to (a possible) bug?? + // Get our own selection due to (a possible) bug? this.selection = (TextSelection) CUIPlugin.getActivePage().getActiveEditor().getEditorSite().getSelectionProvider().getSelection(); } @Override public void run(IAction action) { - if (!isWorkbenchReady()) - return; - new ToggleRefactoringRunner(file, selection, project, window, project).run(); - } - - private boolean isWorkbenchReady() { IWorkbenchPage activePage = window.getActivePage(); if (activePage == null) - return false; + return; IEditorPart editor = activePage.getActiveEditor(); if (editor == null || editor.getEditorInput() == null) - return false; - IWorkingCopy wc = CUIPlugin.getDefault().getWorkingCopyManager() - .getWorkingCopy(editor.getEditorInput()); - if (wc == null) - return false; - project = wc.getCProject(); - file = (IFile) wc.getResource(); - return project != null && file != null; + return; + ITranslationUnit tu = + CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput()); + if (tu == null || tu.getResource() == null) + return; + new ToggleRefactoringRunner(tu, selection, window, tu.getCProject()).run(); } @Override diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/TranslationUnitHelper.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/TranslationUnitHelper.java deleted file mode 100644 index d872c9affa9..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/TranslationUnitHelper.java +++ /dev/null @@ -1,170 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik - * Rapperswil, University of applied sciences and others - * 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: - * Institute for Software - initial API and implementation - *******************************************************************************/ - -package org.eclipse.cdt.internal.ui.refactoring.utils; - -import org.eclipse.core.filesystem.URIUtil; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.CDOM; -import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException; -import org.eclipse.cdt.core.dom.ast.ASTVisitor; -import org.eclipse.cdt.core.dom.ast.IASTDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTFileLocation; -import org.eclipse.cdt.core.dom.ast.IASTName; -import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.index.IIndex; -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.ui.CUIPlugin; - -import org.eclipse.cdt.internal.ui.refactoring.Container; - -/** - * A collection of methods that deal with IASTTranslationUnits. - * - * @author Mirko Stocker - */ -public class TranslationUnitHelper { - private static final int AST_STYLE = ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT | ITranslationUnit.AST_SKIP_INDEXED_HEADERS; - - /** - * Visits all names in the TU to find the specified name - */ - public static IASTName findNameInTranslationUnit(IASTTranslationUnit transUnit, IASTNode oldName) { - final String oldFileName = oldName.getFileLocation().getFileName(); - final IASTFileLocation pos = oldName.getFileLocation(); - final Container<IASTName> nameCon = new Container<IASTName>(); - - transUnit.accept(new ASTVisitor() { - - { - shouldVisitNames = true; - } - - @Override - public int visit(IASTName locName) { - IASTFileLocation locFileLocation = locName.getFileLocation(); - if (locFileLocation != null && oldFileName.equals(locFileLocation.getFileName()) && pos.getNodeOffset() == locFileLocation.getNodeOffset() - && pos.getNodeLength() == locFileLocation.getNodeLength()) { - nameCon.setObject(locName); - return PROCESS_ABORT; - } - return super.visit(locName); - } - - }); - return nameCon.getObject(); - } - - /** - * @return the first node in the translation unit or null - */ - public static IASTNode getFirstNode(IASTTranslationUnit unit) { - IASTDeclaration firstNode = null; - for (IASTDeclaration each : unit.getDeclarations()) { - if (firstNode == null) { - firstNode = each; - } else if (each.getNodeLocations() != null && - each.getNodeLocations()[0].getNodeOffset() < firstNode.getNodeLocations()[0].getNodeOffset()) { - firstNode = each; - } - } - return firstNode; - } - - /** - * @param filename to load the translation unit from - * @return the translation unit for the file or null - * @throws CoreException - * @deprecated Use RefactoringASTCache. - */ - @Deprecated - public static IASTTranslationUnit loadTranslationUnit(String filename, boolean useIndex) throws CoreException{ - if (filename != null) { - IFile[] tmpFile = null; - - tmpFile = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI( - URIUtil.toURI(filename)); - - return loadTranslationUnit(tmpFile[0], useIndex); - } - - return null; - } - - /** - * @param file to load the translation unit from - * @return the translation unit for the file or null - * @throws CoreException - * @deprecated Use RefactoringASTCache. - */ - @Deprecated - public static IASTTranslationUnit loadTranslationUnit(IFile file, boolean useIndex) throws CoreException { - if (file == null) { - return null; - } - if (useIndex) { - return loadIndexBasedTranslationUnit(file); - } else { - return loadFileBasedTranslationUnit(file); - } - } - - private static IASTTranslationUnit loadFileBasedTranslationUnit(IFile file) { - try { - IASTTranslationUnit fileUnit = CDOM.getInstance().getTranslationUnit(file, CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES), true); - return fileUnit; - } catch (UnsupportedDialectException e) { - return null; - } - } - - private static IASTTranslationUnit loadIndexBasedTranslationUnit(IFile file) throws CoreException { - IIndex index = null; - try { - index = lockIndex(); - ITranslationUnit tu = (ITranslationUnit) CCorePlugin.getDefault().getCoreModel().create(file); - return tu.getAST(index, AST_STYLE); - } catch (InterruptedException e) { - CUIPlugin.log(e); - } finally { - unlockIndex(index); - } - return null; - } - - private static IIndex lockIndex() throws CoreException, InterruptedException { - IIndex index; - ICProject[] projects= CoreModel.getDefault().getCModel().getCProjects(); - index= CCorePlugin.getIndexManager().getIndex(projects); - try { - index.acquireReadLock(); - } catch (InterruptedException e) { - // no lock was acquired - index= null; - throw e; - } - return index; - } - - private static void unlockIndex(IIndex index) { - if (index != null) { - index.releaseReadLock(); - } - } -} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/refactoring/actions/ToggleFunctionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/refactoring/actions/ToggleFunctionAction.java index fd092a2d753..15d6f610ae8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/refactoring/actions/ToggleFunctionAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/refactoring/actions/ToggleFunctionAction.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2011, 2012 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -7,34 +7,29 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Institute for Software (IFS)- initial API and implementation + * Institute for Software (IFS)- initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.ui.refactoring.actions; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.window.IShellProvider; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.ui.refactoring.togglefunction.ToggleRefactoringRunner; /** - * * @since 5.3 * @author Emanuel Graf IFS * * @noextend This class is not intended to be subclassed by clients. */ public class ToggleFunctionAction extends RefactoringAction { - private ICProject project; - private IFile file; public ToggleFunctionAction() { super(Messages.ToggleFunctionAction_label); @@ -46,30 +41,16 @@ public class ToggleFunctionAction extends RefactoringAction { } @Override - public void run(IShellProvider shellProvider, IWorkingCopy wc, - ITextSelection s) { - IResource res = wc.getResource(); - if (isWorkbenchReady(wc) && res instanceof IFile) { - new ToggleRefactoringRunner(file, s, project, shellProvider, project).run(); - } - } - - private boolean isWorkbenchReady(IWorkingCopy wc) { - try { - IWorkbenchPage activePage = CUIPlugin.getActivePage(); - if (activePage == null) - return false; - IEditorPart editor = activePage.getActiveEditor(); - if (editor == null || editor.getEditorInput() == null) - return false; - if (wc == null) - return false; - project = wc.getCProject(); - file = (IFile) wc.getResource(); - return project != null && file != null; - } catch (ClassCastException e) { - return false; - } + public void run(IShellProvider shellProvider, IWorkingCopy wc, ITextSelection selection) { + if (wc == null || wc.getResource() == null) + return; + IWorkbenchPage activePage = CUIPlugin.getActivePage(); + if (activePage == null) + return; + IEditorPart editor = activePage.getActiveEditor(); + if (editor == null || editor.getEditorInput() == null) + return; + new ToggleRefactoringRunner(wc, selection, shellProvider, wc.getCProject()).run(); } @Override @@ -77,5 +58,4 @@ public class ToggleFunctionAction extends RefactoringAction { super.updateSelection(elem); setEnabled(false); } - } |