blob: af240ce66f7b22d28d07e283fb4bb091368ddaad [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 Wind River Systems, Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text.selection;
import java.io.IOException;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.ui.testplugin.CTestPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import junit.framework.Test;
/**
* Test Ctrl-F3/F3 with the DOM Indexer for a C++ project.
*/
public class CPPSelectionIndexerTests extends BaseSelectionTestsIndexer {
protected String sourceIndexerID;
protected IIndex index;
public CPPSelectionIndexerTests(String name) {
super(name);
sourceIndexerID = IPDOMManager.ID_FAST_INDEXER;
}
public static Test suite() {
return suite(CPPSelectionIndexerTests.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
// Create temp project
fCProject = createProject("CPPSelectionTestsDOMIndexerProject");
assertNotNull("Unable to create project", fCProject);
// MakeProjectNature.addNature(project, new NullProgressMonitor());
// ScannerConfigNature.addScannerConfigNature(project);
// PerProjectSICollector.calculateCompilerBuiltins(project);
CCorePlugin.getIndexManager().setIndexerId(fCProject, sourceIndexerID);
index = CCorePlugin.getIndexManager().getIndex(fCProject);
}
@Override
protected void tearDown() throws Exception {
closeAllEditors();
CProjectHelper.delete(fCProject);
super.tearDown();
}
private ICProject createProject(String projectName) throws CoreException {
ICProject cPrj = CProjectHelper.createCCProject(projectName, "bin", IPDOMManager.ID_NO_INDEXER);
return cPrj;
}
protected StringBuilder[] getContents(int sections) throws IOException {
return TestSourceReader.getContentsForTest(CTestPlugin.getDefault().getBundle(), "ui",
CPPSelectionIndexerTests.class, getName(), sections);
}
private void assertNode(String name, int offset, IASTNode node) {
assertNotNull(node);
assertEquals(node.toString(), name);
IASTFileLocation loc = node.getFileLocation();
assertEquals(loc.getNodeOffset(), offset);
assertEquals(loc.getNodeLength(), name.length());
}
// // header
// class Point{
// public:
// Point(): xCoord(0){}
// Point& operator=(const Point &rhs){return *this;}
// void* operator new [ ] (unsigned int);
// private:
// int xCoord;
// };
// // source
// #include "test93281.h"
// static const Point zero;
// int main(int argc, char **argv) {
// Point *p2 = new Point();
// p2-> operator // /* operator */ // F3 in the middle
// // of "operator" should work
// // \
// /* */
// =(zero); // line B
// p2->operator /* oh yeah */ new // F3 in the middle of "operator"
// // should work
// //
// [ /* sweet */ ] //
// (2);
// return (0);
// }
public void testBug93281() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("test93281.h", hcode);
IFile file = importFile("test93281.cpp", scode);
waitUntilFileIsIndexed(index, file);
int offset = scode.indexOf("p2->operator") + 6;
IASTNode node = testF3(file, offset);
assertTrue(node instanceof IASTName);
assertEquals(((IASTName) node).toString(), "operator new[]");
assertEquals(((ASTNode) node).getOffset(), hcode.indexOf("operator new"));
assertEquals(((ASTNode) node).getLength(), 16);
offset = scode.indexOf("p2-> operator") + 11;
node = testF3(file, offset);
assertTrue(node instanceof IASTName);
assertEquals(((IASTName) node).toString(), "operator =");
assertEquals(((ASTNode) node).getOffset(), hcode.indexOf("operator="));
assertEquals(((ASTNode) node).getLength(), 9);
}
// template <class T>
// inline void testTemplate(T& aRef);
//
// class Temp {
// };
// #include <stdio.h>
// #include <stdlib.h>
// #include "test.h"
// int main(void) {
// puts("Hello World!!!");
//
// Temp testFile;
// testTemplate(testFile);
//
// return EXIT_SUCCESS;
// }
public void testBug207320() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("test.h", hcode);
IFile file = importFile("test.cpp", scode);
waitUntilFileIsIndexed(index, file);
int hoffset = hcode.indexOf("testTemplate");
int soffset = scode.indexOf("testTemplate");
IASTNode def = testF3(file, soffset + 2);
assertTrue(def instanceof IASTName);
assertEquals("testTemplate", ((IASTName) def).toString());
assertEquals(hoffset, ((ASTNode) def).getOffset());
assertEquals(12, ((ASTNode) def).getLength());
}
// template<typename T>
// class C {
// public: void assign(const T* s) {}
// };
// #include "testTemplateClassMethod.h"
// void main() {
// C<char> a;
// a.assign("aaa");
// }
public void testTemplateClassMethod_207320() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testTemplateClassMethod.h", hcode);
IFile file = importFile("testTemplateClassMethod.cpp", scode);
waitUntilFileIsIndexed(index, file);
int hoffset = hcode.indexOf("assign");
int soffset = scode.indexOf("assign");
IASTNode def = testF3(file, soffset + 2);
assertTrue(def instanceof IASTName);
assertEquals("assign", ((IASTName) def).toString());
assertEquals(hoffset, ((ASTNode) def).getOffset());
assertEquals(6, ((ASTNode) def).getLength());
}
// // the header
// extern int MyInt; // MyInt is in another file
// extern const int MyConst; // MyConst is in another file
// void MyFunc(int); // often used in header files
// typedef int NewInt; // a normal typedef statement
// struct MyStruct { int Member1; int Member2; };
// class MyClass { int MemberVar; };
// #include "basicDefinition.h"
// int MyInt;
// extern const int MyConst = 42;
// void MyFunc(int a) { cout << a << endl; }
// class MyClass;
// struct MyStruct;
public void testBasicDefinition() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("basicDefinition.h", hcode);
IFile file = importFile("testBasicDefinition.cpp", scode);
waitUntilFileIsIndexed(index, file);
int hoffset = hcode.indexOf("MyInt");
int soffset = scode.indexOf("MyInt");
IASTNode decl = testF3(file, soffset + 2);
IASTNode def = testF3(hfile, hoffset + 2);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyInt", ((IASTName) decl).toString());
assertEquals(hoffset, ((ASTNode) decl).getOffset());
assertEquals(5, ((ASTNode) decl).getLength());
assertEquals("MyInt", ((IASTName) def).toString());
assertEquals(soffset, def.getFileLocation().getNodeOffset());
assertEquals(5, ((ASTNode) def).getLength());
hoffset = hcode.indexOf("MyConst");
soffset = scode.indexOf("MyConst");
decl = testF3(file, soffset + 2);
def = testF3(hfile, hoffset + 2);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyConst", ((IASTName) decl).toString());
assertEquals(hoffset, ((ASTNode) decl).getOffset());
assertEquals(7, ((ASTNode) decl).getLength());
assertEquals("MyConst", ((IASTName) def).toString());
assertEquals(soffset, def.getFileLocation().getNodeOffset());
assertEquals(7, ((ASTNode) def).getLength());
hoffset = hcode.indexOf("MyFunc");
soffset = scode.indexOf("MyFunc");
decl = testF3(file, soffset + 2);
def = testF3(hfile, hoffset + 2);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyFunc", ((IASTName) decl).toString());
assertEquals(hoffset, ((ASTNode) decl).getOffset());
assertEquals(6, ((ASTNode) decl).getLength());
assertEquals("MyFunc", ((IASTName) def).toString());
assertEquals(soffset, def.getFileLocation().getNodeOffset());
assertEquals(6, ((ASTNode) def).getLength());
hoffset = hcode.indexOf("MyStruct");
soffset = scode.indexOf("MyStruct");
decl = testF3(file, soffset + 2);
def = testF3(hfile, hoffset + 2);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyStruct", ((IASTName) decl).toString());
assertEquals(hoffset, ((ASTNode) decl).getOffset());
assertEquals(8, ((ASTNode) decl).getLength());
assertEquals("MyStruct", ((IASTName) def).toString());
assertEquals(hoffset, def.getFileLocation().getNodeOffset());
assertEquals(8, ((ASTNode) def).getLength());
hoffset = hcode.indexOf("MyClass");
soffset = scode.indexOf("MyClass");
decl = testF3(file, soffset + 2);
def = testF3(hfile, hoffset + 2);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyClass", ((IASTName) decl).toString());
assertEquals(hoffset, ((ASTNode) decl).getOffset());
assertEquals(7, ((ASTNode) decl).getLength());
assertEquals("MyClass", ((IASTName) def).toString());
assertEquals(hoffset, def.getFileLocation().getNodeOffset());
assertEquals(7, ((ASTNode) def).getLength());
}
// // the header
// namespace N {
// template < class T > class AAA { T _t; };
// };
// #include "testBasicTemplateInstance.h"
// N::AAA<int> a;
public void testBasicTemplateInstance_207320() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBasicTemplateInstance.h", hcode);
IFile file = importFile("testBasicTemplateInstance.cpp", scode);
waitUntilFileIsIndexed(index, file);
int hoffset = hcode.indexOf("AAA");
int soffset = scode.indexOf("AAA<int>");
IASTNode decl1 = testF3(file, soffset, 3);
assertTrue(decl1 instanceof IASTName);
assertEquals("AAA", ((IASTName) decl1).toString());
assertEquals(hoffset, decl1.getFileLocation().getNodeOffset());
assertEquals(3, ((ASTNode) decl1).getLength());
IASTNode decl2 = testF3(file, soffset, 8);
assertEquals("AAA", ((IASTName) decl2).toString());
assertEquals(hoffset, decl2.getFileLocation().getNodeOffset());
assertEquals(3, ((ASTNode) decl2).getLength());
}
// // the header
// class X {
// public:
// X(int); // openReferences fails to find the constructor in g()
// };
// #include "testBug86829A.h"
// X f(X);
// void g()
// {
// X b = f(X(2)); // openDeclarations on X(int) shall find constructor
// }
public void testBug86829A() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug86829A.h", hcode);
IFile file = importFile("testBug86829A.cpp", scode);
waitUntilFileIsIndexed(index, file);
int offset = scode.indexOf("X(2)");
int doffset = hcode.indexOf("X(int)");
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("X", ((IASTName) decl).toString());
assertEquals(doffset, decl.getFileLocation().getNodeOffset());
assertEquals(1, ((ASTNode) decl).getLength());
}
// // the header
// class X {
// public:
// operator int();
// };
// class Y {
// public:
// operator X();
// };
// #include "testBug86829B.h"
// void testfunc() {
// Y a;
// int c = X(a); // OK: a.operator X().operator int()
// }
public void _testBug86829B() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug86829B.h", hcode);
IFile file = importFile("testBug86829B.cpp", scode);
waitUntilFileIsIndexed(index, file);
int offset = scode.indexOf("X(a)");
int doffset = hcode.indexOf("X()");
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals(decl.toString(), "X");
assertEquals(doffset, decl.getFileLocation().getNodeOffset());
assertEquals(1, ((ASTNode) decl).getLength());
}
// // the header
// extern int a; // declares
// extern const int c = 1; // defines
// struct S {int a; int b;}; // defines
// struct X { // defines
// int x; // defines nonstatic data member
// static int y; // declares static data member
// X(): x(0) { } // defines a constructor of
// };
// enum E {up, down}; // defines
// namespace N {int d;} // defines
// namespace N1 = N; // defines
// int f(int); // declares
// extern X anotherX; // declares
// #include "testCPPSpecDeclsDefs.h"
// int a; // defines
// int X::y = 1; // defines
// X anX; // defines variable, implicitly calls ctor
// extern const int c; // declares
// int f(int x) {return x+a;} // defines
// struct S; // declares
// typedef int Int; // declares
// using N::d; // declares
// S s;
// Int lhs= s.a+s.b+up+down+anX+0;
public void testCPPSpecDeclsDefs() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testCPPSpecDeclsDefs.h", hcode);
IFile file = importFile("testCPPSpecDeclsDefs.cpp", scode);
waitUntilFileIsIndexed(index, file);
int offset0 = hcode.indexOf("a;");
int offset1 = scode.indexOf("a;");
IASTNode decl = testF3(hfile, offset0);
assertNode("a", offset1, decl);
decl = testF3(file, offset1);
assertNode("a", offset0, decl);
offset0 = hcode.indexOf("int c") + 4;
offset1 = scode.indexOf("int c") + 4;
decl = testF3(hfile, offset0);
assertNode("c", offset1, decl);
decl = testF3(file, offset1);
assertNode("c", offset0, decl);
offset0 = hcode.indexOf("f(int");
offset1 = scode.indexOf("f(int");
decl = testF3(hfile, offset0);
assertNode("f", offset1, decl);
decl = testF3(file, offset1);
assertNode("f", offset0, decl);
offset0 = scode.indexOf("x)");
decl = testF3(file, offset0);
assertNode("x", offset0, decl);
offset1 = scode.indexOf("x+a");
decl = testF3(file, offset1);
assertNode("x", offset0, decl);
offset0 = scode.indexOf("a;");
offset1 = scode.indexOf("a;}");
decl = testF3(file, offset1);
assertNode("a", offset0, decl);
offset0 = hcode.indexOf("S");
offset1 = scode.indexOf("S;");
int offset2 = scode.indexOf("S", offset1);
decl = testF3(hfile, offset0);
assertNode("S", offset0, decl);
decl = testF3(file, offset1);
assertNode("S", offset0, decl);
decl = testF3(file, offset2);
assertNode("S", offset0, decl);
offset0 = hcode.indexOf("a; int b;};");
offset1 = scode.indexOf("a+s.b");
decl = testF3(hfile, offset0);
assertNode("a", offset0, decl);
decl = testF3(file, offset1);
assertNode("a", offset0, decl);
offset0 = hcode.indexOf("b;};");
offset1 = scode.indexOf("s.b") + 2;
decl = testF3(hfile, offset0);
assertNode("b", offset0, decl);
decl = testF3(file, offset1);
assertNode("b", offset0, decl);
offset0 = hcode.indexOf("X");
offset1 = scode.indexOf("X");
offset2 = scode.indexOf("X", offset1 + 1);
decl = testF3(hfile, offset0);
assertNode("X", offset0, decl);
decl = testF3(file, offset1);
assertNode("X", offset0, decl);
decl = testF3(file, offset2);
assertNode("X", offset0, decl);
offset0 = hcode.indexOf("x;");
offset1 = hcode.indexOf("x", offset0 + 1);
decl = testF3(hfile, offset0);
assertNode("x", offset0, decl);
decl = testF3(hfile, offset1);
assertNode("x", offset0, decl);
offset0 = hcode.indexOf("y;");
offset1 = scode.indexOf("y");
decl = testF3(hfile, offset0);
assertNode("y", offset1, decl);
decl = testF3(file, offset1);
assertNode("y", offset0, decl);
offset0 = hcode.indexOf("X()");
decl = testF3(hfile, offset0);
assertNode("X", offset0, decl);
offset0 = hcode.indexOf("up");
offset1 = scode.indexOf("up");
decl = testF3(hfile, offset0);
assertNode("up", offset0, decl);
decl = testF3(file, offset1);
assertNode("up", offset0, decl);
offset0 = hcode.indexOf("down");
offset1 = scode.indexOf("down");
decl = testF3(hfile, offset0);
assertNode("down", offset0, decl);
decl = testF3(file, offset1);
assertNode("down", offset0, decl);
offset0 = hcode.indexOf("N");
offset1 = hcode.indexOf("N;", offset0 + 1);
offset2 = scode.indexOf("N");
decl = testF3(hfile, offset0);
assertNode("N", offset0, decl);
decl = testF3(hfile, offset1);
assertNode("N", offset0, decl);
decl = testF3(file, offset2);
assertNode("N", offset0, decl);
offset0 = hcode.indexOf("d;");
offset1 = scode.indexOf("d;");
decl = testF3(hfile, offset0);
assertNode("d", offset0, decl);
// does not work, created separate testcase
// decl= testF3(file, offset1);
// assertNode("d", offset0, decl);
offset0 = hcode.indexOf("N1");
decl = testF3(hfile, offset0);
assertNode("N1", offset0, decl);
offset0 = scode.indexOf("anX");
offset1 = scode.indexOf("anX", offset0 + 1);
decl = testF3(file, offset0);
assertNode("X", hcode.indexOf("X()"), decl);
decl = testF3(file, offset1);
assertNode("anX", offset0, decl);
offset0 = scode.indexOf("Int");
offset1 = scode.indexOf("Int", offset0 + 1);
decl = testF3(file, offset0);
assertNode("Int", offset0, decl);
decl = testF3(file, offset1);
assertNode("Int", offset0, decl);
}
// // the header
// namespace N {int d;} // defines
// #include "testBug168533.h"
// using N::d; // declares
// int a= d;
public void testBug168533() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug168533.h", hcode);
IFile file = importFile("testBug168533.cpp", scode);
waitUntilFileIsIndexed(index, file);
int offset0 = hcode.indexOf("d;");
int offset1 = scode.indexOf("d;");
int offset2 = scode.indexOf("d", offset1);
IASTNode decl = testF3(hfile, offset0);
assertNode("d", offset0, decl);
decl = testF3(file, offset1);
assertNode("d", offset0, decl);
decl = testF3(file, offset2);
assertNode("d", offset0, decl);
}
// class Overflow {
// public:
// Overflow(char,double,double);
// };
// #include "testBug95225.h"
// void f(double x) {
// throw Overflow('+',x,3.45e107);
// }
// int foo() {
// try {
// f(1.2);
// }
// catch(Overflow& oo) {
// // handle exceptions of type Overflow here
// }
// }
public void testBug95225() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug95225.h", hcode);
IFile file = importFile("testBug95225.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("Overflow");
offset1 = scode.indexOf("rflow&");
decl = testF3(file, offset1);
assertNode("Overflow", offset0, decl);
decl = testF3(hfile, offset0);
assertNode("Overflow", offset0, decl);
offset0 = hcode.indexOf("Overflow(");
offset1 = scode.indexOf("rflow('+'");
decl = testF3(file, offset1);
assertNode("Overflow", offset0, decl);
decl = testF3(hfile, offset0);
assertNode("Overflow", offset0, decl);
offset0 = scode.indexOf("x");
offset1 = scode.indexOf("x", offset0);
decl = testF3(file, offset0);
assertNode("x", offset0, decl);
decl = testF3(file, offset1);
assertNode("x", offset0, decl);
}
// struct A { }; // implicitly declared A::operator=
// struct B : A {
// B& operator=(const B &);
// };
// #include "testBug95202.h"
// B& B::operator=(const B& s) {
// this->B::operator=(s); // wellformed
// return *this;
// }
public void testBug95202() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug95202.h", hcode);
IFile file = importFile("testBug95202.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = scode.indexOf("s)");
offset1 = scode.indexOf("s);", offset0 + 1);
decl = testF3(file, offset0);
assertNode("s", offset0, decl);
decl = testF3(file, offset1);
assertNode("s", offset0, decl);
}
// extern int abc;
// #include "testBug101287.h"
// int main(int argc, char **argv) {
// abc;
// }
public void testBug101287() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug101287.h", hcode);
IFile file = importFile("testBug101287.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("abc");
offset1 = scode.indexOf("abc");
decl = testF3(hfile, offset0);
assertNode("abc", offset0, decl);
decl = testF3(file, offset1);
assertNode("abc", offset0, decl);
}
// struct RTBindingEnd
// {
// int index;
// };
// #include "testBug102258.h"
// void f(RTBindingEnd & end) {
// }
public void testBug102258() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug102258.h", hcode);
IFile file = importFile("testBug102258.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("RTBindingEnd");
offset1 = scode.indexOf("RTBindingEnd");
decl = testF3(hfile, offset0);
assertNode("RTBindingEnd", offset0, decl);
decl = testF3(file, offset1);
assertNode("RTBindingEnd", offset0, decl);
}
// namespace foo {
// int g() {
// return 0;
// }
// }
// #include "testBug103323.h"
// int f() {
// return foo::g();
// }
public void testBug103323() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug103323.h", hcode);
IFile file = importFile("testBug103323.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("g()");
offset1 = scode.indexOf("g()");
decl = testF3(hfile, offset0);
assertNode("g", offset0, decl);
decl = testF3(file, offset1);
assertNode("g", offset0, decl);
testSimple_Ctrl_G_Selection(file, offset1, 1, 1);
}
// typedef int TestTypeOne;
// typedef int TestTypeTwo;
// #include "testBug78354.h"
// int main()
// {
// TestTypeOne myFirstLink = 5;
// TestTypeTwo mySecondLink = 6;
// return 0;
// }
public void testBug78354() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug78354.h", hcode);
IFile file = importFile("testBug78354.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("TestTypeOne");
offset1 = scode.indexOf("TestTypeOne");
decl = testF3(hfile, offset0);
assertNode("TestTypeOne", offset0, decl);
decl = testF3(file, offset1);
assertNode("TestTypeOne", offset0, decl);
offset0 = hcode.indexOf("TestTypeTwo");
offset1 = scode.indexOf("TestTypeTwo");
decl = testF3(hfile, offset0);
assertNode("TestTypeTwo", offset0, decl);
decl = testF3(file, offset1);
assertNode("TestTypeTwo", offset0, decl);
}
// int x;
// #include "testBug103697.h"
// int foo() {
// return x;
// }
public void testBug103697() throws Exception {
if (System.getProperty("cdt.skip.known.test.failures") == null) {
return;
}
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFileWithLink("testBug103697.h", hcode);
IFile file = importFileWithLink("testBug103697.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("x");
offset1 = scode.indexOf("x");
decl = testF3(hfile, offset0);
assertNode("x", offset0, decl);
decl = testF3(file, offset1);
assertNode("x", offset0, decl);
}
// class __attribute__((visibility("default"))) FooClass
// {
// int foo();
// };
// #include "testBug108202.h"
// int FooClass::foo() {
// return 0;
// }
public void testBug108202() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug108202.h", hcode);
IFile file = importFile("testBug108202.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("foo");
offset1 = scode.indexOf("foo");
decl = testF3(hfile, offset0);
assertNode("foo", offset1, decl);
decl = testF3(file, offset1);
assertNode("foo", offset0, decl);
}
// void c();
// #include "c.h"
// void c() {}
// void cpp();
// #include "cpp.h"
// void cpp() {}
public void testCNavigationInCppProject_bug183973() throws Exception {
StringBuilder[] buffers = getContents(4);
String hccode = buffers[0].toString();
String ccode = buffers[1].toString();
String hcppcode = buffers[2].toString();
String cppcode = buffers[3].toString();
IFile hcfile = importFile("c.h", hccode);
IFile cfile = importFile("c.c", ccode);
IFile hcppfile = importFile("cpp.h", hcppcode);
IFile cppfile = importFile("cpp.cpp", cppcode);
CCorePlugin.getIndexManager().reindex(fCProject);
waitForIndexer(fCProject);
IASTNode decl;
int offset0, offset1;
// cpp navigation
offset0 = hcppcode.indexOf("cpp(");
offset1 = cppcode.indexOf("cpp(");
decl = testF3(hcppfile, offset0);
assertNode("cpp", offset1, decl);
decl = testF3(cppfile, offset1);
assertNode("cpp", offset0, decl);
// plain-c navigation
offset0 = hccode.indexOf("c(");
offset1 = ccode.indexOf("c(");
decl = testF3(hcfile, offset0);
assertNode("c", offset1, decl);
decl = testF3(cfile, offset1);
assertNode("c", offset0, decl);
}
// typedef struct {
// int a;
// } usertype;
// void func(usertype t);
// #include "testBug190730.h"
// void func(usertype t) {
// }
public void testFuncWithTypedefForAnonymousStruct_190730() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug190730.h", hcode);
IFile file = importFile("testBug190730.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("func");
offset1 = scode.indexOf("func");
decl = testF3(hfile, offset0);
assertNode("func", offset1, decl);
decl = testF3(file, offset1);
assertNode("func", offset0, decl);
}
// typedef enum {
// int eitem
// } userEnum;
// void func(userEnum t);
// #include "testBug190730_2.h"
// void func(userEnum t) {
// }
public void testFuncWithTypedefForAnonymousEnum_190730() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testBug190730_2.h", hcode);
IFile file = importFile("testBug190730_2.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("func");
offset1 = scode.indexOf("func");
decl = testF3(hfile, offset0);
assertNode("func", offset1, decl);
decl = testF3(file, offset1);
assertNode("func", offset0, decl);
}
// #define MY_MACRO 0xDEADBEEF
// #define MY_FUNC() 00
// #define MY_PAR( aRef );
// #include "macrodef.h"
// int basictest(void){
// int tester = MY_MACRO; //OK: F3 works
// int xx= MY_FUNC();
// MY_PAR(0);
// }
public void testMacroNavigation() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("macrodef.h", hcode);
IFile file = importFile("macronavi.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("MY_MACRO");
offset1 = scode.indexOf("MY_MACRO");
decl = testF3(file, offset1);
assertNode("MY_MACRO", offset0, decl);
offset0 = hcode.indexOf("MY_FUNC");
offset1 = scode.indexOf("MY_FUNC");
decl = testF3(file, offset1);
assertNode("MY_FUNC", offset0, decl);
offset0 = hcode.indexOf("MY_PAR");
offset1 = scode.indexOf("MY_PAR");
decl = testF3(file, offset1);
assertNode("MY_PAR", offset0, decl);
}
// #define MY_MACRO 0xDEADBEEF
// #define MY_PAR( aRef ) aRef;
// int gvar;
// #include "macrodef.h"
// int basictest(void){
// int tester = MY_PAR(MY_MACRO);
// tester= MY_PAR(gvar);
// }
public void testMacroNavigation_Bug208300() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("macrodef.h", hcode);
IFile file = importFile("macronavi.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset0 = hcode.indexOf("MY_PAR");
offset1 = scode.indexOf("MY_PAR");
decl = testF3(file, offset1);
assertNode("MY_PAR", offset0, decl);
offset0 = hcode.indexOf("MY_MACRO");
offset1 = scode.indexOf("MY_MACRO");
decl = testF3(file, offset1);
assertNode("MY_MACRO", offset0, decl);
offset0 = hcode.indexOf("gvar");
offset1 = scode.indexOf("gvar");
decl = testF3(file, offset1);
assertNode("gvar", offset0, decl);
}
// #define MYMACRO
// #undef MYMACRO
public void testUndef_312399() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testUndef_312399.h", hcode);
IFile file = importFile("testUndef_312399.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode target = testF3(file, scode.indexOf("MYMACRO"));
assertTrue(target instanceof IASTName);
assertEquals("MYMACRO", ((IASTName) target).toString());
assertEquals(hcode.indexOf("MYMACRO"), target.getFileLocation().getNodeOffset());
assertEquals("MYMACRO".length(), ((ASTNode) target).getLength());
}
// int wurscht;
// #include "aheader.h"
public void testIncludeNavigation() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("aheader.h", hcode);
IFile file = importFile("includenavi.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset0, offset1;
offset1 = scode.indexOf("aheader.h");
testF3(file, offset1);
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
IEditorInput input = part.getEditorInput();
assertEquals("aheader.h", ((FileEditorInput) input).getFile().getName());
}
// void cfunc();
// void cxcpp() {
// cfunc();
// }
// extern "C" void cxcpp();
// void cppfunc() {
// cxcpp();
// }
public void testNavigationCppCallsC() throws Exception {
StringBuilder[] buffers = getContents(2);
String ccode = buffers[0].toString();
String scode = buffers[1].toString();
IFile cfile = importFile("s.c", ccode);
IFile cppfile = importFile("s.cpp", scode);
waitUntilFileIsIndexed(index, cppfile);
IASTNode decl;
int offset1, offset2;
offset1 = scode.indexOf("cxcpp");
offset2 = scode.indexOf("cxcpp", offset1 + 1);
testF3(cppfile, offset1);
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
IEditorInput input = part.getEditorInput();
assertEquals("s.c", ((FileEditorInput) input).getFile().getName());
testF3(cppfile, offset2);
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
input = part.getEditorInput();
assertEquals("s.c", ((FileEditorInput) input).getFile().getName());
offset1 = ccode.indexOf("cxcpp");
testF3(cfile, offset1);
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
input = part.getEditorInput();
assertEquals("s.cpp", ((FileEditorInput) input).getFile().getName());
}
// void cxcpp();
// void cfunc() {
// cxcpp();
// }
// void cppfunc() {}
// extern "C" {void cxcpp() {
// cppfunc();
// }}
public void testNavigationCCallsCpp() throws Exception {
StringBuilder[] buffers = getContents(2);
String ccode = buffers[0].toString();
String scode = buffers[1].toString();
IFile cfile = importFile("s.c", ccode);
IFile cppfile = importFile("s.cpp", scode);
waitUntilFileIsIndexed(index, cppfile);
IASTNode decl;
int offset1, offset2;
offset1 = ccode.indexOf("cxcpp");
offset2 = ccode.indexOf("cxcpp", offset1 + 1);
testF3(cfile, offset1);
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
IEditorInput input = part.getEditorInput();
assertEquals("s.cpp", ((FileEditorInput) input).getFile().getName());
testF3(cfile, offset2);
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
input = part.getEditorInput();
assertEquals("s.cpp", ((FileEditorInput) input).getFile().getName());
offset1 = scode.indexOf("cxcpp");
testF3(cppfile, offset1);
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
input = part.getEditorInput();
assertEquals("s.c", ((FileEditorInput) input).getFile().getName());
}
// #define ADD_TEXT(txt1,txt2) txt1" "txt2
// #define ADD(a,b) (a + b)
// void main(void) {
// #if defined(ADD_TEXT) && defined(ADD)
// #endif
// }
public void testNavigationInDefinedExpression_215906() throws Exception {
StringBuilder[] buffers = getContents(1);
String code = buffers[0].toString();
IFile file = importFile("s.cpp", code);
waitUntilFileIsIndexed(index, file);
IASTNode decl;
int offset1, offset2;
offset1 = code.indexOf("ADD_TEXT");
offset2 = code.indexOf("ADD_TEXT", offset1 + 1);
decl = testF3(file, offset2);
assertNode("ADD_TEXT", offset1, decl);
offset1 = code.indexOf("ADD", offset1 + 1);
offset2 = code.indexOf("ADD", offset2 + 1);
decl = testF3(file, offset2);
assertNode("ADD", offset1, decl);
}
// struct X {
// int operator +(X);
// int operator [](int);
// ~X();
// };
//
// int test(X x) {
// x + x;
// x[6];
// X* xx = new X();
// delete xx;
// }
public void testNavigationToImplicitNames() throws Exception {
StringBuilder[] buffers = getContents(1);
String code = buffers[0].toString();
IFile file = importFile("in.cpp", code);
waitUntilFileIsIndexed(index, file);
int offset1 = code.indexOf("operator +");
int offset2 = code.indexOf("+ x;");
IASTNode decl = testF3(file, offset2);
assertNode("operator +", offset1, decl);
decl = testF3(file, offset2 + 1);
assertNode("operator +", offset1, decl);
offset1 = code.indexOf("operator []");
offset2 = code.indexOf("[6];");
decl = testF3(file, offset2 + 1);
assertNode("operator []", offset1, decl);
offset2 = code.indexOf("];");
decl = testF3(file, offset2);
assertNode("operator []", offset1, decl);
decl = testF3(file, offset2 + 1);
assertNode("operator []", offset1, decl);
offset1 = code.indexOf("~X()");
offset2 = code.indexOf("delete");
decl = testF3(file, offset2);
assertNode("~X", offset1, decl);
}
// template<typename T>
// class C {
// public:
// T operator+(int);
// };
// #include "test.h"
// void main() {
// C<char> a;
// a + 2;
// }
public void testBug272744() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("test.h", hcode);
IFile file = importFile("test.cpp", scode);
waitUntilFileIsIndexed(index, file);
int hoffset = hcode.indexOf("operator+");
int soffset = scode.indexOf("+");
IASTNode def = testF3(file, soffset + 1);
assertTrue(def instanceof IASTName);
assertEquals("operator +", ((IASTName) def).toString());
assertEquals(hoffset, ((ASTNode) def).getOffset());
assertEquals(9, ((ASTNode) def).getLength());
}
// void test(ABC* p);
// void test(ABC* q) {}
// void call_test(){
// test(0);
// }
public void testBug305487() throws Exception {
String code = getAboveComment();
IFile file = importFile("testBug305487.cpp", code);
waitUntilFileIsIndexed(index, file);
int offset = code.indexOf("test(0)");
IASTNode def = testF3(file, offset + 1);
assertTrue(def instanceof IASTName);
}
// struct A {
// A();
// A(int x);
// };
// #include "testImplicitConstructorCall_248855.h"
// void func() {
// A a1;
// A a2(5);
// }
// struct B {
// B() : a3(1) {}
// A a3;
// };
public void testImplicitConstructorCall_248855() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("testImplicitConstructorCall_248855.h", hcode);
IFile file = importFile("testImplicitConstructorCall_248855.cpp", scode);
waitUntilFileIsIndexed(index, file);
IASTNode target = testF3(file, scode.indexOf("a1"));
assertTrue(target instanceof IASTName);
assertEquals("A", ((IASTName) target).toString());
assertEquals(hcode.indexOf("A()"), target.getFileLocation().getNodeOffset());
assertEquals("A".length(), ((ASTNode) target).getLength());
target = testF3(file, scode.indexOf("a2"));
assertTrue(target instanceof IASTName);
assertEquals("A", ((IASTName) target).toString());
assertEquals(hcode.indexOf("A(int x)"), target.getFileLocation().getNodeOffset());
assertEquals("A".length(), ((ASTNode) target).getLength());
try {
target = testF3(file, scode.indexOf("a3"));
fail("Didn't expect navigation to succeed due to multiple choices: B::a3, A::A(int x).");
} catch (RuntimeException e) {
assertEquals("ambiguous input: 2", e.getMessage());
}
}
// namespace ns {
// void func();
// }
// #include "test.h"
// using ns::func;
//
// void test() {
// func();
// }
public void testBug380197() throws Exception {
StringBuilder[] buffers = getContents(2);
String hcode = buffers[0].toString();
String scode = buffers[1].toString();
IFile hfile = importFile("test.h", hcode);
IFile file = importFile("test.cpp", scode);
waitUntilFileIsIndexed(index, file);
int hoffset = hcode.indexOf("func");
int offset = scode.indexOf("func()");
IASTNode def = testF3(file, offset + 1);
assertTrue(def instanceof IASTName);
assertEquals("func", def.toString());
IASTFileLocation location = def.getFileLocation();
assertEquals(hfile.getLocation().toOSString(), location.getFileName());
assertEquals(hoffset, location.getNodeOffset());
}
// int waldo(int a, decltype(a) b);
public void testFunctionParameterReferencingPreviousParameter_432703() throws Exception {
String code = getAboveComment();
IFile file = importFile("test.cpp", code);
waitUntilFileIsIndexed(index, file);
int offset = code.indexOf("a)");
IASTNode def = testF3(file, offset + 1);
assertTrue(def instanceof IASTName);
}
// #define WALDO 42
// #define WALDO 98
// #include "a.hpp"
// int x = WALDO;
public void testTwoMacrosWithSameName_440940() throws Exception {
StringBuilder[] buffers = getContents(3);
String aHpp = buffers[0].toString();
String bHpp = buffers[1].toString();
String cpp = buffers[2].toString();
IFile aHppFile = importFile("a.hpp", aHpp);
IFile bHppFile = importFile("b.hpp", bHpp);
IFile cppFile = importFile("test.cpp", cpp);
waitUntilFileIsIndexed(index, cppFile);
IASTNode result = testF3(cppFile, cpp.indexOf("WALDO") + 1);
assertTrue(result instanceof IASTName);
IBinding binding = ((IASTName) result).resolveBinding();
assertTrue(binding instanceof IMacroBinding);
String expansion = new String(((IMacroBinding) binding).getExpansion());
assertTrue(expansion.contains("42"));
}
// #define DEFINE_FUNC(...) void foo() { __VA_ARGS__ }
// struct Waldo {
// void find();
// };
// DEFINE_FUNC
// (
// Waldo waldo;
// waldo.find();
// )
public void testDeclarationInMacroArgment_509733() throws Exception {
String code = getAboveComment();
IFile file = importFile("test.cpp", code);
waitUntilFileIsIndexed(index, file);
int offset = code.indexOf("waldo.find()");
IASTNode def = testF3(file, offset + 1);
assertTrue(def instanceof IASTName);
}
// class Waldo {
// void find();
// };
// #include "test.hpp"
// int Waldo::find() {}
public void testNavigationToDefinitionWithWrongSignature_525739() throws Exception {
StringBuilder[] buffers = getContents(3);
String hpp = buffers[0].toString();
String cpp = buffers[1].toString();
IFile hppFile = importFile("test.hpp", hpp);
IFile cppFile = importFile("test.cpp", cpp);
waitUntilFileIsIndexed(index, cppFile);
// We should find the definition, even though the signature doesn't match exactly.
IASTNode target = testF3(hppFile, hpp.indexOf("void find") + 6);
assertInstance(target, IASTName.class);
assertEquals(IASTNameOwner.r_definition, ((IASTName) target).getRoleOfName(false));
}
// class Waldo {
// void find();
// };
// #include "test.hpp"
// void Waldo::find() {}
// int Waldo::find() {}
public void testNavigationPrefersCorrectDefinition_525739() throws Exception {
StringBuilder[] buffers = getContents(3);
String hpp = buffers[0].toString();
String cpp = buffers[1].toString();
IFile hppFile = importFile("test.hpp", hpp);
IFile cppFile = importFile("test.cpp", cpp);
waitUntilFileIsIndexed(index, cppFile);
// We should find the definition that's an exact match, rather than asking the
// user to disambiguate between two alternatives.
IASTNode target = testF3(hppFile, hpp.indexOf("void find") + 6);
assertInstance(target, IASTName.class);
assertEquals(IASTNameOwner.r_definition, ((IASTName) target).getRoleOfName(false));
}
// template <typename E>
// struct Node {
// Node * next;
// E value;
// };
// Node<int> head{nullptr, 42};
// auto [h, v] = head;
// #include "SBTestHeader.hpp"
// auto myH = h;
// auto myV = v;
public void testNavigationToStructuredBinding_522200() throws Exception {
StringBuilder[] buffers = getContents(2);
String header = buffers[0].toString();
IFile headerFile = importFile("SBTestHeader.hpp", header);
String source = buffers[1].toString();
IFile sourceFile = importFile("SBTestSource.cpp", source);
waitUntilFileIsIndexed(index, sourceFile);
IASTNode targetH = testF3(sourceFile, source.indexOf("myH = h") + 6);
assertInstance(targetH, IASTName.class);
assertEquals(IASTNameOwner.r_definition, ((IASTName) targetH).getRoleOfName(false));
IASTFileLocation locationH = targetH.getFileLocation();
int targetHOffset = locationH.getNodeOffset();
assertEquals(header.indexOf("auto [h") + 6, targetHOffset);
IASTNode targetV = testF3(sourceFile, source.indexOf("myV = v") + 6);
assertInstance(targetV, IASTName.class);
assertEquals(IASTNameOwner.r_definition, ((IASTName) targetV).getRoleOfName(false));
IASTFileLocation locationV = targetV.getFileLocation();
int targetVOffset = locationV.getNodeOffset();
assertEquals(header.indexOf("[h, v") + 4, targetVOffset);
}
}