mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 08:55:25 +02:00
Fix mark occurrences for destructors and template types
This commit is contained in:
parent
f8698c710c
commit
f2856c60ce
4 changed files with 77 additions and 8 deletions
|
@ -119,6 +119,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope;
|
||||||
|
@ -1295,6 +1296,9 @@ public class CPPVisitor {
|
||||||
|
|
||||||
|
|
||||||
public CollectReferencesAction( IBinding binding ){
|
public CollectReferencesAction( IBinding binding ){
|
||||||
|
if (binding instanceof ICPPDeferredTemplateInstance) {
|
||||||
|
binding= ((ICPPDeferredTemplateInstance) binding).getSpecializedBinding();
|
||||||
|
}
|
||||||
this.binding = binding;
|
this.binding = binding;
|
||||||
this.refs = new IASTName[ DEFAULT_LIST_SIZE ];
|
this.refs = new IASTName[ DEFAULT_LIST_SIZE ];
|
||||||
|
|
||||||
|
@ -1317,7 +1321,7 @@ public class CPPVisitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int visit( IASTName name ){
|
public int visit( IASTName name ){
|
||||||
if( name instanceof ICPPASTQualifiedName ) return PROCESS_CONTINUE;
|
if( name instanceof ICPPASTQualifiedName || name instanceof ICPPASTTemplateId ) return PROCESS_CONTINUE;
|
||||||
|
|
||||||
ASTNodeProperty prop = name.getPropertyInParent();
|
ASTNodeProperty prop = name.getPropertyInParent();
|
||||||
ASTNodeProperty p2 = null;
|
ASTNodeProperty p2 = null;
|
||||||
|
@ -1394,6 +1398,8 @@ public class CPPVisitor {
|
||||||
candidate = null;
|
candidate = null;
|
||||||
else
|
else
|
||||||
candidate = bs[ ++n ];
|
candidate = bs[ ++n ];
|
||||||
|
} else if (potential instanceof ICPPDeferredTemplateInstance) {
|
||||||
|
candidate= ((ICPPDeferredTemplateInstance) potential).getSpecializedBinding();
|
||||||
} else {
|
} else {
|
||||||
candidate = potential;
|
candidate = potential;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#define INT int
|
#define INT int
|
||||||
#define FUNCTION_MACRO(arg) globalFunc(arg)
|
#define FUNCTION_MACRO(arg) globalFunc(arg)
|
||||||
|
#define EMPTY_MACRO(arg)
|
||||||
|
|
||||||
enum Enumeration {
|
enum Enumeration {
|
||||||
ONE, TWO, THREE
|
ONE, TWO, THREE
|
||||||
|
@ -11,15 +12,22 @@ static int globalStaticVariable = 0;
|
||||||
|
|
||||||
void globalFunc(int a);
|
void globalFunc(int a);
|
||||||
static void globalStaticFunc() {
|
static void globalStaticFunc() {
|
||||||
|
EMPTY_MACRO(n);
|
||||||
globalVariable = 1;
|
globalVariable = 1;
|
||||||
|
EMPTY_MACRO(1);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
;
|
|
||||||
|
|
||||||
class Base1 {
|
class Base1 {
|
||||||
|
Base1();
|
||||||
|
~Base1();
|
||||||
};
|
};
|
||||||
class Base2 {
|
class Base2 {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Base1::~Base1() {}
|
||||||
|
Base1::Base1() {}
|
||||||
|
|
||||||
class ClassContainer : Base1, Base2 {
|
class ClassContainer : Base1, Base2 {
|
||||||
public:
|
public:
|
||||||
static int staticPubField;
|
static int staticPubField;
|
||||||
|
@ -47,6 +55,7 @@ template<class T1, class T2> class TemplateClass {
|
||||||
tArg1 = arg1;
|
tArg1 = arg1;
|
||||||
tArg2 = arg2;
|
tArg2 = arg2;
|
||||||
}
|
}
|
||||||
|
void m(TemplateClass&);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T1> class PartialInstantiatedClass : TemplateClass<T1, Base1> {
|
template<class T1> class PartialInstantiatedClass : TemplateClass<T1, Base1> {
|
||||||
|
|
|
@ -187,7 +187,7 @@ public class MarkOccurrenceTest extends TestCase {
|
||||||
|
|
||||||
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
||||||
|
|
||||||
assertOccurrences(3);
|
assertOccurrences(5);
|
||||||
assertOccurrencesInWidget();
|
assertOccurrencesInWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ public class MarkOccurrenceTest extends TestCase {
|
||||||
|
|
||||||
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
||||||
|
|
||||||
assertOccurrences(2);
|
assertOccurrences(3);
|
||||||
assertOccurrencesInWidget();
|
assertOccurrencesInWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,6 +291,36 @@ public class MarkOccurrenceTest extends TestCase {
|
||||||
assertOccurrencesInWidget();
|
assertOccurrencesInWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMarkConstructorOccurrences() {
|
||||||
|
try {
|
||||||
|
fMatch= fFindReplaceDocumentAdapter.find(0, "Base1(", true, true, false, false);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
assertNotNull(fMatch);
|
||||||
|
|
||||||
|
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
||||||
|
|
||||||
|
assertOccurrences(2);
|
||||||
|
assertOccurrencesInWidget();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void testMarkDestructorOccurrences() {
|
||||||
|
try {
|
||||||
|
fMatch= fFindReplaceDocumentAdapter.find(0, "~Base1", true, true, false, false);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
assertNotNull(fMatch);
|
||||||
|
|
||||||
|
fMatch= new Region(fMatch.getOffset() + 1, fMatch.getLength() - 1);
|
||||||
|
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
||||||
|
|
||||||
|
assertOccurrences(2);
|
||||||
|
assertOccurrencesInWidget();
|
||||||
|
}
|
||||||
|
|
||||||
public void testMarkLocalOccurrences() {
|
public void testMarkLocalOccurrences() {
|
||||||
try {
|
try {
|
||||||
fMatch= fFindReplaceDocumentAdapter.find(0, "localVar", true, true, true, false);
|
fMatch= fFindReplaceDocumentAdapter.find(0, "localVar", true, true, true, false);
|
||||||
|
@ -319,6 +349,20 @@ public class MarkOccurrenceTest extends TestCase {
|
||||||
assertOccurrencesInWidget();
|
assertOccurrencesInWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMarkEmptyMacroOccurrences() {
|
||||||
|
try {
|
||||||
|
fMatch= fFindReplaceDocumentAdapter.find(0, "EMPTY_MACRO", true, true, true, false);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
assertNotNull(fMatch);
|
||||||
|
|
||||||
|
fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength());
|
||||||
|
|
||||||
|
assertOccurrences(3);
|
||||||
|
assertOccurrencesInWidget();
|
||||||
|
}
|
||||||
|
|
||||||
public void testMarkEnumeratorOccurrences() {
|
public void testMarkEnumeratorOccurrences() {
|
||||||
try {
|
try {
|
||||||
fMatch= fFindReplaceDocumentAdapter.find(0, "ONE", true, true, true, false);
|
fMatch= fFindReplaceDocumentAdapter.find(0, "ONE", true, true, true, false);
|
||||||
|
|
|
@ -154,6 +154,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
|
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
|
||||||
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
|
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
@ -2942,13 +2943,22 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
|
||||||
OccurrenceLocation[] locations= null;
|
OccurrenceLocation[] locations= null;
|
||||||
|
|
||||||
IASTNode selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset(), wordRegion.getLength());
|
IASTNode selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset(), wordRegion.getLength());
|
||||||
|
if (selectedNode == null && astRoot instanceof ICPPASTTranslationUnit && wordRegion.getOffset() > 0) {
|
||||||
|
// destructor?
|
||||||
|
try {
|
||||||
|
if (document.getChar(wordRegion.getOffset() - 1) == '~') {
|
||||||
|
selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset() - 1, wordRegion.getLength() + 1);
|
||||||
|
}
|
||||||
|
} catch (BadLocationException exc) {
|
||||||
|
// should not happen
|
||||||
|
}
|
||||||
|
}
|
||||||
final class NameFinder extends ASTVisitor {
|
final class NameFinder extends ASTVisitor {
|
||||||
{
|
private IASTName fName;
|
||||||
|
|
||||||
|
public NameFinder() {
|
||||||
shouldVisitNames= true;
|
shouldVisitNames= true;
|
||||||
}
|
}
|
||||||
IASTName fName;
|
|
||||||
|
|
||||||
public int visit(IASTName name) {
|
public int visit(IASTName name) {
|
||||||
fName= name;
|
fName= name;
|
||||||
return PROCESS_ABORT;
|
return PROCESS_ABORT;
|
||||||
|
|
Loading…
Add table
Reference in a new issue