mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 10:16:03 +02:00
Code maintenance for refactoring, by Emanuel Graf, bug 226645.
This commit is contained in:
parent
fed2e66552
commit
fa32e66c65
9 changed files with 49 additions and 206 deletions
|
@ -62,29 +62,29 @@ public abstract class RefactoringBaseTest extends BaseTestFramework implements I
|
|||
}
|
||||
|
||||
protected void assertEquals(TestSourceFile file, IFile file2) throws Exception {
|
||||
StringBuffer code = getCodeFromIFile(file2);
|
||||
assertEquals(file.getExpectedSource(), TestHelper.unifyNewLines(code.toString()));
|
||||
String code = getCodeFromIFile(file2);
|
||||
assertEquals(file.getExpectedSource(), TestHelper.unifyNewLines(code));
|
||||
}
|
||||
|
||||
protected void compareFiles(Map<String,TestSourceFile> testResourceFiles) throws Exception {
|
||||
for (String fileName : testResourceFiles.keySet()) {
|
||||
TestSourceFile file = testResourceFiles.get(fileName);
|
||||
String expectedSource = testResourceFiles.get(fileName).getExpectedSource();
|
||||
IFile iFile = project.getFile(new Path(fileName));
|
||||
StringBuffer code = getCodeFromIFile(iFile);
|
||||
assertEquals(TestHelper.unifyNewLines(file.getExpectedSource()), TestHelper.unifyNewLines(code.toString()));
|
||||
String code = getCodeFromIFile(iFile);
|
||||
assertEquals(TestHelper.unifyNewLines(expectedSource), TestHelper.unifyNewLines(code));
|
||||
}
|
||||
}
|
||||
|
||||
protected StringBuffer getCodeFromIFile(IFile file) throws Exception {
|
||||
protected String getCodeFromIFile(IFile file) throws Exception {
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(file.getContents()));
|
||||
StringBuffer code = new StringBuffer();
|
||||
StringBuilder code = new StringBuilder();
|
||||
String line;
|
||||
while((line = br.readLine()) != null) {
|
||||
code.append(line);
|
||||
code.append('\n');
|
||||
}
|
||||
br.close();
|
||||
return code;
|
||||
return code.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -68,11 +68,10 @@ public abstract class CRefactoring extends Refactoring {
|
|||
|
||||
protected String name = Messages.HSRRefactoring_name;
|
||||
protected IFile file;
|
||||
protected ISelection selection;
|
||||
private ISelection selection;
|
||||
protected RefactoringStatus initStatus;
|
||||
protected IASTTranslationUnit unit;
|
||||
private IIndex fIndex;
|
||||
public static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
|
||||
|
||||
public CRefactoring(IFile file, ISelection selection) {
|
||||
this.file = file;
|
||||
|
@ -240,23 +239,25 @@ public abstract class CRefactoring extends Refactoring {
|
|||
return collector.createFinalChange();
|
||||
}
|
||||
|
||||
protected void collectModifications(IProgressMonitor pm, ModificationCollector collector)
|
||||
throws CoreException, OperationCanceledException {
|
||||
}
|
||||
abstract protected void collectModifications(IProgressMonitor pm, ModificationCollector collector)
|
||||
throws CoreException, OperationCanceledException;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
protected boolean loadTranslationUnit(RefactoringStatus status, IProgressMonitor mon) {
|
||||
|
||||
protected ITextSelection getTextSelection() {
|
||||
return (ITextSelection) selection;
|
||||
}
|
||||
|
||||
private boolean loadTranslationUnit(RefactoringStatus status,
|
||||
IProgressMonitor mon) {
|
||||
SubMonitor subMonitor = SubMonitor.convert(mon, 10);
|
||||
if (file != null) {
|
||||
try {
|
||||
subMonitor.subTask(Messages.HSRRefactoring_PM_ParseTU);
|
||||
ITranslationUnit tu = (ITranslationUnit) CCorePlugin
|
||||
.getDefault().getCoreModel().create(file);
|
||||
unit = tu.getAST(fIndex, AST_STYLE);
|
||||
subMonitor.subTask(Messages.HSRRefactoring_PM_ParseTU);
|
||||
unit = loadTranslationUnit(file);
|
||||
subMonitor.worked(2);
|
||||
if(isProgressMonitorCanceld(subMonitor, initStatus)) {
|
||||
return true;
|
||||
|
@ -279,6 +280,11 @@ public abstract class CRefactoring extends Refactoring {
|
|||
return true;
|
||||
}
|
||||
|
||||
protected IASTTranslationUnit loadTranslationUnit(IFile file) throws CoreException {
|
||||
ITranslationUnit tu = (ITranslationUnit) CCorePlugin.getDefault().getCoreModel().create(file);
|
||||
return tu.getAST(fIndex, AST_STYLE);
|
||||
}
|
||||
|
||||
private static class ExpressionPosition {
|
||||
public int start;
|
||||
public int end;
|
||||
|
|
|
@ -13,7 +13,7 @@ package org.eclipse.cdt.internal.ui.refactoring;
|
|||
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.ui.IWorkbenchWindow;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.ui.PlatformUI;
|
||||
|
||||
/**
|
||||
|
@ -26,17 +26,12 @@ public abstract class RefactoringRunner {
|
|||
|
||||
protected IFile file;
|
||||
protected ISelection selection;
|
||||
protected IWorkbenchWindow window;
|
||||
protected Shell shell;
|
||||
|
||||
public RefactoringRunner(IFile file, ISelection selection, IWorkbenchWindow window) {
|
||||
super();
|
||||
public RefactoringRunner(IFile file, ISelection selection) {
|
||||
this.file = file;
|
||||
this.selection = selection;
|
||||
if(window != null) {
|
||||
this.window = window;
|
||||
}else {
|
||||
this.window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
|
||||
}
|
||||
shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
|
||||
}
|
||||
|
||||
public abstract void run();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007, 2008 Institute for Software, HSR Hochschule fuer Technik
|
||||
* Copyright (c) 2008 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
|
||||
|
@ -99,13 +99,7 @@ public class ExtractConstantRefactoring extends CRefactoring {
|
|||
|
||||
if(isProgressMonitorCanceld(sm, initStatus)) return initStatus;
|
||||
|
||||
ITextSelection textSelection = null;
|
||||
if (selection instanceof ITextSelection) {
|
||||
textSelection = (ITextSelection) selection;
|
||||
} else {
|
||||
initStatus.addFatalError(Messages.ExtractConstantRefactoring_LiteralMustBeSelected);
|
||||
return initStatus;
|
||||
}
|
||||
ITextSelection textSelection = getTextSelection();
|
||||
sm.worked(1);
|
||||
|
||||
if(isProgressMonitorCanceld(sm, initStatus)) return initStatus;
|
||||
|
|
|
@ -15,7 +15,6 @@ import org.eclipse.core.resources.IFile;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
|
||||
import org.eclipse.ui.IWorkbenchWindow;
|
||||
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
|
@ -29,8 +28,8 @@ import org.eclipse.cdt.internal.ui.refactoring.RefactoringRunner;
|
|||
*/
|
||||
public class ExtractConstantRefactoringRunner extends RefactoringRunner {
|
||||
|
||||
public ExtractConstantRefactoringRunner(IFile file, ISelection selection, IWorkbenchWindow window) {
|
||||
super(file, selection, window);
|
||||
public ExtractConstantRefactoringRunner(IFile file, ISelection selection) {
|
||||
super(file, selection);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -43,7 +42,7 @@ public class ExtractConstantRefactoringRunner extends RefactoringRunner {
|
|||
try {
|
||||
refactoring.lockIndex();
|
||||
try {
|
||||
operator.run(window.getShell(), refactoring.getName());
|
||||
operator.run(shell, refactoring.getName());
|
||||
}
|
||||
finally {
|
||||
refactoring.unlockIndex();
|
||||
|
|
|
@ -22,7 +22,7 @@ import org.eclipse.core.runtime.CoreException;
|
|||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
/**
|
||||
* Some helper methods to access part of the content of an ifile
|
||||
* Some helper methods to access part of the content of an iFile
|
||||
*
|
||||
* @author Emanuel Graf
|
||||
*
|
||||
|
@ -32,12 +32,9 @@ public class FileContentHelper {
|
|||
private static final int bufferSize = 512;
|
||||
|
||||
public static String getContent(IFile file, int start) throws CoreException, IOException{
|
||||
|
||||
InputStreamReader reader = getReaderForFile(file);
|
||||
skip(start, reader);
|
||||
|
||||
return readRest(reader);
|
||||
|
||||
}
|
||||
|
||||
public static String getContent(IFile file, int start, int length) {
|
||||
|
@ -72,8 +69,6 @@ public class FileContentHelper {
|
|||
while((bytesRead = reader.read(buffer)) >= 0){
|
||||
content.append(buffer, 0, bytesRead);
|
||||
}
|
||||
|
||||
|
||||
return content.toString();
|
||||
}
|
||||
|
||||
|
@ -90,14 +85,13 @@ public class FileContentHelper {
|
|||
}
|
||||
}
|
||||
|
||||
private static void skip(int start, InputStreamReader r) throws IOException {
|
||||
private static void skip(int count, InputStreamReader r) throws IOException {
|
||||
long skipped = 0;
|
||||
while(skipped >= 0 && start > 0 && r.ready()){
|
||||
skipped = r.skip(start);
|
||||
while(skipped >= 0 && count > 0 && r.ready()){
|
||||
skipped = r.skip(count);
|
||||
if(skipped > 0){
|
||||
start -= skipped;
|
||||
count -= skipped;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,67 +11,23 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.refactoring.utils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.ProjectScope;
|
||||
import org.eclipse.core.resources.ResourcesPlugin;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.eclipse.core.runtime.preferences.IScopeContext;
|
||||
import org.eclipse.core.runtime.preferences.InstanceScope;
|
||||
import org.eclipse.jface.text.TextUtilities;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
|
||||
/**
|
||||
* Helper class concerning files.
|
||||
*
|
||||
* @author Lukas Felber
|
||||
*
|
||||
*/
|
||||
public class FileHelper {
|
||||
|
||||
private static final String DEFAULT_LINE_DELIMITTER = "\n"; //$NON-NLS-1$
|
||||
|
||||
public static IFile getIFilefromIASTNode(IASTNode node) {
|
||||
IPath implPath = new Path(node.getContainingFilename());
|
||||
return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(implPath);
|
||||
}
|
||||
|
||||
public static boolean isFirstWithinSecondLocation(IASTFileLocation loc1, IASTFileLocation loc2){
|
||||
|
||||
boolean isEquals = true;
|
||||
|
||||
isEquals &= loc1.getFileName().equals(loc2.getFileName());
|
||||
isEquals &= loc1.getNodeOffset() >= loc2.getNodeOffset();
|
||||
isEquals &= loc1.getNodeOffset()+loc1.getNodeLength() <= loc2.getNodeOffset() + loc2.getNodeLength();
|
||||
|
||||
return isEquals;
|
||||
}
|
||||
|
||||
public static String determineLineDelimiter(IFile file) {
|
||||
StringBuilder fileContent = new StringBuilder();
|
||||
try {
|
||||
InputStream fis = file.getContents();
|
||||
byte[] buffer = new byte[1024];
|
||||
int read;
|
||||
while ((read = fis.read(buffer)) >= 0)
|
||||
fileContent.append(new String(buffer, 0, read));
|
||||
} catch (CoreException e) {
|
||||
} catch (IOException e) {
|
||||
} catch (NullPointerException e){
|
||||
}
|
||||
|
||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject();
|
||||
IScopeContext[] scopeContext;
|
||||
if(project != null){
|
||||
scopeContext = new IScopeContext[] { new ProjectScope(project)};
|
||||
}
|
||||
else{
|
||||
scopeContext = new IScopeContext[] { new InstanceScope()};
|
||||
}
|
||||
String platformDefaultLineDelimiter = System.getProperty("line.separator", DEFAULT_LINE_DELIMITTER); //$NON-NLS-1$
|
||||
String defaultLineDelimiter = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, platformDefaultLineDelimiter, scopeContext);
|
||||
return TextUtilities.determineLineDelimiter(fileContent.toString(), defaultLineDelimiter);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,100 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 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.cdt.core.dom.ast.IASTFileLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
||||
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||
|
||||
/**
|
||||
* Some helper methods that calculate offsets from nodes.
|
||||
*
|
||||
* @author Emanuel Graf
|
||||
*
|
||||
*/
|
||||
public class OffsetHelper {
|
||||
|
||||
public static int getOffsetIncludingComment(IASTNode node) {
|
||||
int nodeStart = Integer.MAX_VALUE;
|
||||
IASTNodeLocation[] nodeLocations = node.getNodeLocations();
|
||||
if (nodeLocations.length != 1) {
|
||||
int offset;
|
||||
for (IASTNodeLocation location : nodeLocations) {
|
||||
if (location instanceof IASTMacroExpansionLocation) {
|
||||
IASTMacroExpansionLocation macroLoc = (IASTMacroExpansionLocation) location;
|
||||
offset = macroLoc.asFileLocation().getNodeOffset();
|
||||
}else {
|
||||
offset = location.asFileLocation().getNodeOffset();
|
||||
}
|
||||
if(offset < nodeStart) nodeStart = offset;
|
||||
}
|
||||
} else {
|
||||
nodeStart = node.getFileLocation().getNodeOffset();
|
||||
}
|
||||
|
||||
return nodeStart;
|
||||
}
|
||||
|
||||
public static int getEndOffsetIncludingComments(IASTNode node) {
|
||||
int fileOffset = 0;
|
||||
int length = 0;
|
||||
|
||||
IASTNodeLocation[] nodeLocations = node.getNodeLocations();
|
||||
if (nodeLocations.length != 1) {
|
||||
for (IASTNodeLocation location : nodeLocations) {
|
||||
if (location instanceof IASTMacroExpansionLocation) {
|
||||
IASTMacroExpansionLocation macroLoc = (IASTMacroExpansionLocation) location;
|
||||
fileOffset = macroLoc.asFileLocation().getNodeOffset();
|
||||
length = macroLoc.asFileLocation().getNodeLength();
|
||||
}else {
|
||||
fileOffset = location.asFileLocation().getNodeOffset();
|
||||
length = location.asFileLocation().getNodeLength();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
IASTFileLocation loc = node.getFileLocation();
|
||||
|
||||
fileOffset = loc.getNodeOffset();
|
||||
length = loc.getNodeLength();
|
||||
}
|
||||
return fileOffset + length;
|
||||
|
||||
}
|
||||
|
||||
public static int getEndOffsetWithoutComments(IASTNode node) {
|
||||
return node.getFileLocation().getNodeOffset() + node.getFileLocation().getNodeLength();
|
||||
}
|
||||
|
||||
public static int getLengthIncludingComment(IASTNode node) {
|
||||
return OffsetHelper.getEndOffsetIncludingComments(node) - OffsetHelper.getOffsetIncludingComment(node);
|
||||
}
|
||||
|
||||
public static int getNodeOffset(ASTNode node) {
|
||||
return node.getOffset();
|
||||
}
|
||||
|
||||
public static int getNodeEndPoint(ASTNode node) {
|
||||
return node.getOffset() + node.getLength();
|
||||
}
|
||||
|
||||
public static int getStartingLineNumber(IASTNode node) {
|
||||
return node.getFileLocation().getStartingLineNumber();
|
||||
}
|
||||
|
||||
public static int getEndingLineNumber(IASTNode node) {
|
||||
return node.getFileLocation().getEndingLineNumber();
|
||||
}
|
||||
|
||||
}
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
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;
|
||||
|
@ -22,7 +23,7 @@ import org.eclipse.cdt.core.model.IWorkingCopy;
|
|||
import org.eclipse.cdt.internal.ui.refactoring.extractconstant.ExtractConstantRefactoringRunner;
|
||||
|
||||
/**
|
||||
* Launches a rename refactoring.
|
||||
* Launches a extract constant refactoring.
|
||||
*/
|
||||
public class ExtractConstantAction extends RefactoringAction {
|
||||
|
||||
|
@ -35,12 +36,10 @@ public class ExtractConstantAction extends RefactoringAction {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void run(IShellProvider shellProvider, IWorkingCopy wc, ITextSelection s) {
|
||||
public void run(IShellProvider shellProvider, IWorkingCopy wc, ITextSelection selection) {
|
||||
IResource res= wc.getResource();
|
||||
if (res instanceof IFile) {
|
||||
new ExtractConstantRefactoringRunner((IFile) res,
|
||||
fEditor.getSelectionProvider().getSelection(),
|
||||
fEditor.getSite().getWorkbenchWindow()).run();
|
||||
new ExtractConstantRefactoringRunner((IFile) res, selection).run();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue