mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-06 07:45:50 +02:00
Code simplification.
This commit is contained in:
parent
179924ef5c
commit
82080e8056
1 changed files with 49 additions and 67 deletions
|
@ -17,7 +17,6 @@ import java.util.ArrayList;
|
|||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
@ -51,7 +50,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
|
||||
import org.eclipse.cdt.core.formatter.CodeFormatter;
|
||||
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
|
||||
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.internal.core.dom.rewrite.ASTModification;
|
||||
|
@ -63,7 +61,6 @@ import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ASTWriter;
|
|||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ContainerNode;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ProblemRuntimeException;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.util.FileHelper;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.runtime.Assert;
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
|
@ -82,10 +79,10 @@ import org.eclipse.text.edits.TextEdit;
|
|||
import org.eclipse.text.edits.TextEditGroup;
|
||||
|
||||
public class ChangeGenerator extends ASTVisitor {
|
||||
private final Map<String, Integer> sourceOffsets = new LinkedHashMap<String, Integer>();
|
||||
private final Map<IASTNode, Map<ModificationKind, List<ASTModification>>> classifiedModifications =
|
||||
new HashMap<IASTNode, Map<ModificationKind, List<ASTModification>>>();
|
||||
private final Map<IFile, MultiTextEdit> changes = new LinkedHashMap<IFile, MultiTextEdit>();
|
||||
private int processedOffset;
|
||||
private MultiTextEdit rootEdit;
|
||||
private CompositeChange change;
|
||||
|
||||
private final ASTModificationStore modificationStore;
|
||||
|
@ -118,21 +115,21 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
generateChange(rootNode, this);
|
||||
}
|
||||
|
||||
public void generateChange(IASTNode rootNode, ASTVisitor pathProvider)
|
||||
private void generateChange(IASTNode rootNode, ASTVisitor pathProvider)
|
||||
throws ProblemRuntimeException {
|
||||
change = new CompositeChange(ChangeGeneratorMessages.ChangeGenerator_compositeChange);
|
||||
classifyModifications();
|
||||
rootNode.accept(pathProvider);
|
||||
for (IFile file : changes.keySet()) {
|
||||
MultiTextEdit edit = changes.get(file);
|
||||
if (rootEdit == null)
|
||||
return;
|
||||
IASTTranslationUnit ast = rootNode.getTranslationUnit();
|
||||
ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(file);
|
||||
edit = formatChangedCode(edit, ast.getRawSignature(), tu);
|
||||
TextFileChange subchange= ASTRewriteAnalyzer.createCTextFileChange(file);
|
||||
subchange.setEdit(edit);
|
||||
String source = ast.getRawSignature();
|
||||
ITranslationUnit tu = ast.getOriginatingTranslationUnit();
|
||||
formatChangedCode(source, tu);
|
||||
TextFileChange subchange= ASTRewriteAnalyzer.createCTextFileChange((IFile) tu.getResource());
|
||||
subchange.setEdit(rootEdit);
|
||||
change.add(subchange);
|
||||
}
|
||||
}
|
||||
|
||||
private void classifyModifications() {
|
||||
ASTModificationMap rootModifications = modificationStore.getRootModifications();
|
||||
|
@ -161,7 +158,7 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
@Override
|
||||
public int visit(IASTTranslationUnit tu) {
|
||||
IASTFileLocation location = tu.getFileLocation();
|
||||
sourceOffsets.put(location.getFileName(), Integer.valueOf(location.getNodeOffset()));
|
||||
processedOffset = location.getNodeOffset();
|
||||
return super.visit(tu);
|
||||
}
|
||||
|
||||
|
@ -318,24 +315,21 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
/**
|
||||
* Applies the C++ code formatter to the code affected by refactoring.
|
||||
*
|
||||
* @param multiEdit The text edit produced by refactoring.
|
||||
* @param code The code being modified.
|
||||
* @param tu The translation unit containing the code.
|
||||
* @return The text edit containing formatted refactoring changes, or the original text edit
|
||||
* in case of errors.
|
||||
*/
|
||||
private MultiTextEdit formatChangedCode(MultiTextEdit multiEdit, String code, ITranslationUnit tu) {
|
||||
private void formatChangedCode(String code, ITranslationUnit tu) {
|
||||
IDocument document = new Document(code);
|
||||
try {
|
||||
// Apply refactoring changes to a temporary document.
|
||||
TextEdit edit = multiEdit.copy();
|
||||
TextEdit edit = rootEdit.copy();
|
||||
edit.apply(document, TextEdit.UPDATE_REGIONS);
|
||||
|
||||
// Expand regions affected by the changes to cover complete lines. We calculate two
|
||||
// sets of regions, reflecting the state of the document before and after
|
||||
// the refactoring changes.
|
||||
TextEdit[] edits = edit.getChildren();
|
||||
TextEdit[] originalEdits = multiEdit.getChildren();
|
||||
TextEdit[] originalEdits = rootEdit.getChildren();
|
||||
IRegion[] regionsAfter = new IRegion[edits.length];
|
||||
IRegion[] regionsBefore = new IRegion[edits.length];
|
||||
int numRegions = 0;
|
||||
|
@ -396,13 +390,11 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
edit = new ReplaceEdit(region.getOffset(), region.getLength(), document.get());
|
||||
resultEdit.addChild(edit);
|
||||
}
|
||||
return resultEdit;
|
||||
rootEdit = resultEdit;
|
||||
} catch (MalformedTreeException e) {
|
||||
CCorePlugin.log(e);
|
||||
return multiEdit;
|
||||
} catch (BadLocationException e) {
|
||||
CCorePlugin.log(e);
|
||||
return multiEdit;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -461,10 +453,9 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
}
|
||||
String code = writer.toString();
|
||||
ReplaceEdit edit = new ReplaceEdit(insertPos, length, code);
|
||||
IFile file = FileHelper.getFileFromNode(anchorNode);
|
||||
MultiTextEdit parentEdit = getEdit(anchorNode, file);
|
||||
parentEdit.addChild(edit);
|
||||
sourceOffsets.put(file.getName(), edit.getOffset());
|
||||
addToRootEdit(anchorNode);
|
||||
rootEdit.addChild(edit);
|
||||
processedOffset = edit.getOffset();
|
||||
}
|
||||
|
||||
private void handleReplace(IASTNode node) {
|
||||
|
@ -474,8 +465,6 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
ChangeGeneratorWriterVisitor writer =
|
||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
||||
IASTFileLocation fileLocation = node.getFileLocation();
|
||||
Integer val = sourceOffsets.get(fileLocation.getFileName());
|
||||
int processedOffset = val != null ? val.intValue() : 0;
|
||||
if (modifications.size() == 1 && modifications.get(0).getNewNode() == null) {
|
||||
int offset = getOffsetIncludingComments(node);
|
||||
int endOffset = getEndOffsetIncludingComments(node);
|
||||
|
@ -519,11 +508,9 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
}
|
||||
edit = new ReplaceEdit(offset, endOffset - offset, code);
|
||||
}
|
||||
IFile file = FileHelper.getFileFromNode(node);
|
||||
MultiTextEdit parentEdit = getEdit(node, file);
|
||||
parentEdit.addChild(edit);
|
||||
|
||||
sourceOffsets.put(fileLocation.getFileName(), edit.getExclusiveEnd());
|
||||
addToRootEdit(node);
|
||||
rootEdit.addChild(edit);
|
||||
processedOffset = edit.getExclusiveEnd();
|
||||
}
|
||||
|
||||
private void handleAppends(IASTNode node) {
|
||||
|
@ -551,32 +538,31 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
writer.newLine();
|
||||
}
|
||||
String code = writer.toString();
|
||||
IFile file = FileHelper.getFileFromNode(node);
|
||||
MultiTextEdit parentEdit = getEdit(node, file);
|
||||
addToRootEdit(node);
|
||||
ReplaceEdit edit = new ReplaceEdit(anchor.getOffset(), anchor.getLength(),
|
||||
code + anchor.getText());
|
||||
parentEdit.addChild(edit);
|
||||
rootEdit.addChild(edit);
|
||||
IASTFileLocation fileLocation = node.getFileLocation();
|
||||
sourceOffsets.put(fileLocation.getFileName(), endOffset(fileLocation));
|
||||
processedOffset = endOffset(fileLocation);
|
||||
}
|
||||
|
||||
private void handleAppends(IASTTranslationUnit tu) {
|
||||
List<ASTModification> modifications = getModifications(tu, ModificationKind.APPEND_CHILD);
|
||||
private void handleAppends(IASTTranslationUnit node) {
|
||||
List<ASTModification> modifications = getModifications(node, ModificationKind.APPEND_CHILD);
|
||||
if (modifications.isEmpty())
|
||||
return;
|
||||
|
||||
IASTNode prevNode = null;
|
||||
IASTDeclaration[] declarations = tu.getDeclarations();
|
||||
IASTDeclaration[] declarations = node.getDeclarations();
|
||||
if (declarations.length != 0) {
|
||||
prevNode = declarations[declarations.length - 1];
|
||||
} else {
|
||||
IASTPreprocessorStatement[] preprocessorStatements = tu.getAllPreprocessorStatements();
|
||||
IASTPreprocessorStatement[] preprocessorStatements = node.getAllPreprocessorStatements();
|
||||
if (preprocessorStatements.length != 0) {
|
||||
prevNode = preprocessorStatements[preprocessorStatements.length - 1];
|
||||
}
|
||||
}
|
||||
int offset = prevNode != null ? getEndOffsetIncludingComments(prevNode) : 0;
|
||||
String source = tu.getRawSignature();
|
||||
String source = node.getRawSignature();
|
||||
int endOffset = skipTrailingBlankLines(source, offset);
|
||||
|
||||
ChangeGeneratorWriterVisitor writer =
|
||||
|
@ -607,9 +593,8 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
}
|
||||
|
||||
String code = writer.toString();
|
||||
IFile file = FileHelper.getFileFromNode(tu);
|
||||
MultiTextEdit parentEdit = getEdit(tu, file);
|
||||
parentEdit.addChild(new ReplaceEdit(offset, endOffset - offset, code));
|
||||
addToRootEdit(node);
|
||||
rootEdit.addChild(new ReplaceEdit(offset, endOffset - offset, code));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -928,23 +913,20 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
return startPos;
|
||||
}
|
||||
|
||||
private MultiTextEdit getEdit(IASTNode modifiedNode, IFile file) {
|
||||
MultiTextEdit edit = changes.get(file);
|
||||
if (edit == null) {
|
||||
edit = new MultiTextEdit();
|
||||
changes.put(file, edit);
|
||||
private void addToRootEdit(IASTNode modifiedNode) {
|
||||
if (rootEdit == null) {
|
||||
rootEdit = new MultiTextEdit();
|
||||
}
|
||||
TextEditGroup editGroup = new TextEditGroup(ChangeGeneratorMessages.ChangeGenerator_group);
|
||||
for (List<ASTModification> modifications : getModifications(modifiedNode).values()) {
|
||||
for (ASTModification modification : modifications) {
|
||||
if (modification.getAssociatedEditGroup() != null) {
|
||||
editGroup = modification.getAssociatedEditGroup();
|
||||
edit.addChildren(editGroup.getTextEdits());
|
||||
return edit;
|
||||
rootEdit.addChildren(editGroup.getTextEdits());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
return edit;
|
||||
}
|
||||
|
||||
private int getOffsetIncludingComments(IASTNode node) {
|
||||
|
|
Loading…
Add table
Reference in a new issue