| /******************************************************************************* |
| * 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()); |
| } |
| } |