From 86e44ca5fb8f3cbce578f0aad1c04531032fc5ae Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 3 Oct 2008 13:06:27 +0000 Subject: [PATCH] Enable refactoring off macro in ifndef-statements, bug 248007. --- .../ui/refactoring/rename/ASTManager.java | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java index 0d51f31f359..ad0d18954b1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java @@ -44,7 +44,12 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; +import org.eclipse.cdt.core.dom.ast.IASTNodeSelector; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElifStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorFunctionStyleMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfndefStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; @@ -827,12 +832,39 @@ public class ASTManager { IASTTranslationUnit tu= getTranslationUnit(index, fArgument.getSourceFile(), true, status); pm.worked(1); if (tu != null) { - IASTName name= tu.getNodeSelector(tu.getFilePath()).findEnclosingName(fArgument.getOffset(), fArgument.getLength()); + final IASTNodeSelector nodeSelector = tu.getNodeSelector(tu.getFilePath()); + final int offset = fArgument.getOffset(); + final int length = fArgument.getLength(); + IASTName name= nodeSelector.findEnclosingName(offset, length); if (name != null) { if (name instanceof ICPPASTQualifiedName) { IASTName[] na= ((ICPPASTQualifiedName) name).getNames(); name= na[na.length-1]; } + } else { + IASTNode node= nodeSelector.findEnclosingNode(offset, length); + if (node instanceof IASTPreprocessorMacroDefinition || + node instanceof IASTPreprocessorElifStatement || + node instanceof IASTPreprocessorIfdefStatement || + node instanceof IASTPreprocessorIfndefStatement || + node instanceof IASTPreprocessorIfStatement) { + final IASTFileLocation fileLocation = node.getFileLocation(); + if (fileLocation != null) { + final String ident= extractIdentifier(node.getRawSignature(), offset - fileLocation.getNodeOffset(), length); + if (ident != null) { + IASTPreprocessorMacroDefinition[] mdefs= tu.getMacroDefinitions(); + for (IASTPreprocessorMacroDefinition mdef : mdefs) { + IASTName n= mdef.getName(); + if (ident.equals(n.toString())) { + name= n; + break; + } + } + } + } + } + } + if (name != null) { fArgument.setName(name); IBinding binding= name.resolveBinding(); if (binding != null) { @@ -850,7 +882,32 @@ public class ASTManager { pm.done(); } - private IASTTranslationUnit getTranslationUnit(IIndex index, IFile sourceFile, + private String extractIdentifier(String rawSignature, int offset, int length) { + char[] sig= rawSignature.toCharArray(); + int end= offset+length; + if (offset < 0 || end > sig.length) + return null; + + for (int i = offset; i < end; i++) { + if (!Character.isJavaIdentifierPart(sig[i])) + return null; + } + while(offset > 0) { + if (Character.isJavaIdentifierPart(sig[offset-1])) + offset--; + else + break; + } + while(end < sig.length) { + if (Character.isJavaIdentifierPart(sig[end])) + end++; + else + break; + } + return rawSignature.substring(offset, end); + } + + private IASTTranslationUnit getTranslationUnit(IIndex index, IFile sourceFile, boolean cacheit, RefactoringStatus status) { IASTTranslationUnit ast= fTranslationUnits.get(sourceFile); if (ast == null) {