blob: f8928828f084e9db06558b095602c28207383eb0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 IBM Corporation 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:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Nathan Ridge
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text.selection;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import org.eclipse.cdt.core.dom.IPDOMManager;
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.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.ui.search.actions.OpenDeclarationsAction;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
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.core.runtime.Path;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* 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 CSelectionNoIndexerTests extends BaseSelectionTests {
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;
void initProject() {
if (project != null) {
return;
}
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
monitor = new NullProgressMonitor();
workspace = ResourcesPlugin.getWorkspace();
try {
cPrj = CProjectHelper.createCProject("CSelectionTestsNoIndexerProject", "bin", IPDOMManager.ID_NO_INDEXER); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject();
} catch (CoreException e) {
/*boo*/
}
if (project == null)
fail("Unable to create project"); //$NON-NLS-1$
//Create file manager
fileManager = new FileManager();
}
public CSelectionNoIndexerTests() {
super();
}
/**
* @param name
*/
public CSelectionNoIndexerTests(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite(CSelectionNoIndexerTests.class);
suite.addTest(new CSelectionNoIndexerTests("cleanupProject")); //$NON-NLS-1$
return suite;
}
@Override
protected void setUp() throws Exception {
super.setUp();
OpenDeclarationsAction.sDisallowAmbiguousInput = true;
initProject();
}
public void cleanupProject() throws Exception {
try {
closeAllEditors();
CProjectHelper.delete(cPrj);
project = null;
} finally {
project = null;
}
}
@Override
protected void tearDown() throws Exception {
if (project == null || !project.exists())
return;
closeAllEditors();
IResource[] members = project.members();
for (IResource member : members) {
if (member.getName().equals(".project") || member.getName().equals(".cproject")) //$NON-NLS-1$ //$NON-NLS-2$
continue;
if (member.getName().equals(".settings"))
continue;
try {
member.delete(true, 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 IFile importFileWithLink(String fileName, String contents) throws Exception {
//Obtain file handle
IFile file = project.getProject().getFile(fileName);
IPath location = new Path(project.getLocation().removeLastSegments(1).toOSString() + File.separator + fileName);
File linkFile = new File(location.toOSString());
if (!linkFile.exists()) {
linkFile.createNewFile();
}
file.createLink(location, IResource.ALLOW_MISSING_LOCAL, null);
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 IFile importFileInsideLinkedFolder(String fileName, String contents, String folderName) throws Exception {
IFolder linkedFolder = project.getFolder(folderName);
IPath folderLocation = new Path(
project.getLocation().toOSString() + File.separator + folderName + "_this_is_linked"); //$NON-NLS-1$
IFolder actualFolder = project.getFolder(folderName + "_this_is_linked"); //$NON-NLS-1$
if (!actualFolder.exists())
actualFolder.create(true, true, monitor);
linkedFolder.createLink(folderLocation, IResource.NONE, monitor);
actualFolder.delete(true, false, monitor);
IFile file = linkedFolder.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 IFile importFileWithLink(String fileName, String contents, IFolder folder) throws Exception {
if (!folder.exists())
folder.create(true, true, null);
//Obtain file handle
IFile file = project.getProject().getFile(fileName);
IPath location = new Path(folder.getLocation().toOSString() + File.separator + fileName);
File linkFile = new File(location.toOSString());
if (!linkFile.exists()) {
linkFile.createNewFile();
}
file.createLink(location, IResource.ALLOW_MISSING_LOCAL, null);
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 IFolder importFolder(String folderName) throws Exception {
IFolder folder = project.getProject().getFolder(folderName);
//Create file input stream
if (!folder.exists())
folder.create(false, false, monitor);
return folder;
}
public void testBasicDefinition() throws Exception {
StringBuilder buffer = new StringBuilder();
buffer.append("extern int MyInt; // def is in another file \n"); //$NON-NLS-1$
buffer.append("extern const int MyConst; // def 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(" \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") + 2; //$NON-NLS-1$
int defOffset = code.indexOf("MyInt", offset) + 2; //$NON-NLS-1$
IASTNode def = testF3(file, offset);
IASTNode decl = testF3(file, defOffset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyInt", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(11, ((ASTNode) decl).getOffset());
assertEquals(5, ((ASTNode) decl).getLength());
assertEquals("MyInt", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(330, ((ASTNode) def).getOffset());
assertEquals(5, ((ASTNode) def).getLength());
offset = code.indexOf("MyConst") + 2;
defOffset = code.indexOf("MyConst", offset) + 2;
def = testF3(file, offset);
decl = testF3(file, defOffset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyConst", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(69, ((ASTNode) decl).getOffset());
assertEquals(7, ((ASTNode) decl).getLength());
assertEquals("MyConst", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(354, ((ASTNode) def).getOffset());
assertEquals(7, ((ASTNode) def).getLength());
offset = code.indexOf("MyFunc") + 2;
defOffset = code.indexOf("MyFunc", offset) + 2;
def = testF3(file, offset);
decl = testF3(file, defOffset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyFunc", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(115, ((ASTNode) decl).getOffset());
assertEquals(6, ((ASTNode) decl).getLength());
assertEquals("MyFunc", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(373, ((ASTNode) def).getOffset());
assertEquals(6, ((ASTNode) def).getLength());
offset = code.indexOf("MyStruct") + 2;
defOffset = code.indexOf("MyStruct", offset) + 2;
def = testF3(file, offset);
decl = testF3(file, defOffset);
assertTrue(def instanceof IASTName);
assertTrue(decl instanceof IASTName);
assertEquals("MyStruct", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(417, ((ASTNode) decl).getOffset());
assertEquals(8, ((ASTNode) decl).getLength());
assertEquals("MyStruct", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(417, ((ASTNode) def).getOffset());
assertEquals(8, ((ASTNode) def).getLength());
}
// 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 {
StringBuilder buffer = new StringBuilder();
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(" \n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append(" "); //$NON-NLS-1$
buffer.append("enum { up, down }; // defines up and down\n"); //$NON-NLS-1$
buffer.append(" \n"); //$NON-NLS-1$
buffer.append(" \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 y); // declar 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 decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("a", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(512, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("c = 1; // defines c"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("c", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(546, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("f(int x) { return x+a; } // defines f and defines x"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("f", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(567, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("x) { return x+a; } // defines f and defines x"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("x", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(67, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("x+a; } // defines f and defines x"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("x", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(67, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("x+a; } // defines f and defines x"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("x", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(67, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("a; } // defines f and defines x"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("a", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(4, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("S { int a; int b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("S", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(120, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("a; int b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("a", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(128, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("b; }; // defines S, S::a, and S::b"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("b", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(135, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("X { // defines X"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("X", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(177, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("x; // defines nonstatic data member x"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("x", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(198, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
offset = code.indexOf("up, down }; // defines up and down"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("up", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(367, ((ASTNode) decl).getOffset());
assertEquals(2, ((ASTNode) decl).getLength());
offset = code.indexOf("down }; // defines up and down"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("down", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(371, ((ASTNode) decl).getOffset());
assertEquals(4, ((ASTNode) decl).getLength());
IASTNode def;
offset = code.indexOf("X anX; // defines anX"); //$NON-NLS-1$
def = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertEquals("X", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(177, ((ASTNode) def).getOffset());
assertEquals(1, ((ASTNode) def).getLength());
offset = code.indexOf("anX; // defines anX"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("anX", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(481, ((ASTNode) decl).getOffset());
assertEquals(3, ((ASTNode) decl).getLength());
offset = code.indexOf("a; // declares a"); //$NON-NLS-1$
def = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertEquals("a", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(4, ((ASTNode) def).getOffset());
assertEquals(1, ((ASTNode) def).getLength());
offset = code.indexOf("c; // declares c"); //$NON-NLS-1$
def = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertEquals("c", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(37, ((ASTNode) def).getOffset());
assertEquals(1, ((ASTNode) def).getLength());
offset = code.indexOf("f(int y); // declar f"); //$NON-NLS-1$
def = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertEquals("f", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(61, ((ASTNode) def).getOffset());
assertEquals(1, ((ASTNode) def).getLength());
offset = code.indexOf("S; // declares S"); //$NON-NLS-1$
def = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertEquals("S", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(120, ((ASTNode) def).getOffset());
assertEquals(1, ((ASTNode) def).getLength());
offset = code.indexOf("Int; // declares Int"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("Int", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(625, ((ASTNode) decl).getOffset());
assertEquals(3, ((ASTNode) decl).getLength());
offset = code.indexOf("X anotherX; // declares anotherX"); //$NON-NLS-1$
def = testF3(file, offset);
assertTrue(def instanceof IASTName);
assertEquals("X", ((IASTName) def).toString()); //$NON-NLS-1$
assertEquals(177, ((ASTNode) def).getOffset());
assertEquals(1, ((ASTNode) def).getLength());
offset = code.indexOf("anotherX; // declares anotherX"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("anotherX", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(662, ((ASTNode) decl).getOffset());
assertEquals(8, ((ASTNode) decl).getLength());
}
public void testNoDefinitions() throws Exception {
StringBuilder buffer = new StringBuilder();
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 decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("a1", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(11, ((ASTNode) decl).getOffset());
assertEquals(2, ((ASTNode) decl).getLength());
offset = code.indexOf("c1; // declares c"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("c1", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(46, ((ASTNode) decl).getOffset());
assertEquals(2, ((ASTNode) decl).getLength());
offset = code.indexOf("f1(int); // declares f"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("f1", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(68, ((ASTNode) decl).getOffset());
assertEquals(2, ((ASTNode) decl).getLength());
offset = code.indexOf("S1; // declares S"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("S1", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(98, ((ASTNode) decl).getOffset());
assertEquals(2, ((ASTNode) decl).getLength());
offset = code.indexOf("Int; // declares Int"); //$NON-NLS-1$
decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("Int", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(128, ((ASTNode) decl).getOffset());
assertEquals(3, ((ASTNode) decl).getLength());
}
public void testBug103697() throws Exception {
StringBuilder buffer = new StringBuilder();
buffer.append("int x;\n"); //$NON-NLS-1$
buffer.append("int foo() {\n"); //$NON-NLS-1$
buffer.append(" return x;\n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFileWithLink("testBug103697.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("return x;\n") + "return ".length(); //$NON-NLS-1$ //$NON-NLS-2$
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("x", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(4, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
}
public void testBug76043() throws Exception {
StringBuilder buffer = new StringBuilder();
buffer.append("int x;\n"); //$NON-NLS-1$
buffer.append("int foo() {\n"); //$NON-NLS-1$
buffer.append(" return x;\n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFileInsideLinkedFolder("testBug76043.c", code, "folder"); //$NON-NLS-1$ //$NON-NLS-2$
assertFalse(file.isLinked()); // I'm not sure why the IResource#isLinked() returns false if it's contained within a linked folder
int offset = code.indexOf("return x;\n") + "return ".length(); //$NON-NLS-1$ //$NON-NLS-2$
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("x", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(4, ((ASTNode) decl).getOffset());
assertEquals(1, ((ASTNode) decl).getLength());
}
public void testBug78354() throws Exception {
StringBuilder buffer = new StringBuilder();
buffer.append("typedef int TestTypeOne;\n"); //$NON-NLS-1$
buffer.append("typedef int TestTypeTwo;\n"); //$NON-NLS-1$
buffer.append("int main()\n"); //$NON-NLS-1$
buffer.append("{\n"); //$NON-NLS-1$
buffer.append("TestTypeOne myFirstLink = 5;\n"); //$NON-NLS-1$
buffer.append("TestTypeTwo mySecondLink = 6;\n"); //$NON-NLS-1$
buffer.append("return 0;\n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$
String code = buffer.toString();
IFile file = importFileWithLink("testBug78354.cpp", code); //$NON-NLS-1$
int offset = code.indexOf("TestTypeOne myFirstLink = 5;"); //$NON-NLS-1$
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
assertEquals("TestTypeOne", ((IASTName) decl).toString()); //$NON-NLS-1$
assertEquals(12, ((ASTNode) decl).getOffset());
assertEquals(11, ((ASTNode) decl).getLength());
}
// int myFunc(var)
// int var;
// {
// return var;
// }
//
// int main(void)
// {
// return myFunc(0);
// }
public void testKRstyleFunctions_Bug221635() throws Exception {
String code = getContentsForTest(1)[0].toString();
IFile file = importFile("source.c", code);
int offset = code.indexOf("myFunc(0)");
IASTNode decl = testF3(file, offset);
assertTrue(decl instanceof IASTName);
final IASTName name = (IASTName) decl;
assertTrue(name.isDefinition());
assertEquals("myFunc", name.toString());
}
}