1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

patch from Devin Steffler RE Open Declaration/Definition

bugs 86829, 93589, 94360
This commit is contained in:
Andrew Niefer 2005-05-10 20:31:02 +00:00
parent ac2dcaf6f4
commit ada5f6bb24
9 changed files with 1721 additions and 382 deletions

View file

@ -751,31 +751,6 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest {
assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "A"); //$NON-NLS-1$ assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "A"); //$NON-NLS-1$
} }
// TODO no template support yet for new AST?
// public void testBug72814() throws Exception{
// Writer writer = new StringWriter();
// writer.write( "namespace N{ \n"); //$NON-NLS-1$
// writer.write( " template < class T > class AAA { T _t };\n"); //$NON-NLS-1$
// writer.write( "} \n"); //$NON-NLS-1$
// writer.write( "N::AAA<int> a; \n"); //$NON-NLS-1$
//
// String code = writer.toString();
// int startIndex = code.indexOf( "AAA<int>" ); //$NON-NLS-1$
// int length = "AAA".length(); //$NON-NLS-1$
// IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length );
// assertNotNull(node);
//
//// assertTrue( node instanceof IASTClassSpecifier );
//// assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$
//
// length = "AAA<int>".length(); //$NON-NLS-1$
// node = parse( code, ParserLanguage.CPP, startIndex, length );
// assertNotNull(node);
//
//// assertTrue( node instanceof IASTClassSpecifier );
//// assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$
// }
public void testBug72710() throws Exception public void testBug72710() throws Exception
{ {
Writer writer = new StringWriter(); Writer writer = new StringWriter();

View file

@ -13,10 +13,12 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName; 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.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
@ -127,19 +129,26 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator {
if( n == this.name ) if( n == this.name )
{ {
IASTNode getParent = getParent(); IASTNode getParent = getParent();
boolean fnDtor = ( this instanceof IASTFunctionDeclarator );
if( getParent instanceof IASTDeclaration ) if( getParent instanceof IASTDeclaration )
{ {
if( getParent instanceof IASTFunctionDefinition ) if( getParent instanceof IASTFunctionDefinition )
return r_definition; return r_definition;
if( getParent instanceof IASTSimpleDeclaration ) if( getParent instanceof IASTSimpleDeclaration )
{ {
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent; IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent;
if( sd.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_extern ) int storage = sd.getDeclSpecifier().getStorageClass();
return r_declaration; if( getInitializer() != null || storage == IASTDeclSpecifier.sc_typedef )
if( getInitializer() == null ) return r_definition;
return r_declaration;
if( storage == IASTDeclSpecifier.sc_extern ||
storage == IASTDeclSpecifier.sc_static )
{
return r_declaration;
}
return fnDtor ? r_declaration : r_definition;
} }
return r_definition;
} }
if( getParent instanceof IASTTypeId ) if( getParent instanceof IASTTypeId )
return r_reference; return r_reference;
@ -154,17 +163,22 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator {
return r_definition; return r_definition;
if( getParent instanceof IASTSimpleDeclaration ) if( getParent instanceof IASTSimpleDeclaration )
{ {
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent; if( getInitializer() != null )
if( sd.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_extern )
return r_declaration;
if( getInitializer() != null )
return r_definition; return r_definition;
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent;
int storage = sd.getDeclSpecifier().getStorageClass();
if( storage == IASTDeclSpecifier.sc_extern ||
storage == IASTDeclSpecifier.sc_static)
return r_declaration;
} }
return r_definition; return fnDtor ? r_declaration : r_definition;
} }
if( t instanceof IASTTypeId ) if( t instanceof IASTTypeId )
return r_reference; return r_reference;
} }
if( getParent instanceof IASTParameterDeclaration )
return ( n.toCharArray().length > 0 ) ? r_definition : r_declaration;
} }
return r_unclear; return r_unclear;
} }

View file

@ -69,7 +69,7 @@ public class CPPASTNamespaceAlias extends CPPASTNode implements
* @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName)
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if( alias == n ) return r_declaration; if( alias == n ) return r_definition;
if( qualifiedName == n ) return r_reference; if( qualifiedName == n ) return r_reference;
return r_unclear; return r_unclear;
} }

View file

@ -34,7 +34,9 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.c.CASTVisitor; import org.eclipse.cdt.core.dom.ast.c.CASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
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.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
@ -47,6 +49,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.search.ICSearchConstants.LimitTo; import org.eclipse.cdt.core.search.ICSearchConstants.LimitTo;
import org.eclipse.cdt.core.search.ICSearchConstants.SearchFor; import org.eclipse.cdt.core.search.ICSearchConstants.SearchFor;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod;
import org.eclipse.cdt.internal.core.search.matching.CSearchPattern; import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
@ -88,6 +91,9 @@ public class DOMSearchUtil {
} }
private static CSearchPattern createPattern( IBinding binding, LimitTo limitTo, boolean caseSensitive) { private static CSearchPattern createPattern( IBinding binding, LimitTo limitTo, boolean caseSensitive) {
if (binding == null)
return null;
// build the SearchFor/pattern based on the IBinding // build the SearchFor/pattern based on the IBinding
SearchFor searchFor = createSearchFor(binding); SearchFor searchFor = createSearchFor(binding);
if (binding instanceof IFunction) { if (binding instanceof IFunction) {
@ -187,7 +193,7 @@ public class DOMSearchUtil {
public static IASTName[] getSelectedNamesFrom(IASTTranslationUnit tu, int offset, int length, ParserLanguage lang) { public static IASTName[] getSelectedNamesFrom(IASTTranslationUnit tu, int offset, int length, ParserLanguage lang) {
IASTNode node = null; IASTNode node = null;
try{ try{
node = tu.selectNodeForLocation(tu.getFilePath(), offset, length); // TODO Devin untested tu.getContainingFilename() ... node = tu.selectNodeForLocation(tu.getFilePath(), offset, length);
} }
catch (ParseError er){} catch (ParseError er){}
catch ( VirtualMachineError vmErr){ catch ( VirtualMachineError vmErr){
@ -335,36 +341,55 @@ public class DOMSearchUtil {
* @return IASTName[] declarations, references, or both depending on limitTo that correspond to the IASTName searchName searched for * @return IASTName[] declarations, references, or both depending on limitTo that correspond to the IASTName searchName searched for
*/ */
public static IASTName[] getNamesFromDOM(IASTName searchName, LimitTo limitTo) { public static IASTName[] getNamesFromDOM(IASTName searchName, LimitTo limitTo) {
IASTName[] names = null; IASTName[] names = null;
IASTTranslationUnit tu = searchName.getTranslationUnit(); IASTTranslationUnit tu = searchName.getTranslationUnit();
if (tu == null) { if (tu == null) {
return BLANK_NAME_ARRAY; return BLANK_NAME_ARRAY;
} }
// fix for 92632 IBinding binding = searchName.resolveBinding();
IBinding binding = searchName.resolveBinding(); names = getNames(tu, binding, limitTo);
if (binding instanceof ICPPTemplateInstance) {
if (((ICPPTemplateInstance)binding).getTemplateDefinition() != null) if (names == null || names.length == 0) { // try alternate strategies
binding = ((ICPPTemplateInstance)binding).getTemplateDefinition(); // fix for 92632
} if (binding instanceof ICPPTemplateInstance) {
if (((ICPPTemplateInstance)binding).getTemplateDefinition() != null) {
if (limitTo == ICSearchConstants.DECLARATIONS) { binding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
names = tu.getDeclarations(binding); names = getNames(tu, binding, limitTo);
} else if (limitTo == ICSearchConstants.REFERENCES) { }
names = tu.getReferences(binding); }
} else if (limitTo == ICSearchConstants.DEFINITIONS) {
names = tu.getDefinitions(binding); // fix for 86829
} else if (limitTo == ICSearchConstants.ALL_OCCURRENCES){ try {
names = tu.getDeclarations(binding); if (binding instanceof ICPPConstructor && binding.getScope() instanceof ICPPClassScope) {
names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding)); binding = ((ICPPClassScope)binding.getScope()).getClassType();
} else { // assume ALL names = getNames(tu, binding, limitTo);
names = tu.getDeclarations(binding); }
names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding)); } catch (DOMException e) {}
} }
return names; return names;
} }
private static IASTName[] getNames(IASTTranslationUnit tu, IBinding binding, LimitTo limitTo) {
IASTName[] names = null;
if (limitTo == ICSearchConstants.DECLARATIONS) {
names = tu.getDeclarations(binding);
} else if (limitTo == ICSearchConstants.REFERENCES) {
names = tu.getReferences(binding);
} else if (limitTo == ICSearchConstants.DEFINITIONS) {
names = tu.getDefinitions(binding);
} else if (limitTo == ICSearchConstants.ALL_OCCURRENCES){
names = tu.getDeclarations(binding);
names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding));
} else { // assume ALL
names = tu.getDeclarations(binding);
names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding));
}
return names;
}
/** /**
* The CPPNameCollector used to get IASTNames from an IASTNode. * The CPPNameCollector used to get IASTNames from an IASTNode.

View file

@ -473,6 +473,7 @@ public class DOMAST extends ViewPart {
* @see java.lang.Runnable#run() * @see java.lang.Runnable#run()
*/ */
public void run() { public void run() {
if (view == null) return;
view.refresh(); view.refresh();
if (view.getTree().getItems().length > 0) { if (view.getTree().getItems().length > 0) {
@ -684,6 +685,7 @@ public class DOMAST extends ViewPart {
} }
public void setContentProvider(ViewContentProvider vcp) { public void setContentProvider(ViewContentProvider vcp) {
if (viewer == null) return;
viewer.setContentProvider(vcp); viewer.setContentProvider(vcp);
} }

View file

@ -48,7 +48,8 @@ import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_VariableType_N
import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_VariableType_NoPrefix; import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_VariableType_NoPrefix;
import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_VariableType_Prefix; import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_VariableType_Prefix;
import org.eclipse.cdt.ui.tests.text.contentassist.ContentAssistTests; import org.eclipse.cdt.ui.tests.text.contentassist.ContentAssistTests;
import org.eclipse.cdt.ui.tests.text.selectiontests.SelectionTests; import org.eclipse.cdt.ui.tests.text.selectiontests.CPPSelectionTestsNoIndexer;
import org.eclipse.cdt.ui.tests.text.selectiontests.CSelectionTestsNoIndexer;
@ -115,11 +116,12 @@ public class AutomatedSuite extends TestSuite {
addTest( ContentAssistTests.suite() ); addTest( ContentAssistTests.suite() );
addTest( RegressionTestsUISuite.suite() ); addTest( RegressionTestsUISuite.suite() );
// selection tests
addTest( SelectionTests.suite() );
// Failed Tests // Failed Tests
addTest(CompletionFailedTest_MemberReference_Arrow_Prefix2.suite()); addTest(CompletionFailedTest_MemberReference_Arrow_Prefix2.suite());
// selection tests with no indexer
addTest( CPPSelectionTestsNoIndexer.suite() );
addTest( CSelectionTestsNoIndexer.suite() );
} }
} }

View file

@ -0,0 +1,960 @@
/**********************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.tests.text.selectiontests;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.search.DOMSearchUtil;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
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.jface.action.IAction;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractTextEditor;
/**
* It is required to test the selection performance independent of the indexer to make sure that the DOM is functioning properly.
*
* Indexer bugs can drastically influence the correctness of these tests so the indexer has to be off when performing them.
*
* @author dsteffle
*/
public class CPPSelectionTestsNoIndexer extends TestCase {
private static final String INDEX_FILE_ID = "2946365241"; //$NON-NLS-1$
static NullProgressMonitor monitor;
static IWorkspace workspace;
static IProject project;
static ICProject cPrj;
static FileManager fileManager;
static boolean disabledHelpContributions = false;
{
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
monitor = new NullProgressMonitor();
workspace = ResourcesPlugin.getWorkspace();
try {
cPrj = CProjectHelper.createCCProject("CPPSelectionTestsNoIndexer", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject();
IPath pathLoc = CCorePlugin.getDefault().getStateLocation();
File indexFile = new File(pathLoc.append(INDEX_FILE_ID + ".index").toOSString()); //$NON-NLS-1$
if (indexFile.exists())
indexFile.delete();
} catch ( CoreException e ) {
/*boo*/
}
if (project == null)
fail("Unable to create project"); //$NON-NLS-1$
//Create file manager
fileManager = new FileManager();
}
public CPPSelectionTestsNoIndexer()
{
super();
}
/**
* @param name
*/
public CPPSelectionTestsNoIndexer(String name)
{
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite( CPPSelectionTestsNoIndexer.class );
suite.addTest( new CPPSelectionTestsNoIndexer("cleanupProject") ); //$NON-NLS-1$
return suite;
}
public void cleanupProject() throws Exception {
try{
project.delete( true, false, monitor );
project = null;
} catch( Throwable e ){
/*boo*/
}
}
protected void tearDown() throws Exception {
if( project == null || !project.exists() )
return;
IResource [] members = project.members();
for( int i = 0; i < members.length; i++ ){
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cdtproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
continue;
try{
members[i].delete( false, monitor );
} catch( Throwable e ){
/*boo*/
}
}
}
protected IFile importFile(String fileName, String contents ) throws Exception{
//Obtain file handle
IFile file = project.getProject().getFile(fileName);
InputStream stream = new ByteArrayInputStream( contents.getBytes() );
//Create file input stream
if( file.exists() )
file.setContents( stream, false, false, monitor );
else
file.create( stream, false, monitor );
fileManager.addFile(file);
return file;
}
protected IASTNode testF3(IFile file, int offset) throws ParserException {
return testF3(file, offset, 0);
}
protected IASTNode testF3(IFile file, int offset, int length) throws ParserException {
disableIndex();
if (offset < 0)
throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart part = null;
try {
part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$
} catch (PartInitException e) {
assertFalse(true);
}
if (part instanceof AbstractTextEditor) {
((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
final IAction action = ((AbstractTextEditor)part).getAction("OpenDeclarations"); //$NON-NLS-1$
action.run();
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
IASTName[] names = DOMSearchUtil.getSelectedNamesFrom(file, ((TextSelection)sel).getOffset(), ((TextSelection)sel).getLength());
if (names.length == 0) {
assertFalse(true);
} else {
return names[0];
}
}
}
return null;
}
protected IASTNode testF2(IFile file, int offset) throws ParserException {
return testF2(file, offset, 0);
}
protected IASTNode testF2(IFile file, int offset, int length) throws ParserException {
disableIndex();
if (offset < 0)
throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart part = null;
try {
part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$
} catch (PartInitException e) {
assertFalse(true);
}
if (part instanceof AbstractTextEditor) {
((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
final IAction action = ((AbstractTextEditor)part).getAction("OpenDefinition"); //$NON-NLS-1$
action.run();
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
IASTName[] names = DOMSearchUtil.getSelectedNamesFrom(file, ((TextSelection)sel).getOffset(), ((TextSelection)sel).getLength());
if (names == null || names.length == 0)
return null;
return names[0];
}
}
return null;
}
private void disableIndex() {
IPath pathLoc = CCorePlugin.getDefault().getStateLocation();
File indexFile = new File(pathLoc.append(INDEX_FILE_ID + ".index").toOSString()); //$NON-NLS-1$
if (indexFile.exists())
indexFile.delete();
}
public void testBug93281() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("class Point{ \n"); //$NON-NLS-1$
buffer.append("public: \n"); //$NON-NLS-1$
buffer.append("Point(): xCoord(0){} \n"); //$NON-NLS-1$
buffer.append("Point& operator=(const Point &rhs){return *this;} // line A\n"); //$NON-NLS-1$
buffer.append("void* operator new [ ] (unsigned int);\n"); //$NON-NLS-1$
buffer.append("private: \n"); //$NON-NLS-1$
buffer.append("int xCoord; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("static const Point zero;\n"); //$NON-NLS-1$
buffer.append("int main(int argc, char **argv) { \n"); //$NON-NLS-1$
buffer.append("Point *p2 = new Point(); \n"); //$NON-NLS-1$
buffer.append("p2-> operator // /* operator */ // F3 in the middle \n"); //$NON-NLS-1$
buffer.append("//of \"operator\" should work\n"); //$NON-NLS-1$
buffer.append("// \\n"); //$NON-NLS-1$
buffer.append("/* */\n"); //$NON-NLS-1$
buffer.append("=(zero); // line B\n"); //$NON-NLS-1$
buffer.append("p2->operator /* oh yeah */ new // F3 in the middle of \"operator\"\n"); //$NON-NLS-1$
buffer.append("// should work\n"); //$NON-NLS-1$
buffer.append("//\n"); //$NON-NLS-1$
buffer.append("[ /* sweet */ ] //\n"); //$NON-NLS-1$
buffer.append("(2);\n"); //$NON-NLS-1$
buffer.append("return (0); \n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("test93281.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("p2->operator") + 6; //$NON-NLS-1$
IASTNode node = testF3(file, offset);
assertTrue(node instanceof IASTName);
assertEquals(((IASTName)node).toString(), "operator new[]"); //$NON-NLS-1$
assertEquals(((ASTNode)node).getOffset(), 183);
assertEquals(((ASTNode)node).getLength(), 16);
offset = code.indexOf("p2-> operator") + 11; //$NON-NLS-1$
node = testF3(file, offset);
assertTrue(node instanceof IASTName);
assertEquals(((IASTName)node).toString(), "operator ="); //$NON-NLS-1$
assertEquals(((ASTNode)node).getOffset(), 121);
assertEquals(((ASTNode)node).getLength(), 9);
}
public void testBasicDefinition() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("extern int MyInt; // MyInt is in another file\n"); //$NON-NLS-1$
buffer.append("extern const int MyConst; // MyConst is in another file\n"); //$NON-NLS-1$
buffer.append("void MyFunc(int); // often used in header files\n"); //$NON-NLS-1$
buffer.append("struct MyStruct; // often used in header files\n"); //$NON-NLS-1$
buffer.append("typedef int NewInt; // a normal typedef statement\n"); //$NON-NLS-1$
buffer.append("class MyClass; // often used in header files\n"); //$NON-NLS-1$
buffer.append("int MyInt;\n"); //$NON-NLS-1$
buffer.append("extern const int MyConst = 42;\n"); //$NON-NLS-1$
buffer.append("void MyFunc(int a) { cout << a << endl; }\n"); //$NON-NLS-1$
buffer.append("struct MyStruct { int Member1; int Member2; };\n"); //$NON-NLS-1$
buffer.append("class MyClass { int MemberVar; };\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testBasicDefinition.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("MyInt;\n") + 2; //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyInt"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 11);
assertEquals(((ASTNode)decl).getLength(), 5);
assertEquals(((IASTName)def).toString(), "MyInt"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 330);
assertEquals(((ASTNode)def).getLength(), 5);
offset = code.indexOf("MyConst = 42") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyConst"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 69);
assertEquals(((ASTNode)decl).getLength(), 7);
assertEquals(((IASTName)def).toString(), "MyConst"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 354);
assertEquals(((ASTNode)def).getLength(), 7);
offset = code.indexOf("MyFunc(int a)") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyFunc"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 115);
assertEquals(((ASTNode)decl).getLength(), 6);
assertEquals(((IASTName)def).toString(), "MyFunc"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 373);
assertEquals(((ASTNode)def).getLength(), 6);
offset = code.indexOf("MyStruct {") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyStruct"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 171);
assertEquals(((ASTNode)decl).getLength(), 8);
assertEquals(((IASTName)def).toString(), "MyStruct"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 417);
assertEquals(((ASTNode)def).getLength(), 8);
offset = code.indexOf("MyClass {") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyClass"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 278);
assertEquals(((ASTNode)decl).getLength(), 7);
assertEquals(((IASTName)def).toString(), "MyClass"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 463);
assertEquals(((ASTNode)def).getLength(), 7);
}
public void testBasicTemplateInstance() throws Exception{
Writer writer = new StringWriter();
writer.write( "namespace N{ \n"); //$NON-NLS-1$
writer.write( " template < class T > class AAA { T _t; };\n"); //$NON-NLS-1$
writer.write( "}; \n"); //$NON-NLS-1$
writer.write( "N::AAA<int> a; \n"); //$NON-NLS-1$
String code = writer.toString();
IFile file = importFile("testBasicTemplateInstance.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("AAA<int>"); //$NON-NLS-1$
IASTNode def1 = testF2(file, offset, 3);
IASTNode decl1 = testF3(file, offset, 3);
assertTrue(def1 instanceof IASTName);
assertTrue(decl1 instanceof IASTName);
assertEquals(((IASTName)decl1).toString(), "AAA"); //$NON-NLS-1$
assertEquals(((ASTNode)decl1).getOffset(), 74);
assertEquals(((ASTNode)decl1).getLength(), 3);
assertEquals(((IASTName)def1).toString(), "AAA"); //$NON-NLS-1$
assertEquals(((ASTNode)def1).getOffset(), 74);
assertEquals(((ASTNode)def1).getLength(), 3);
IASTNode def2 = testF2(file, offset, 8);
IASTNode decl2 = testF3(file, offset, 8);
assertTrue(def2 instanceof IASTName);
assertTrue(decl2 instanceof IASTName);
assertEquals(((IASTName)decl2).toString(), "AAA"); //$NON-NLS-1$
assertEquals(((ASTNode)decl2).getOffset(), 74);
assertEquals(((ASTNode)decl2).getLength(), 3);
assertEquals(((IASTName)def2).toString(), "AAA"); //$NON-NLS-1$
assertEquals(((ASTNode)def2).getOffset(), 74);
assertEquals(((ASTNode)def2).getLength(), 3);
}
public void testBug86829A() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("class X {\n"); //$NON-NLS-1$
buffer.append("public:\n"); //$NON-NLS-1$
buffer.append("X(int); // openReferences fails to find the constructor in g()\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("X f(X);\n"); //$NON-NLS-1$
buffer.append("void g()\n"); //$NON-NLS-1$
buffer.append("{\n"); //$NON-NLS-1$
buffer.append("X b = f(X(2)); // openDeclarations on X(int) finds the class and not \n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testBug86829A.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("X(2)"); //$NON-NLS-1$
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 18);
assertEquals(((ASTNode)decl).getLength(), 1);
}
public void testBug86829B() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("class X {\n"); //$NON-NLS-1$
buffer.append("public:\n"); //$NON-NLS-1$
buffer.append("operator int();\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("class Y {\n"); //$NON-NLS-1$
buffer.append("public:\n"); //$NON-NLS-1$
buffer.append("operator X();\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("Y a;\n"); //$NON-NLS-1$
buffer.append("int c = X(a); // OK: a.operator X().operator int()\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testBug86829B.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("X(a);"); //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 6);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 6);
assertEquals(((ASTNode)def).getLength(), 1);
}
// taken from C++ spec 3.1-3:
/*
// all but one of the following are definitions:
int a; // defines a
extern const int c = 1; // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; }; // defines S, S::a, and S::b
struct X { // defines X
int x; // defines nonstatic data member x
static int y; // declares static data member y
X(): x(0) { } // defines a constructor of X
};
int X::y = 1; // defines X::y
enum { up, down }; // defines up and down
namespace N { int d; } // defines N and N::d
namespace N1 = N; // defines N1
X anX; // defines anX
// whereas these are just declarations:
extern int a; // declares a
extern const int c; // declares c
int f(int); // declares f
struct S; // declares S
typedef int Int; // declares Int
extern X anotherX; // declares anotherX
using N::d; // declares N::d
*/
public void testCPPSpecDeclsDefs() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("int a; // defines a\n"); //$NON-NLS-1$
buffer.append("extern const int c = 1; // defines c\n"); //$NON-NLS-1$
buffer.append("int f(int x) { return x+a; } // defines f and defines x\n"); //$NON-NLS-1$
buffer.append("struct S { int a; int b; }; // defines S, S::a, and S::b\n"); //$NON-NLS-1$
buffer.append("struct X { // defines X\n"); //$NON-NLS-1$
buffer.append("int x; // defines nonstatic data member x\n"); //$NON-NLS-1$
buffer.append("static int y; // declares static data member y\n"); //$NON-NLS-1$
buffer.append("X(): x(0) { } // defines a constructor of X\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("int X::y = 1; // defines X::y\n"); //$NON-NLS-1$
buffer.append("enum { up, down }; // defines up and down\n"); //$NON-NLS-1$
buffer.append("namespace N { int d; } // defines N and N::d\n"); //$NON-NLS-1$
buffer.append("namespace N1 = N; // defines N1\n"); //$NON-NLS-1$
buffer.append("X anX; // defines anX\n"); //$NON-NLS-1$
buffer.append("extern int a; // declares a\n"); //$NON-NLS-1$
buffer.append("extern const int c; // declares c\n"); //$NON-NLS-1$
buffer.append("int f(int); // declares f\n"); //$NON-NLS-1$
buffer.append("struct S; // declares S\n"); //$NON-NLS-1$
buffer.append("typedef int Int; // declares Int\n"); //$NON-NLS-1$
buffer.append("extern X anotherX; // declares anotherX\n"); //$NON-NLS-1$
buffer.append("using N::d; // declares N::d\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testCPPSpecDeclsDefs.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("a; // defines a"); //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 4);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 4);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("c = 1; // defines c"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 37);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 37);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("f(int x) { return x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 61);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 61);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x) { return x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 67);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 67);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 67);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 67);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 67);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 67);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 4);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 4);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("S { int a; int b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 120);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 120);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("a; int b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 128);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 128);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "b"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 135);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "b"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 135);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("X { // defines X"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x; // defines nonstatic data member x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 198);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 198);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("y; // declares static data member y"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "y"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 247);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "y"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 337);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("X(): x(0) { } // defines a constructor of X"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 283);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 283);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x(0) { } // defines a constructor of X"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 198);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 198);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("X::y = 1; // defines X::y"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("y = 1; // defines X::y"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "y"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 247);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "y"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 337);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("up, down }; // defines up and down"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "up"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 367);
assertEquals(((ASTNode)decl).getLength(), 2);
assertEquals(((IASTName)def).toString(), "up"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 367);
assertEquals(((ASTNode)def).getLength(), 2);
offset = code.indexOf("down }; // defines up and down"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "down"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 371);
assertEquals(((ASTNode)decl).getLength(), 4);
assertEquals(((IASTName)def).toString(), "down"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 371);
assertEquals(((ASTNode)def).getLength(), 4);
offset = code.indexOf("N { int d; } // defines N and N::d"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "N"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 412);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "N"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 412);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("d; } // defines N and N::d"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "d"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 420);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "d"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 420);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("N1 = N; // defines N1"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "N1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 457);
assertEquals(((ASTNode)decl).getLength(), 2);
assertEquals(((IASTName)def).toString(), "N1"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 457);
assertEquals(((ASTNode)def).getLength(), 2);
offset = code.indexOf("N; // defines N1"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "N"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 412);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "N"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 412);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("X anX; // defines anX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("anX; // defines anX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "anX"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 481);
assertEquals(((ASTNode)decl).getLength(), 3);
assertEquals(((IASTName)def).toString(), "anX"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 481);
assertEquals(((ASTNode)def).getLength(), 3);
offset = code.indexOf("a; // declares a"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 4);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 4);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("c; // declares c"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 37);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 37);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("f(int); // declares f"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 61);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 61);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("S; // declares S"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 120);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 120);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("Int; // declares Int"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "Int"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 625);
assertEquals(((ASTNode)decl).getLength(), 3);
offset = code.indexOf("X anotherX; // declares anotherX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("anotherX; // declares anotherX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "anotherX"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 655);
assertEquals(((ASTNode)decl).getLength(), 8);
offset = code.indexOf("N::d; // declares N::d"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "N"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 412);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "N"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 412);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("d; // declares N::d"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "d"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 420);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "d"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 420);
assertEquals(((ASTNode)def).getLength(), 1);
}
public void testNoDefinitions() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("extern int a1; // declares a\n"); //$NON-NLS-1$
buffer.append("extern const int c1; // declares c\n"); //$NON-NLS-1$
buffer.append("int f1(int); // declares f\n"); //$NON-NLS-1$
buffer.append("struct S1; // declares S\n"); //$NON-NLS-1$
buffer.append("typedef int Int; // declares Int\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testNoDefinitions.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("a1; // declares a"); //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 11);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("c1; // declares c"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "c1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 46);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("f1(int); // declares f"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "f1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 68);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("S1; // declares S"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "S1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 98);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("Int; // declares Int"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "Int"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 128);
assertEquals(((ASTNode)decl).getLength(), 3);
}
}

View file

@ -0,0 +1,672 @@
/**********************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.tests.text.selectiontests;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.search.DOMSearchUtil;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
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.jface.action.IAction;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractTextEditor;
/**
* It is required to test the selection performance independent of the indexer to make sure that the DOM is functioning properly.
*
* Indexer bugs can drastically influence the correctness of these tests so the indexer has to be off when performing them.
*
* @author dsteffle
*/
public class CSelectionTestsNoIndexer extends TestCase {
private static final String INDEX_FILE_ID = "2324852323"; //$NON-NLS-1$
static NullProgressMonitor monitor;
static IWorkspace workspace;
static IProject project;
static ICProject cPrj;
static FileManager fileManager;
static boolean disabledHelpContributions = false;
{
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
monitor = new NullProgressMonitor();
workspace = ResourcesPlugin.getWorkspace();
try {
cPrj = CProjectHelper.createCProject("CSelectionTestsNoIndexerProject", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject();
IPath pathLoc = CCorePlugin.getDefault().getStateLocation();
File indexFile = new File(pathLoc.append(INDEX_FILE_ID + ".index").toOSString()); //$NON-NLS-1$
if (indexFile.exists())
indexFile.delete();
} catch ( CoreException e ) {
/*boo*/
}
if (project == null)
fail("Unable to create project"); //$NON-NLS-1$
//Create file manager
fileManager = new FileManager();
}
public CSelectionTestsNoIndexer()
{
super();
}
/**
* @param name
*/
public CSelectionTestsNoIndexer(String name)
{
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite( CSelectionTestsNoIndexer.class );
suite.addTest( new CSelectionTestsNoIndexer("cleanupProject") ); //$NON-NLS-1$
return suite;
}
public void cleanupProject() throws Exception {
try{
project.delete( true, false, monitor );
project = null;
} catch( Throwable e ){
/*boo*/
}
}
protected void tearDown() throws Exception {
if( project == null || !project.exists() )
return;
IResource [] members = project.members();
for( int i = 0; i < members.length; i++ ){
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cdtproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
continue;
try{
members[i].delete( false, monitor );
} catch( Throwable e ){
/*boo*/
}
}
}
protected IFile importFile(String fileName, String contents ) throws Exception{
//Obtain file handle
IFile file = project.getProject().getFile(fileName);
InputStream stream = new ByteArrayInputStream( contents.getBytes() );
//Create file input stream
if( file.exists() )
file.setContents( stream, false, false, monitor );
else
file.create( stream, false, monitor );
fileManager.addFile(file);
return file;
}
protected IASTNode testF3(IFile file, int offset) throws ParserException {
return testF3(file, offset, 0);
}
protected IASTNode testF3(IFile file, int offset, int length) throws ParserException {
disableIndex();
if (offset < 0)
throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart part = null;
try {
part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$
} catch (PartInitException e) {
assertFalse(true);
}
if (part instanceof AbstractTextEditor) {
((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
final IAction action = ((AbstractTextEditor)part).getAction("OpenDeclarations"); //$NON-NLS-1$
action.run();
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
IASTName[] names = DOMSearchUtil.getSelectedNamesFrom(file, ((TextSelection)sel).getOffset(), ((TextSelection)sel).getLength());
if (names == null || names.length == 0)
return null;
return names[0];
}
}
return null;
}
protected IASTNode testF2(IFile file, int offset) throws ParserException {
return testF2(file, offset, 0);
}
protected IASTNode testF2(IFile file, int offset, int length) throws ParserException {
disableIndex();
if (offset < 0)
throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart part = null;
try {
part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$
} catch (PartInitException e) {
assertFalse(true);
}
if (part instanceof AbstractTextEditor) {
((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
final IAction action = ((AbstractTextEditor)part).getAction("OpenDefinition"); //$NON-NLS-1$
action.run();
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
IASTName[] names = DOMSearchUtil.getSelectedNamesFrom(file, ((TextSelection)sel).getOffset(), ((TextSelection)sel).getLength());
if (names == null || names.length == 0)
return null;
return names[0];
}
}
return null;
}
private void disableIndex() {
IPath pathLoc = CCorePlugin.getDefault().getStateLocation();
File indexFile = new File(pathLoc.append(INDEX_FILE_ID + ".index").toOSString()); //$NON-NLS-1$
if (indexFile.exists())
indexFile.delete();
}
public void testBasicDefinition() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("extern int MyInt; // MyInt is in another file\n"); //$NON-NLS-1$
buffer.append("extern const int MyConst; // MyConst is in another file\n"); //$NON-NLS-1$
buffer.append("void MyFunc(int); // often used in header files\n"); //$NON-NLS-1$
buffer.append("struct MyStruct; // often used in header files\n"); //$NON-NLS-1$
buffer.append("typedef int NewInt; // a normal typedef statement\n"); //$NON-NLS-1$
buffer.append("int MyInt;\n"); //$NON-NLS-1$
buffer.append("extern const int MyConst = 42;\n"); //$NON-NLS-1$
buffer.append("void MyFunc(int a) { cout << a << endl; }\n"); //$NON-NLS-1$
buffer.append("struct MyStruct { int Member1; int Member2; };\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testBasicDefinition.c", code); //$NON-NLS-1$
int offset = code.indexOf("MyInt;\n") + 2; //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyInt"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 11);
assertEquals(((ASTNode)decl).getLength(), 5);
assertEquals(((IASTName)def).toString(), "MyInt"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 276);
assertEquals(((ASTNode)def).getLength(), 5);
offset = code.indexOf("MyConst = 42") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyConst"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 69);
assertEquals(((ASTNode)decl).getLength(), 7);
assertEquals(((IASTName)def).toString(), "MyConst"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 300);
assertEquals(((ASTNode)def).getLength(), 7);
offset = code.indexOf("MyFunc(int a)") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyFunc"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 115);
assertEquals(((ASTNode)decl).getLength(), 6);
assertEquals(((IASTName)def).toString(), "MyFunc"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 319);
assertEquals(((ASTNode)def).getLength(), 6);
offset = code.indexOf("MyStruct {") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyStruct"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 171);
assertEquals(((ASTNode)decl).getLength(), 8);
assertEquals(((IASTName)def).toString(), "MyStruct"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 363);
assertEquals(((ASTNode)def).getLength(), 8);
}
// taken from C++ spec 3.1-3:
/*
// all but one of the following are definitions:
int a; // defines a
extern const int c = 1; // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; }; // defines S, S::a, and S::b
struct X { // defines X
int x; // defines nonstatic data member x
};
enum { up, down }; // defines up and down
struct X anX; // defines anX
// whereas these are just declarations:
extern int a; // declares a
extern const int c; // declares c
int f(int); // declares f
struct S; // declares S
typedef int Int; // declares Int
extern struct X anotherX; // declares anotherX
*/
public void testCPPSpecDeclsDefs() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("int a; // defines a\n"); //$NON-NLS-1$
buffer.append("extern const int c = 1; // defines c\n"); //$NON-NLS-1$
buffer.append("int f(int x) { return x+a; } // defines f and defines x\n"); //$NON-NLS-1$
buffer.append("struct S { int a; int b; }; // defines S, S::a, and S::b\n"); //$NON-NLS-1$
buffer.append("struct X { // defines X\n"); //$NON-NLS-1$
buffer.append("int x; // defines nonstatic data member x\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("enum { up, down }; // defines up and down\n"); //$NON-NLS-1$
buffer.append("struct X anX; // defines anX\n"); //$NON-NLS-1$
buffer.append("extern int a; // declares a\n"); //$NON-NLS-1$
buffer.append("extern const int c; // declares c\n"); //$NON-NLS-1$
buffer.append("int f(int); // declares f\n"); //$NON-NLS-1$
buffer.append("struct S; // declares S\n"); //$NON-NLS-1$
buffer.append("typedef int Int; // declares Int\n"); //$NON-NLS-1$
buffer.append("extern struct X anotherX; // declares anotherX\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testCPPSpecDeclsDefs.c", code); //$NON-NLS-1$
int offset = code.indexOf("a; // defines a"); //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 4);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 4);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("c = 1; // defines c"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 37);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 37);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("f(int x) { return x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 61);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 61);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x) { return x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 67);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 67);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 67);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 67);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x+a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 67);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 67);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("a; } // defines f and defines x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 4);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 4);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("S { int a; int b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 120);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 120);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("a; int b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 128);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 128);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "b"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 135);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "b"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 135);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("X { // defines X"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("x; // defines nonstatic data member x"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 198);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "x"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 198);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("up, down }; // defines up and down"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "up"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 246);
assertEquals(((ASTNode)decl).getLength(), 2);
assertEquals(((IASTName)def).toString(), "up"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 246);
assertEquals(((ASTNode)def).getLength(), 2);
offset = code.indexOf("down }; // defines up and down"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "down"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 250);
assertEquals(((ASTNode)decl).getLength(), 4);
assertEquals(((IASTName)def).toString(), "down"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 250);
assertEquals(((ASTNode)def).getLength(), 4);
offset = code.indexOf("X anX; // defines anX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("anX; // defines anX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "anX"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 290);
assertEquals(((ASTNode)decl).getLength(), 3);
assertEquals(((IASTName)def).toString(), "anX"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 290);
assertEquals(((ASTNode)def).getLength(), 3);
offset = code.indexOf("a; // declares a"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 4);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "a"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 4);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("c; // declares c"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 37);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "c"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 37);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("f(int); // declares f"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 61);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "f"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 61);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("S; // declares S"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 120);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "S"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 120);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("Int; // declares Int"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "Int"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 434);
assertEquals(((ASTNode)decl).getLength(), 3);
assertEquals(((IASTName)def).toString(), "Int"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 434);
assertEquals(((ASTNode)def).getLength(), 3);
offset = code.indexOf("X anotherX; // declares anotherX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 177);
assertEquals(((ASTNode)decl).getLength(), 1);
assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 177);
assertEquals(((ASTNode)def).getLength(), 1);
offset = code.indexOf("anotherX; // declares anotherX"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "anotherX"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 471);
assertEquals(((ASTNode)decl).getLength(), 8);
}
public void testNoDefinitions() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("extern int a1; // declares a\n"); //$NON-NLS-1$
buffer.append("extern const int c1; // declares c\n"); //$NON-NLS-1$
buffer.append("int f1(int); // declares f\n"); //$NON-NLS-1$
buffer.append("struct S1; // declares S\n"); //$NON-NLS-1$
buffer.append("typedef int Int; // declares Int\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testNoDefinitions.c", code); //$NON-NLS-1$
int offset = code.indexOf("a1; // declares a"); //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "a1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 11);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("c1; // declares c"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "c1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 46);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("f1(int); // declares f"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "f1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 68);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("S1; // declares S"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertNull(def);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "S1"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 98);
assertEquals(((ASTNode)decl).getLength(), 2);
offset = code.indexOf("Int; // declares Int"); //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "Int"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 128);
assertEquals(((ASTNode)decl).getLength(), 3);
assertEquals(((IASTName)def).toString(), "Int"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 128);
assertEquals(((ASTNode)def).getLength(), 3);
}
}

View file

@ -1,311 +0,0 @@
package org.eclipse.cdt.ui.tests.text.selectiontests;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.search.DOMSearchUtil;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractTextEditor;
public class SelectionTests extends TestCase {
static NullProgressMonitor monitor;
static IWorkspace workspace;
static IProject project;
static FileManager fileManager;
static boolean disabledHelpContributions = false;
{
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
monitor = new NullProgressMonitor();
workspace = ResourcesPlugin.getWorkspace();
ICProject cPrj;
try {
cPrj = CProjectHelper.createCCProject("SelectionTestProject", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject();
project.setSessionProperty(SourceIndexer.activationKey,new Boolean(false));
} catch ( CoreException e ) {
/*boo*/
}
if (project == null)
fail("Unable to create project"); //$NON-NLS-1$
//Create file manager
fileManager = new FileManager();
}
public SelectionTests()
{
super();
}
/**
* @param name
*/
public SelectionTests(String name)
{
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite( SelectionTests.class );
suite.addTest( new SelectionTests("cleanupProject") ); //$NON-NLS-1$
return suite;
}
public void cleanupProject() throws Exception {
try{
project.delete( true, false, monitor );
project = null;
} catch( Throwable e ){
/*boo*/
}
}
protected void tearDown() throws Exception {
if( project == null || !project.exists() )
return;
IResource [] members = project.members();
for( int i = 0; i < members.length; i++ ){
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cdtproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
continue;
try{
members[i].delete( false, monitor );
} catch( Throwable e ){
/*boo*/
}
}
}
protected IFile importFile(String fileName, String contents ) throws Exception{
//Obtain file handle
IFile file = project.getProject().getFile(fileName);
InputStream stream = new ByteArrayInputStream( contents.getBytes() );
//Create file input stream
if( file.exists() )
file.setContents( stream, false, false, monitor );
else
file.create( stream, false, monitor );
fileManager.addFile(file);
return file;
}
protected IASTNode testF3(IFile file, int offset) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart part = null;
try {
part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$
} catch (PartInitException e) {
assertFalse(true);
}
if (part instanceof AbstractTextEditor) {
((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,0));
final IAction action = ((AbstractTextEditor)part).getAction("OpenDeclarations"); //$NON-NLS-1$
action.run();
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
IASTName[] names = DOMSearchUtil.getSelectedNamesFrom(file, ((TextSelection)sel).getOffset(), ((TextSelection)sel).getLength());
if (names.length == 0) {
assertFalse(true);
} else {
return names[0];
}
}
}
return null;
}
protected IASTNode testF2(IFile file, int offset) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart part = null;
try {
part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$
} catch (PartInitException e) {
assertFalse(true);
}
if (part instanceof AbstractTextEditor) {
((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,0));
final IAction action = ((AbstractTextEditor)part).getAction("OpenDefinition"); //$NON-NLS-1$
action.run();
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
IASTName[] names = DOMSearchUtil.getSelectedNamesFrom(file, ((TextSelection)sel).getOffset(), ((TextSelection)sel).getLength());
if (names.length == 0) {
assertFalse(true);
} else {
return names[0];
}
}
}
return null;
}
public void testBug93281() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("class Point{ \n"); //$NON-NLS-1$
buffer.append("public: \n"); //$NON-NLS-1$
buffer.append("Point(): xCoord(0){} \n"); //$NON-NLS-1$
buffer.append("Point& operator=(const Point &rhs){return *this;} // line A\n"); //$NON-NLS-1$
buffer.append("void* operator new [ ] (unsigned int);\n"); //$NON-NLS-1$
buffer.append("private: \n"); //$NON-NLS-1$
buffer.append("int xCoord; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("static const Point zero;\n"); //$NON-NLS-1$
buffer.append("int main(int argc, char **argv) { \n"); //$NON-NLS-1$
buffer.append("Point *p2 = new Point(); \n"); //$NON-NLS-1$
buffer.append("p2-> operator // /* operator */ // F3 in the middle \n"); //$NON-NLS-1$
buffer.append("//of \"operator\" should work\n"); //$NON-NLS-1$
buffer.append("// \\n"); //$NON-NLS-1$
buffer.append("/* */\n"); //$NON-NLS-1$
buffer.append("=(zero); // line B\n"); //$NON-NLS-1$
buffer.append("p2->operator /* oh yeah */ new // F3 in the middle of \"operator\"\n"); //$NON-NLS-1$
buffer.append("// should work\n"); //$NON-NLS-1$
buffer.append("//\n"); //$NON-NLS-1$
buffer.append("[ /* sweet */ ] //\n"); //$NON-NLS-1$
buffer.append("(2);\n"); //$NON-NLS-1$
buffer.append("return (0); \n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("test93281.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("p2->operator") + 6; //$NON-NLS-1$
IASTNode node = testF3(file, offset);
assertTrue(node instanceof IASTName);
assertEquals(((IASTName)node).toString(), "operator new[]"); //$NON-NLS-1$
assertEquals(((ASTNode)node).getOffset(), 183);
assertEquals(((ASTNode)node).getLength(), 16);
offset = code.indexOf("p2-> operator") + 11; //$NON-NLS-1$
node = testF3(file, offset);
assertTrue(node instanceof IASTName);
assertEquals(((IASTName)node).toString(), "operator ="); //$NON-NLS-1$
assertEquals(((ASTNode)node).getOffset(), 121);
assertEquals(((ASTNode)node).getLength(), 9);
}
public void testBasicDefinition() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("extern int MyInt; // MyInt is in another file\n"); //$NON-NLS-1$
buffer.append("extern const int MyConst; // MyConst is in another file\n"); //$NON-NLS-1$
buffer.append("void MyFunc(int); // often used in header files\n"); //$NON-NLS-1$
buffer.append("struct MyStruct; // often used in header files\n"); //$NON-NLS-1$
buffer.append("typedef int NewInt; // a normal typedef statement\n"); //$NON-NLS-1$
buffer.append("class MyClass; // often used in header files\n"); //$NON-NLS-1$
buffer.append("int MyInt;\n"); //$NON-NLS-1$
buffer.append("extern const int MyConst = 42;\n"); //$NON-NLS-1$
buffer.append("void MyFunc(int a) { cout << a << endl; }\n"); //$NON-NLS-1$
buffer.append("struct MyStruct { int Member1; int Member2; };\n"); //$NON-NLS-1$
buffer.append("class MyClass { int MemberVar; };\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFile("testBasicDefinition.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("MyInt;\n") + 2; //$NON-NLS-1$
IASTNode def = testF2(file, offset);
IASTNode decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyInt"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 11);
assertEquals(((ASTNode)decl).getLength(), 5);
assertEquals(((IASTName)def).toString(), "MyInt"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 330);
assertEquals(((ASTNode)def).getLength(), 5);
offset = code.indexOf("MyConst = 42") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyConst"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 69);
assertEquals(((ASTNode)decl).getLength(), 7);
assertEquals(((IASTName)def).toString(), "MyConst"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 354);
assertEquals(((ASTNode)def).getLength(), 7);
offset = code.indexOf("MyFunc(int a)") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyFunc"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 115);
assertEquals(((ASTNode)decl).getLength(), 6);
assertEquals(((IASTName)def).toString(), "MyFunc"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 373);
assertEquals(((ASTNode)def).getLength(), 6);
offset = code.indexOf("MyStruct {") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyStruct"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 171);
assertEquals(((ASTNode)decl).getLength(), 8);
assertEquals(((IASTName)def).toString(), "MyStruct"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 417);
assertEquals(((ASTNode)def).getLength(), 8);
offset = code.indexOf("MyClass {") + 2; //$NON-NLS-1$
def = testF2(file, offset);
decl = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals(((IASTName)decl).toString(), "MyClass"); //$NON-NLS-1$
assertEquals(((ASTNode)decl).getOffset(), 278);
assertEquals(((ASTNode)decl).getLength(), 7);
assertEquals(((IASTName)def).toString(), "MyClass"); //$NON-NLS-1$
assertEquals(((ASTNode)def).getOffset(), 463);
assertEquals(((ASTNode)def).getLength(), 7);
}
}