1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Improved robustness of global scope handling.

Change-Id: Id0222766e8c5e258f866f9a4c8b3307a06bdf4c7
This commit is contained in:
Sergey Prigogin 2015-06-08 12:44:29 -07:00
parent e4d106f6d1
commit e27ca67746
34 changed files with 386 additions and 275 deletions

View file

@ -29,8 +29,6 @@ import java.io.StringReader;
import java.util.Arrays;
import java.util.HashSet;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
@ -153,6 +151,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil;
import org.eclipse.cdt.internal.core.parser.ParserException;
import junit.framework.TestSuite;
public class AST2CPPTests extends AST2TestBase {
public AST2CPPTests() {
@ -3408,16 +3408,16 @@ public class AST2CPPTests extends AST2TestBase {
ICPPVariable v2 = (ICPPVariable) col.getName(3).resolveBinding();
String[] s = v1.getQualifiedName();
assertEquals(s[0], "v1");
assertEquals("v1", s[0]);
assertFalse(v1.isGloballyQualified());
s = v2.getQualifiedName();
assertEquals(s[0], "v2");
assertEquals("v2", s[0]);
assertFalse(v2.isGloballyQualified());
ICPPBlockScope scope = (ICPPBlockScope) v2.getScope();
IBinding[] bs = scope.find("v1");
assertEquals(bs.length, 1);
IBinding[] bs = scope.find("v1", tu);
assertEquals(1, bs.length);
assertSame(bs[0], v1);
}
@ -3437,17 +3437,17 @@ public class AST2CPPTests extends AST2TestBase {
ICPPMethod f = (ICPPMethod) col.getName(7).resolveBinding();
IScope scope = f.getFunctionScope();
IBinding[] bs = scope.find("a");
assertEquals(bs.length, 1);
IBinding[] bs = scope.find("a", tu);
assertEquals(1, bs.length);
assertSame(bs[0], a);
bs = scope.find("~B");
assertEquals(bs.length, 1);
bs = scope.find("~B", tu);
assertEquals(1, bs.length);
assertTrue(bs[0] instanceof ICPPMethod);
assertTrue(bs[0].getName().equals("~B"));
bs = scope.find("A");
assertEquals(bs.length, 1);
bs = scope.find("A", tu);
assertEquals(1, bs.length);
assertSame(bs[0], A);
}
@ -3470,16 +3470,16 @@ public class AST2CPPTests extends AST2TestBase {
IASTFunctionDefinition def = (IASTFunctionDefinition) col.getName(5).getParent().getParent();
IScope scope = ((IASTCompoundStatement) def.getBody()).getScope();
IBinding[] bs = scope.find("f");
IBinding[] bs = scope.find("f", tu);
assertEquals(3, bs.length);
assertSame(bs[0], f3);
assertSame(bs[1], f1);
assertSame(bs[2], f2);
String[] s = ((ICPPBinding) bs[1]).getQualifiedName();
assertEquals(s.length, 2);
assertEquals(s[0], "A");
assertEquals(s[1], "f");
assertEquals(2, s.length);
assertEquals("A", s[0]);
assertEquals("f", s[1]);
assertTrue(((ICPPBinding) bs[1]).isGloballyQualified());
}
@ -3508,7 +3508,7 @@ public class AST2CPPTests extends AST2TestBase {
IASTFunctionDefinition def = (IASTFunctionDefinition) col.getName(8).getParent().getParent();
IScope scope = ((IASTCompoundStatement) def.getBody()).getScope();
IBinding[] bs = scope.find("f");
IBinding[] bs = scope.find("f", tu);
assertEquals(3, bs.length);
assertSame(bs[0], f);
assertSame(bs[1], f1);
@ -3533,21 +3533,21 @@ public class AST2CPPTests extends AST2TestBase {
IFunction f1 = (IFunction) col.getName(6).resolveBinding();
IScope classScope= f1.getScope();
assertTrue(classScope instanceof ICPPClassScope);
IBinding[] bindings = classScope.find("bf");
IBinding[] bindings = classScope.find("bf", tu);
ICPPMethod method= extractSingleMethod(bindings);
assertEquals(method.getQualifiedName()[0], "B");
assertEquals("B", method.getQualifiedName()[0]);
bindings= classScope.find("f");
bindings= classScope.find("f", tu);
method= extractSingleMethod(bindings);
assertEquals(method.getQualifiedName()[0], "A");
assertEquals("A", method.getQualifiedName()[0]);
bindings= classScope.find("B");
bindings= classScope.find("B", tu);
ICPPClassType classType= extractSingleClass(bindings);
assertEquals(classType.getQualifiedName()[0], "B");
assertEquals("B", classType.getQualifiedName()[0]);
bindings= classScope.find("A");
bindings= classScope.find("A", tu);
classType= extractSingleClass(bindings);
assertEquals(classType.getQualifiedName()[0], "A");
assertEquals("A", classType.getQualifiedName()[0]);
}
// class A {
@ -3571,39 +3571,39 @@ public class AST2CPPTests extends AST2TestBase {
ICPPMethod fb = (ICPPMethod) col.getName(6).resolveBinding();
Object[] result = B.getDeclaredFields();
assertEquals(result.length, 1);
assertEquals(1, result.length);
assertSame(result[0], b);
result = B.getFields();
assertEquals(result.length, 2);
assertEquals(2, result.length);
assertSame(result[0], b);
assertSame(result[1], a);
result = B.getDeclaredMethods();
assertEquals(result.length, 1);
assertEquals(1, result.length);
assertSame(result[0], fb);
result = B.getAllDeclaredMethods();
assertEquals(result.length, 2);
assertEquals(2, result.length);
assertSame(result[0], fb);
assertSame(result[1], fa);
ICPPMethod[] B_implicit = ((ICPPClassScope) B.getCompositeScope()).getImplicitMethods();
assertEquals(B_implicit.length, 4);
assertEquals(4, B_implicit.length);
assertTrue(B_implicit[0].getName().equals("B"));
assertTrue(B_implicit[1].getName().equals("B"));
assertTrue(B_implicit[2].getName().equals("operator ="));
assertTrue(B_implicit[3].getName().equals("~B"));
ICPPMethod[] A_implicit = ((ICPPClassScope) A.getCompositeScope()).getImplicitMethods();
assertEquals(A_implicit.length, 4);
assertEquals(4, A_implicit.length);
assertTrue(A_implicit[0].getName().equals("A"));
assertTrue(A_implicit[1].getName().equals("A"));
assertTrue(A_implicit[2].getName().equals("operator ="));
assertTrue(A_implicit[3].getName().equals("~A"));
result = B.getMethods();
assertEquals(result.length, 10);
assertEquals(10, result.length);
assertSame(result[0], fb);
assertSame(result[1], B_implicit[0]);
assertSame(result[2], B_implicit[1]);
@ -3617,8 +3617,7 @@ public class AST2CPPTests extends AST2TestBase {
}
public void testBug87424() throws Exception {
IASTTranslationUnit tu = parse(
"int * __restrict x;", CPP, true);
IASTTranslationUnit tu = parse("int * __restrict x;", CPP, true);
NameCollector col = new NameCollector();
tu.accept(col);
@ -3638,8 +3637,7 @@ public class AST2CPPTests extends AST2TestBase {
}
public void testBug87705() throws Exception {
IASTTranslationUnit tu = parse(
"class A { friend class B::C; };", CPP, true);
IASTTranslationUnit tu = parse("class A { friend class B::C; };", CPP, true);
NameCollector col = new NameCollector();
tu.accept(col);
@ -3659,8 +3657,7 @@ public class AST2CPPTests extends AST2TestBase {
}
public void testBug88501_1() throws Exception {
IASTTranslationUnit tu = parse(
"void f(); void f(int); struct f;", CPP);
IASTTranslationUnit tu = parse("void f(); void f(int); struct f;", CPP);
NameCollector col = new NameCollector();
tu.accept(col);
@ -3679,7 +3676,6 @@ public class AST2CPPTests extends AST2TestBase {
// IProblemBinding p = (IProblemBinding) col.getName(1).resolveBinding();
// assertEquals(p.getID(), IProblemBinding.SEMANTIC_INVALID_REDEFINITION);
// }
public void testBug8342_2() throws Exception {
IASTTranslationUnit tu = parse("extern int a; extern char a;", CPP);
NameCollector col = new NameCollector();
@ -3770,7 +3766,7 @@ public class AST2CPPTests extends AST2TestBase {
IFunction f2 = (IFunction) col.getName(3).resolveBinding();
IScope scope = tu.getScope();
IBinding[] bs = scope.find("f");
IBinding[] bs = scope.find("f", tu);
assertEquals(bs.length, 2);
assertSame(bs[0], f1);
assertSame(bs[1], f2);

View file

@ -20,8 +20,6 @@ import static org.eclipse.cdt.core.parser.ParserLanguage.CPP;
import java.io.IOException;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
@ -132,6 +130,8 @@ import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding;
import org.eclipse.cdt.internal.core.model.ASTStringUtil;
import org.eclipse.cdt.internal.core.parser.ParserException;
import junit.framework.TestSuite;
/**
* Test cases on the AST.
*/
@ -3080,8 +3080,7 @@ public class AST2Tests extends AST2TestBase {
}
public void testBug90253() throws Exception {
IASTTranslationUnit tu = parse(
"void f(int par) { int v1; };", C); //$NON-NLS-1$
IASTTranslationUnit tu = parse("void f(int par) { int v1; };", C); //$NON-NLS-1$
NameCollector col = new NameCollector();
tu.accept(col);
@ -3092,11 +3091,11 @@ public class AST2Tests extends AST2TestBase {
IASTFunctionDefinition fdef= getDeclaration(tu, 0);
IScope scope = ((IASTCompoundStatement) fdef.getBody()).getScope();
IBinding[] bs = scope.find("par"); //$NON-NLS-1$
IBinding[] bs = scope.find("par", tu); //$NON-NLS-1$
assertEquals(1, bs.length);
assertSame(bs[0], p);
bs = scope.find("v1"); //$NON-NLS-1$
bs = scope.find("v1", tu); //$NON-NLS-1$
assertEquals(bs.length, 1);
assertSame(bs[0], v1);
}
@ -3123,7 +3122,7 @@ public class AST2Tests extends AST2TestBase {
IASTFunctionDefinition fdef= getDeclaration(tu, 2);
IScope scope = ((IASTCompoundStatement) fdef.getBody()).getScope();
IBinding[] bs = scope.find("S"); //$NON-NLS-1$
IBinding[] bs = scope.find("S", tu); //$NON-NLS-1$
assertNotNull(S2);
assertEquals(bs.length, 3);

View file

@ -6,15 +6,13 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.index.tests;
import java.io.File;
import java.io.FileWriter;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@ -36,6 +34,8 @@ import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import junit.framework.TestSuite;
public class Bug246129 extends IndexTestBase {
public static TestSuite suite() {
@ -45,29 +45,18 @@ public class Bug246129 extends IndexTestBase {
}
private ICProject fProject;
private IFile fSource;
private IFile fSource;
private IFolder fWrapperIncludeFolder;
private IFolder fIncludeFolder;
private File fTmpDir;
private File fExternalWrapperIncludeFolder;
private File fExternalWrapperHeader;
private File fExternalIncludeFolder;
private File fExternalHeader;
private File fExternalExtFolder;
IIndex fIndex;
boolean fFalseFriendsAccepted;
public Bug246129(String name) {
super(name);
}
@ -76,26 +65,22 @@ public class Bug246129 extends IndexTestBase {
protected void setUp() throws Exception {
super.setUp();
if (fProject == null) {
// Populate workspace
fProject = createProject(true, "resources/indexTests/bug246129");
fSource = fProject.getProject().getFile("source.cpp");
fWrapperIncludeFolder = fProject.getProject().getFolder(
"wrapper_include");
fWrapperIncludeFolder = fProject.getProject().getFolder("wrapper_include");
fIncludeFolder = fProject.getProject().getFolder("include");
// Create header files external to the workspace.
fTmpDir = CProjectHelper.freshDir();
fExternalWrapperIncludeFolder = new File(fTmpDir,
"wrapper_include");
fExternalWrapperIncludeFolder = new File(fTmpDir, "wrapper_include");
fExternalWrapperIncludeFolder.mkdir();
fExternalWrapperHeader = new File(
fExternalWrapperIncludeFolder, "external_type.h");
fExternalWrapperHeader = new File(fExternalWrapperIncludeFolder, "external_type.h");
fExternalWrapperHeader.createNewFile();
FileWriter writer = new FileWriter(fExternalWrapperHeader);
writer.write("#ifndef EXTERNAL_WRAPPER_TYPE_H_\n");
@ -105,15 +90,14 @@ public class Bug246129 extends IndexTestBase {
writer.write("};\n");
writer.write("#endif\n");
writer.close();
fExternalIncludeFolder = new File(fTmpDir, "include");
fExternalIncludeFolder.mkdir();
fExternalExtFolder = new File(fExternalIncludeFolder, "ext");
fExternalExtFolder.mkdir();
fExternalHeader = new File(fExternalIncludeFolder,
"external_type.h");
fExternalHeader = new File(fExternalIncludeFolder, "external_type.h");
fExternalHeader.createNewFile();
writer = new FileWriter(fExternalHeader);
writer.write("#ifndef EXTERNAL_TYPE_H_\n");
@ -125,12 +109,10 @@ public class Bug246129 extends IndexTestBase {
// The indexer needs non-empty build info in order to index
// source files if index-all-files is turned off.
IPathEntry[] entries = new IPathEntry[] { CoreModel
.newIncludeEntry(fProject.getPath(), null,
fWrapperIncludeFolder.getLocation()),
CoreModel.newIncludeEntry(fProject.getPath(), null,
fIncludeFolder.getLocation()) };
IPathEntry[] entries = new IPathEntry[] {
CoreModel.newIncludeEntry(fProject.getPath(), null, fWrapperIncludeFolder.getLocation()),
CoreModel.newIncludeEntry(fProject.getPath(), null, fIncludeFolder.getLocation()) };
fProject.setRawPathEntries(entries, npm());
// However, the scanner info provider used by the unit tests
@ -144,12 +126,10 @@ public class Bug246129 extends IndexTestBase {
IndexerPreferences.set(fProject.getProject(),
IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG, "false");
File falseFriendDirectory = new File(fWrapperIncludeFolder
.getLocation().toOSString()
+ "/ext/..");
File falseFriendDirectory = new File(fWrapperIncludeFolder.getLocation().toOSString() + "/ext/..");
fFalseFriendsAccepted = falseFriendDirectory.exists();
CCorePlugin.getIndexManager().reindex(fProject);
waitForIndexer(fProject);
fIndex = CCorePlugin.getIndexManager().getIndex(fProject);
@ -160,27 +140,23 @@ public class Bug246129 extends IndexTestBase {
protected void tearDown() throws Exception {
fExternalWrapperHeader.delete();
fExternalWrapperIncludeFolder.delete();
fExternalHeader.delete();
fExternalExtFolder.delete();
fExternalIncludeFolder.delete();
fTmpDir.delete();
super.tearDown();
}
private void assertSymbolInIndex(String symbolName) throws Exception {
IIndexBinding[] bindings = fIndex.findBindings(
symbolName
.toCharArray(), false, IndexFilter.ALL, npm());
assertTrue(bindings.length > 0);
IIndexBinding[] bindings = fIndex.findBindings(symbolName.toCharArray(), false, IndexFilter.ALL, npm());
assertTrue(bindings.length != 0);
}
public void testIndex() throws Exception {
try {
fIndex.acquireReadLock();
IIndexFile[] indexFiles = fIndex.getAllFiles();
@ -191,10 +167,9 @@ public class Bug246129 extends IndexTestBase {
} else {
assertEquals(5, indexFiles.length);
}
// The wrapper classes are found regardless whether false friends
// are
// accepted or not.
// are accepted or not.
assertSymbolInIndex("Wrapper");
assertSymbolInIndex("ExternalWrapper");
@ -204,18 +179,16 @@ public class Bug246129 extends IndexTestBase {
assertSymbolInIndex("Type");
assertSymbolInIndex("ExternalType");
}
// Check that all paths are normalized.
for (IIndexFile indexFile : indexFiles) {
IIndexInclude[] includes = indexFile.getIncludes();
for (IIndexInclude i : includes) {
IIndexFileLocation location = i.getIncludesLocation();
assertNotNull(location);
assertFalse(location.getURI().toASCIIString()
.contains(".."));
assertFalse(location.getURI().toASCIIString().contains(".."));
String fullPath = location.getFullPath();
if (fullPath != null) {
@ -223,41 +196,38 @@ public class Bug246129 extends IndexTestBase {
}
}
}
} finally {
fIndex.releaseReadLock();
}
}
private void assertSymbolInAst(IScope scope, String symbolName)
throws Exception {
IBinding[] bindings = scope.find(symbolName);
private void assertSymbolInAst(IScope scope, String symbolName, IASTTranslationUnit ast) throws Exception {
IBinding[] bindings = scope.find(symbolName, ast);
assertTrue(bindings.length > 0);
}
public void testAst() throws Exception {
ITranslationUnit tu = CoreModel.getDefault().createTranslationUnitFrom(
fProject, fSource.getLocation());
ITranslationUnit tu =
CoreModel.getDefault().createTranslationUnitFrom(fProject, fSource.getLocation());
IASTTranslationUnit ast = tu.getAST();
// The wrapper classes are found regardless whether false friends
// are
// accepted or not.
IScope topLevel = ast.getScope();
assertSymbolInAst(topLevel, "Wrapper");
assertSymbolInAst(topLevel, "ExternalWrapper");
assertSymbolInAst(topLevel, "Wrapper", ast);
assertSymbolInAst(topLevel, "ExternalWrapper", ast);
// The Type class is only known on platforms with a File
// implementation sorting out the false friends.
if (!fFalseFriendsAccepted) {
assertSymbolInAst(topLevel, "Type");
assertSymbolInAst(topLevel, "ExternalType");
assertSymbolInAst(topLevel, "Type", ast);
assertSymbolInAst(topLevel, "ExternalType", ast);
}
// Check that all paths are normalized.
IASTPreprocessorIncludeStatement[] includes = ast
.getIncludeDirectives();
IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
for (IASTPreprocessorIncludeStatement i : includes) {
String includedPath = i.getPath();

View file

@ -15,8 +15,6 @@ package org.eclipse.cdt.internal.pdom.tests;
import java.util.regex.Pattern;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IBinding;
@ -36,12 +34,12 @@ import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import junit.framework.Test;
/**
* @author Doug Schaefer
*
*/
public class ClassTests extends PDOMTestBase {
protected PDOM pdom;
public static Test suite() {
@ -61,11 +59,11 @@ public class ClassTests extends PDOMTestBase {
protected void tearDown() throws Exception {
pdom.releaseReadLock();
}
public void test1() throws Exception {
IBinding[] Bs = pdom.findBindings(Pattern.compile("B"), true, IndexFilter.ALL, npm());
assertEquals(1, Bs.length);
ICPPClassType B = (ICPPClassType)Bs[0];
ICPPClassType B = (ICPPClassType) Bs[0];
ICPPMethod[] Bmethods = B.getAllDeclaredMethods();
assertEquals(4, Bmethods.length);
assertNotNull(findMethod(Bmethods, "B"));
@ -78,7 +76,7 @@ public class ClassTests extends PDOMTestBase {
IASTFileLocation loc = Bf_refs[0].getFileLocation();
assertEquals(offset("class.cpp", "b.f()") + 2, loc.getNodeOffset());
}
private ICPPMethod findMethod(ICPPMethod[] bmethods, String name) {
for (ICPPMethod method : bmethods) {
if (method.getName().equals(name)) {
@ -99,30 +97,30 @@ public class ClassTests extends PDOMTestBase {
IField[] fields = NestedB.getFields();
assertEquals(1, fields.length);
IField NestedB_x = fields[0];
IName[] refs = pdom.findNames(NestedB, IIndex.FIND_REFERENCES);
assertEquals(1, refs.length);
IASTFileLocation loc = refs[0].getFileLocation();
assertEquals(offset("nested.cpp", "::NestedB") + 2, loc.getNodeOffset());
refs = pdom.findNames(NestedB_x, IIndex.FIND_REFERENCES);
assertEquals(1, refs.length);
loc = refs[0].getFileLocation();
assertEquals(offset("nested.cpp", "x.x") + 2, loc.getNodeOffset());
}
public void test147903() throws Exception {
IBinding[] bindings = pdom.findBindings(Pattern.compile("pr147903"), false, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
ICPPNamespaceScope ns = ((ICPPNamespace)bindings[0]).getNamespaceScope();
bindings = ns.find("testRef");
ICPPNamespaceScope ns = ((ICPPNamespace) bindings[0]).getNamespaceScope();
bindings = ns.find("testRef", null);
assertEquals(1, bindings.length);
IName[] refs = pdom.findNames(bindings[0], IIndex.FIND_REFERENCES);
// for (int i = 0; i < refs.length; ++i)
// System.out.println(refs[i].getFileLocation().getNodeOffset());
assertEquals(5, refs.length);
}
/* Test friend relationships between classes */
public void testFriend() throws Exception {
IBinding[] bindings = pdom.findBindings(Pattern.compile("ClassA"), true, IndexFilter.ALL_DECLARED, npm());
@ -140,40 +138,40 @@ public class ClassTests extends PDOMTestBase {
IBinding[] friends = classA.getFriends();
assertEquals(1, friends.length);
assertEquals(classC, friends[0]); //ClassC is a friend class of ClassA
friends = classC.getFriends();
assertEquals(1, friends.length);
assertEquals(funcB, friends[0]); //functionB is a friend of ClassC
}
public void noTest_testConstructor() throws Exception {
// the source does not define Class1, so it is no surprise that the test is failing.
//TODO PDOM doesn't have information on constructor
// TODO PDOM doesn't have information on constructor
IBinding[] bindings = pdom.findBindings(Pattern.compile("Class1"), false, IndexFilter.ALL, npm());
assertEquals(2, bindings.length);
assertTrue(bindings[0] instanceof ICPPClassType);
assertTrue(bindings[1] instanceof ICPPMethod);
IName[] decls = pdom.findNames(bindings[1], IIndex.FIND_DECLARATIONS_DEFINITIONS);
assertEquals(2, decls.length);
IASTFileLocation loc = decls[0].getFileLocation();
assertEquals(offset("constructor.cpp","Class1(int num);"), loc.getNodeOffset()); //character offset
assertEquals(offset("constructor.cpp","Class1(int num);"), loc.getNodeOffset()); //character offset
loc = decls[1].getFileLocation();
assertEquals(offset("constructor.cpp","Class1::Class1") + 8, loc.getNodeOffset()); //character offset
/* Member initialization */
bindings = pdom.findBindings(Pattern.compile("number"), false, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IName[] refs = pdom.findNames(bindings[0], IIndex.FIND_REFERENCES);
assertEquals(1, refs.length);
loc = refs[0].getFileLocation();
assertEquals(offset("constructor.cpp","number(num)"), loc.getNodeOffset()); //character offset
assertEquals(offset("constructor.cpp", "number(num)"), loc.getNodeOffset()); //character offset
assertEquals(bindings[0], ((PDOMName)refs[0]).getBinding());
}
public void testAbsenceOfDefaultConstructorWhenExplicitNonDefaultPresentA() throws Exception {
IndexFilter JUST_CONSTRUCTORS= new IndexFilter() {
@Override
@ -185,7 +183,7 @@ public class ClassTests extends PDOMTestBase {
// expecting C(int) and C(const C &)
assertEquals(2, bindings.length);
}
public void testAbsenceOfDefaultConstructorWhenExplicitNonDefaultPresentB() throws Exception {
IndexFilter JUST_CONSTRUCTORS= new IndexFilter() {
@Override
@ -197,40 +195,40 @@ public class ClassTests extends PDOMTestBase {
// expecting just D(D &)
assertEquals(1, bindings.length);
}
public void testClassScope_bug185408() throws Exception {
char[][] name= {"B".toCharArray(), "bf".toCharArray()};
IBinding[] bindings= pdom.findBindings(name, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IScope classScope= bindings[0].getScope();
assertTrue(classScope instanceof ICPPClassScope);
bindings= classScope.find("bf");
bindings= classScope.find("bf", null);
ICPPMethod method= extractSingleMethod(bindings);
assertEquals(method.getQualifiedName()[0], "B");
assertEquals("B", method.getQualifiedName()[0]);
bindings= classScope.find("f");
bindings= classScope.find("f", null);
method= extractSingleMethod(bindings);
assertEquals(method.getQualifiedName()[0], "A");
assertEquals("A", method.getQualifiedName()[0]);
bindings= classScope.find("B");
bindings= classScope.find("B", null);
ICPPClassType classType= extractSingleClass(bindings);
assertEquals(classType.getQualifiedName()[0], "B");
assertEquals("B", classType.getQualifiedName()[0]);
bindings= classScope.find("A");
bindings= classScope.find("A", null);
classType= extractSingleClass(bindings);
assertEquals(classType.getQualifiedName()[0], "A");
assertEquals("A", classType.getQualifiedName()[0]);
}
private ICPPMethod extractSingleMethod(IBinding[] bindings) {
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ICPPMethod);
assertInstance(bindings[0], ICPPMethod.class);
return (ICPPMethod) bindings[0];
}
private ICPPClassType extractSingleClass(IBinding[] bindings) {
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ICPPClassType);
assertInstance(bindings[0], ICPPClassType.class);
return (ICPPClassType) bindings[0];
}

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true
Bundle-Version: 5.10.0.qualifier
Bundle-Version: 5.11.0.qualifier
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin

View file

@ -9,6 +9,7 @@
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Bryan Wilkinson (QNX)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.core.dom.ast;
@ -19,7 +20,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet;
/**
* Scopes can be used to look-up names. With the exception of template-scopes the scopes
* can be arranged in a hierarchy.
*
*
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
@ -31,46 +32,53 @@ public interface IScope {
EScopeKind getKind();
/**
* Returns the IName for this scope, may be {@code null}
* Returns the IName for this scope, may be {@code null}.
*
* @return The name of this scope.
*/
public IName getScopeName();
/**
* Returns the first enclosing non-template scope, or {@code null} if this is the global scope.
*/
public IScope getParent() throws DOMException;
/**
* This is the general lookup entry point. It returns the list of valid bindings for a given
* name. The lookup proceeds as an unqualified lookup. Constructors are not considered during
* this lookup and won't be returned. No attempt is made to resolve potential ambiguities or
* This is the general lookup entry point. It returns the list of valid bindings for a given name in this
* scope and its enclosing scopes. The name is treated as unqualified. Constructors are not considered
* during this lookup and won't be returned. No attempt is made to resolve potential ambiguities or
* perform access checking.
*
*
* @param name the name of the bindings
* @return An array of bindings.
* @param tu the translation unit determining the context for the lookup
* @return An array of bindings
* @since 5.11
*/
public IBinding[] find(String name);
public IBinding[] find(String name, IASTTranslationUnit tu);
/**
* Returns the binding in this scope that the given name would resolve to. Could
* return null if there is no matching binding in this scope, if the binding has not
* yet been cached in this scope, or if resolve is {@code false} and the appropriate binding
* has not yet been resolved.
*
* @deprecated Use {{@link #find(String, IASTTranslationUnit)}
*/
@Deprecated
public IBinding[] find(String name);
/**
* Returns the binding in this scope that the given name would resolve to. Could return {@code null}
* if there is no matching binding in this scope, if the binding has not yet been cached in this scope,
* or if resolve is {@code false} and the appropriate binding has not yet been resolved.
*
* @param name the name of the binding
* @param resolve whether or not to resolve the matching binding if it has not been so already
* @return the binding in this scope that matches the name, or {@code null}
*/
public IBinding getBinding(IASTName name, boolean resolve);
/**
* Returns the binding in this scope that the given name would resolve to. Could
* return null if there is no matching binding in this scope, if the binding has not
* yet been cached in this scope, or if resolve is {@code false} and the appropriate binding
* has not yet been resolved. Accepts file local bindings from the index for the files
* in the given set, only.
*
* Returns the binding in this scope that the given name would resolve to. Could return {@code null}
* if there is no matching binding in this scope, if the binding has not yet been cached in this scope,
* or if resolve is {@code false} and the appropriate binding has not yet been resolved. Accepts file
* local bindings from the index for the files in the given set, only.
*
* @param name the name of the binding
* @param resolve whether or not to resolve the matching binding if it has not been so already
* @param acceptLocalBindings a set of files for which to accept local bindings
@ -88,9 +96,9 @@ public interface IScope {
* @deprecated Use {@link #getBindings(ScopeLookupData)} instead
*/
@Deprecated
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup, IIndexFileSet acceptLocalBindings);
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup,
IIndexFileSet acceptLocalBindings);
/**
* @since 5.5
* @noextend This class is not intended to be subclassed by clients.
@ -103,7 +111,7 @@ public interface IScope {
private boolean fResolve= true;
private boolean fPrefixLookup;
private boolean fIgnorePointOfDeclaration;
public ScopeLookupData(IASTName name, boolean resolve, boolean prefixLookup) {
if (name == null)
throw new IllegalArgumentException();
@ -129,6 +137,17 @@ public interface IScope {
}
}
/**
* @since 5.11
*/
public ScopeLookupData(char[] name, IASTTranslationUnit tu) {
fLookupPoint= null;
fLookupPointIsName= false;
fLookupKey= name;
fIgnorePointOfDeclaration= true;
fTu= tu;
}
public final void setPrefixLookup(boolean prefixLookup) {
fPrefixLookup = prefixLookup;
}
@ -183,11 +202,10 @@ public interface IScope {
}
/**
* Returns the bindings in this scope that the given name or prefix could resolve to. Could
* return null if there is no matching bindings in this scope, if the bindings have not
* yet been cached in this scope, or if resolve == false and the appropriate bindings
* have not yet been resolved.
*
* Returns the bindings in this scope that the given name or prefix could resolve to. Could return
* {@code null} if there is no matching bindings in this scope, if the bindings have not yet been cached
* in this scope, or if resolve is {@code false} and the appropriate bindings have not yet been resolved.
*
* @return the bindings in this scope that match the name or prefix, or {@code null}
* @since 5.5
*/

View file

@ -174,6 +174,11 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
throw new DOMException(this);
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
public IBinding[] find(String name) {
return IBinding.EMPTY_BINDING_ARRAY;

View file

@ -164,6 +164,11 @@ public class CScope implements ICScope, IASTInternalScope {
}
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return find(name);
}
@Override
public IBinding[] find(String name) {
return CVisitor.findBindings(this, name);

View file

@ -685,7 +685,7 @@ public class CVisitor extends ASTQueries {
static IType getPtrDiffType(IASTBinaryExpression expr) {
IScope scope = getContainingScope(expr);
IBinding[] bs = scope.find(PTRDIFF_T);
IBinding[] bs = scope.find(PTRDIFF_T, expr.getTranslationUnit());
for (IBinding b : bs) {
if (b instanceof IType) {
if (!(b instanceof ICInternalBinding) ||
@ -701,7 +701,7 @@ public class CVisitor extends ASTQueries {
static IType get_SIZE_T(IASTExpression expr) {
IASTTranslationUnit tu= expr.getTranslationUnit();
if (tu != null) {
IBinding[] bs = tu.getScope().find(SIZE_T);
IBinding[] bs = tu.getScope().find(SIZE_T, expr.getTranslationUnit());
for (IBinding b : bs) {
if (b instanceof IType) {
if (!(b instanceof ICInternalBinding) ||
@ -1650,7 +1650,7 @@ public class CVisitor extends ASTQueries {
}
// label names
List<ILabel> b3 = new ArrayList<ILabel>();
List<ILabel> b3 = new ArrayList<>();
do {
char[] n = name.toCharArray();
if (scope instanceof ICFunctionScope) {

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
@ -337,6 +338,11 @@ public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializat
return getOriginalClassType().getScope();
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return find(name);
}
@Override
public IBinding[] find(String name) {
return CPPSemantics.findBindings(this, name, false);

View file

@ -35,6 +35,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
@ -429,6 +430,11 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY;
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return find(name);
}
@Override
public IBinding[] find(String name) {
char[] n = name.toCharArray();

View file

@ -27,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
@ -386,7 +387,7 @@ public class CPPClosureType extends PlatformObject implements ICPPClassType, ICP
}
private IBinding[] getPrefixBindings(char[] name) {
List<IBinding> result= new ArrayList<IBinding>();
List<IBinding> result= new ArrayList<>();
IContentAssistMatcher matcher = ContentAssistMatcherFactory.getInstance().createMatcher(name);
for (ICPPMethod m : getMethods()) {
if (!(m instanceof ICPPConstructor)) {
@ -398,6 +399,11 @@ public class CPPClosureType extends PlatformObject implements ICPPClassType, ICP
return result.toArray(new IBinding[result.size()]);
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return find(name);
}
@Override
public IBinding[] find(String name) {
return getBindings(name.toCharArray());
@ -427,8 +433,8 @@ public class CPPClosureType extends PlatformObject implements ICPPClassType, ICP
@Override
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup,
IIndexFileSet acceptLocalBindings) {
return getBindings(new ScopeLookupData(name, resolve, prefixLookup));
}
return getBindings(new ScopeLookupData(name, resolve, prefixLookup));
}
@Override
public IBinding[] getBindings(ScopeLookupData lookup) {

View file

@ -336,6 +336,11 @@ abstract public class CPPScope implements ICPPASTInternalScope {
}
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return find(name);
}
@Override
public IBinding[] find(String name) {
return CPPSemantics.findBindings(this, name, false);

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
@ -97,6 +98,11 @@ public class CPPScopeMapper {
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return fScope.find(name, tu);
}
@Override @Deprecated
public IBinding[] find(String name) {
return fScope.find(name);
}

View file

@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
@ -78,6 +79,11 @@ public class CPPUnknownTypeScope implements ICPPInternalUnknownScope {
return null;
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
public IBinding[] find(String name) {
return IBinding.EMPTY_BINDING_ARRAY;

View file

@ -229,7 +229,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.TypeS
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Conversions.Context;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Conversions.UDCMode;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Cost.Rank;
import org.eclipse.cdt.internal.core.index.IIndexScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
@ -734,7 +733,8 @@ public class CPPSemantics {
if (parent != null)
parent= parent.getParent(); // the loop
if (parent instanceof ICPPASTRangeBasedForStatement) {
IBinding[] std= parent.getTranslationUnit().getScope().find(CPPVisitor.STD);
IASTTranslationUnit tu = parent.getTranslationUnit();
IBinding[] std= tu.getScope().find(CPPVisitor.STD, tu);
for (IBinding binding : std) {
if (binding instanceof ICPPNamespace) {
namespaces.add(((ICPPNamespace) binding).getNamespaceScope());
@ -815,9 +815,7 @@ public class CPPSemantics {
if (binding == null)
return null;
IScope scope = binding.getScope();
if (tu != null) {
scope= tu.mapToASTScope(scope);
}
scope = SemanticUtil.mapToAST(scope, tu);
while (scope != null && !(scope instanceof ICPPNamespaceScope)) {
scope = getParentScope(scope, tu);
}
@ -997,10 +995,7 @@ public class CPPSemantics {
}
}
ICPPScope scope= useTemplScope ? nextTmplScope : nextScope;
CPPASTTranslationUnit tu = data.getTranslationUnit();
if (tu != null) {
scope= (ICPPScope) tu.mapToASTScope((scope));
}
scope = (ICPPScope) SemanticUtil.mapToAST(scope, data.getTranslationUnit());
if (!data.usingDirectivesOnly && !(data.ignoreMembers && scope instanceof ICPPClassScope)) {
mergeResults(data, getBindingsFromScope(scope, data), true);
@ -1367,16 +1362,14 @@ public class CPPSemantics {
return ((ICPPASTTemplateDeclaration) parent).getScope();
}
static ICPPScope getParentScope(IScope scope, ICPPASTTranslationUnit unit) throws DOMException {
static ICPPScope getParentScope(IScope scope, IASTTranslationUnit unit) throws DOMException {
IScope parentScope= scope.getParent();
// The index cannot return the translation unit as parent scope.
if (unit instanceof CPPASTTranslationUnit) {
if (parentScope == null
&& (scope instanceof IIndexScope || scope instanceof ICPPClassSpecializationScope)) {
parentScope = unit.getScope();
} else {
parentScope = ((CPPASTTranslationUnit) unit).mapToASTScope(parentScope);
}
if (parentScope == null && scope instanceof ICPPClassSpecializationScope
&& unit instanceof CPPASTTranslationUnit) {
parentScope = unit.getScope();
} else {
parentScope = SemanticUtil.mapToAST(parentScope, unit);
}
return (ICPPScope) parentScope;
}
@ -3586,6 +3579,11 @@ public class CPPSemantics {
return type instanceof ICPPClassType || type instanceof IEnumeration || type instanceof ICPPUnknownType;
}
public static IBinding[] findBindingsInScope(IScope scope, String name, IASTTranslationUnit tu) {
LookupData data = new LookupData(name.toCharArray(), null, tu);
return standardLookup(data, scope);
}
public static IBinding[] findBindings(IScope scope, String name, boolean qualified) {
return findBindings(scope, name.toCharArray(), qualified, null);
}

View file

@ -220,7 +220,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType;
import org.eclipse.cdt.internal.core.index.IIndexScope;
/**
* Collection of methods to extract information from a C++ translation unit.
@ -542,15 +541,15 @@ public class CPPVisitor extends ASTQueries {
}
if (mustBeSimple) {
// 3.3.1-5 ... the identifier is declared in the smallest non-class non-function-prototype scope that contains
// the declaration
// 3.3.1-5 ... the identifier is declared in the smallest non-class non-function-prototype
// scope that contains the declaration.
while (scope instanceof ICPPClassScope || scope instanceof ICPPFunctionScope) {
scope = (ICPPScope) getParentScope(scope, elabType.getTranslationUnit());
scope = CPPSemantics.getParentScope(scope, elabType.getTranslationUnit());
}
}
if (scope instanceof ICPPClassScope && isFriend && !qualified) {
while (scope instanceof ICPPClassScope) {
scope = (ICPPScope) getParentScope(scope, elabType.getTranslationUnit());
scope = CPPSemantics.getParentScope(scope, elabType.getTranslationUnit());
}
}
if (scope != null) {
@ -820,7 +819,7 @@ public class CPPVisitor extends ASTQueries {
if (isFriendDecl) {
try {
while (scope.getKind() == EScopeKind.eClassType) {
scope = (ICPPScope) getParentScope(scope, name.getTranslationUnit());
scope = CPPSemantics.getParentScope(scope, name.getTranslationUnit());
}
} catch (DOMException e1) {
}
@ -2369,7 +2368,7 @@ public class CPPVisitor extends ASTQueries {
if (node == null)
return null;
ASTTranslationUnit ast = (ASTTranslationUnit) node.getTranslationUnit();
IBinding[] std= ast.getScope().find(STD);
IBinding[] std= ast.getScope().find(STD, ast);
for (IBinding binding : std) {
if (binding instanceof ICPPNamespace) {
final ICPPNamespaceScope scope = ((ICPPNamespace) binding).getNamespaceScope();
@ -2499,16 +2498,6 @@ public class CPPVisitor extends ASTQueries {
return ns;
}
private static IScope getParentScope(IScope scope, IASTTranslationUnit unit) throws DOMException {
IScope parentScope= scope.getParent();
// Replace the global scope from index with the global scope of the translation unit.
if ((parentScope == null || parentScope.getKind() == EScopeKind.eGlobal) &&
scope instanceof IIndexScope && unit != null) {
parentScope= unit.getScope();
}
return parentScope;
}
public static boolean isExternC(IASTNode node) {
while (node != null) {
node= node.getParent();

View file

@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IScope.ScopeLookupData;
@ -135,6 +136,11 @@ public class LookupData extends ScopeLookupData {
fTemplateArguments= templateArgs;
}
public LookupData(char[] name, ICPPTemplateArgument[] templateArgs, IASTTranslationUnit tu) {
super(name, tu);
fTemplateArguments= templateArgs;
}
@Override
public CPPASTTranslationUnit getTranslationUnit() {
return (CPPASTTranslationUnit) super.getTranslationUnit();

View file

@ -27,7 +27,9 @@ import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CVQualifier
import java.util.HashSet;
import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
@ -81,6 +83,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateTypeArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
import org.eclipse.cdt.internal.core.index.IIndexScope;
/**
* Collection of static methods operating on C++ bindings.
@ -540,10 +543,15 @@ public class SemanticUtil {
}
public static IScope mapToAST(IScope scope, IASTNode point) {
if (point != null) {
IASTTranslationUnit ast = point.getTranslationUnit();
if (ast instanceof ASTTranslationUnit) {
return ((ASTTranslationUnit) ast).mapToASTScope(scope);
if (scope instanceof IIndexScope) {
if (point != null) {
IASTTranslationUnit ast = point.getTranslationUnit();
if (ast instanceof ASTTranslationUnit) {
return ((ASTTranslationUnit) ast).mapToASTScope(scope);
}
} else if (scope.getKind() == EScopeKind.eGlobal) {
CCorePlugin.log(new Exception(
"The point argument was not provided. Returning the global index scope.")); //$NON-NLS-1$
}
}
return scope;

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.index.composite.c;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
@ -55,6 +56,12 @@ class CompositeCCompositeScope extends CompositeScope implements ICCompositeType
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
IBinding[] preresult = ((ICompositeType) rbinding).getCompositeScope().find(name, tu);
return processUncertainBindings(preresult);
}
@Override @Deprecated
public IBinding[] find(String name) {
IBinding[] preresult = ((ICompositeType) rbinding).getCompositeScope().find(name);
return processUncertainBindings(preresult);

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
@ -77,6 +78,12 @@ class CompositeCPPClassScope extends CompositeScope implements ICPPClassScope {
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
IBinding[] preresult = ((ICPPClassType) rbinding).getCompositeScope().find(name, tu);
return processUncertainBindings(preresult);
}
@Override @Deprecated
public IBinding[] find(String name) {
IBinding[] preresult = ((ICPPClassType) rbinding).getCompositeScope().find(name);
return processUncertainBindings(preresult);

View file

@ -16,6 +16,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
@ -81,6 +82,12 @@ public class CompositeCPPClassSpecializationScope extends CompositeScope impleme
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
createDelegate();
return fDelegate.find(name, tu);
}
@Override @Deprecated
public IBinding[] find(String name) {
createDelegate();
return fDelegate.find(name);

View file

@ -6,12 +6,13 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration;
@ -44,16 +45,22 @@ class CompositeCPPEnumScope extends CompositeScope implements ICPPEnumScope {
@Override
public IBinding[] getBindings(ScopeLookupData lookup) {
IBinding[] bindings = ((ICPPEnumeration)rbinding).asScope().getBindings(lookup);
IBinding[] bindings = ((ICPPEnumeration) rbinding).asScope().getBindings(lookup);
return processUncertainBindings(bindings);
}
@Override
public IBinding[] find(String name) {
IBinding[] preresult = ((ICPPEnumeration)rbinding).asScope().find(name);
public IBinding[] find(String name, IASTTranslationUnit tu) {
IBinding[] preresult = ((ICPPEnumeration) rbinding).asScope().find(name, tu);
return processUncertainBindings(preresult);
}
@Override @Deprecated
public IBinding[] find(String name) {
IBinding[] preresult = ((ICPPEnumeration) rbinding).asScope().find(name);
return processUncertainBindings(preresult);
}
@Override
public IIndexBinding getScopeBinding() {
return cf.getCompositeBinding(rbinding);

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
@ -74,6 +75,17 @@ class CompositeCPPNamespaceScope extends CompositeScope implements ICPPNamespace
}
@Override
final public IBinding[] find(String name, IASTTranslationUnit tu) {
IIndexFragmentBinding[][] preresult = new IIndexFragmentBinding[namespaces.length][];
for (int i= 0; i < namespaces.length; i++) {
IBinding[] raw = namespaces[i].getNamespaceScope().find(name, tu);
preresult[i] = new IIndexFragmentBinding[raw.length];
System.arraycopy(raw, 0, preresult[i], 0, raw.length);
}
return cf.getCompositeBindings(preresult);
}
@Override @Deprecated
final public IBinding[] find(String name) {
IIndexFragmentBinding[][] preresult = new IIndexFragmentBinding[namespaces.length][];
for (int i= 0; i < namespaces.length; i++) {

View file

@ -10,8 +10,10 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFileSet;
@ -27,35 +29,47 @@ public abstract class PDOMGlobalScope implements IIndexScope {
return EScopeKind.eGlobal;
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
logInvalidCallError();
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
public IBinding[] find(String name) {
throw new UnsupportedOperationException();
logInvalidCallError();
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
public IBinding getBinding(IASTName name, boolean resolve) {
throw new UnsupportedOperationException();
logInvalidCallError();
return null;
}
@Override
public IBinding getBinding(IASTName name, boolean resolve, IIndexFileSet acceptLocalBindings) {
throw new UnsupportedOperationException();
logInvalidCallError();
return null;
}
@Override
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup) {
throw new UnsupportedOperationException();
logInvalidCallError();
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup,
IIndexFileSet acceptLocalBindings) {
throw new UnsupportedOperationException();
logInvalidCallError();
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
public IBinding[] getBindings(ScopeLookupData lookup) {
throw new UnsupportedOperationException();
logInvalidCallError();
return IBinding.EMPTY_BINDING_ARRAY;
}
@Override
@ -77,4 +91,9 @@ public abstract class PDOMGlobalScope implements IIndexScope {
public String toString() {
return "<global scope>"; //$NON-NLS-1$
}
private void logInvalidCallError() {
CCorePlugin.log(new UnsupportedOperationException(
"Global index scope has to be mapped to the global scope of a particular translation unit.")); //$NON-NLS-1$
}
}

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IField;
@ -292,6 +293,11 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return getBindings(name.toCharArray());
}
@Override @Deprecated
public IBinding[] find(String name) {
return getBindings(name.toCharArray());
}

View file

@ -26,6 +26,7 @@ import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
@ -258,6 +259,11 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return CPPSemantics.findBindingsInScope(this, name, tu);
}
@Override @Deprecated
public IBinding[] find(String name) {
return CPPSemantics.findBindings(this, name, false);
}

View file

@ -11,10 +11,13 @@
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.AbstractCPPClassSpecializationScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.index.IIndexScope;
/**
@ -43,4 +46,9 @@ public class PDOMCPPClassSpecializationScope extends AbstractCPPClassSpecializat
public IIndexName getScopeName() {
return null;
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return CPPSemantics.findBindingsInScope(this, name, tu);
}
}

View file

@ -21,6 +21,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumScope;
@ -105,6 +106,11 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope {
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return CPPSemantics.findBindingsInScope(this, name, tu);
}
@Override @Deprecated
public IBinding[] find(String name) {
return CPPSemantics.findBindings(this, name, false);
}

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
@ -166,6 +167,11 @@ class PDOMCPPNamespace extends PDOMCPPBinding
return ICPPUsingDirective.EMPTY_ARRAY;
}
@Override
public IBinding[] find(String name, IASTTranslationUnit tu) {
return find(name);
}
@Override
public IBinding[] find(String name) {
try {

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath>
</parent>
<version>5.10.0-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core</artifactId>
<packaging>eclipse-plugin</packaging>
</project>

View file

@ -691,10 +691,10 @@ public class ASTManager implements IDisposable {
}
}
public static IBinding[] findInScope(final IScope scope, String name, boolean removeGlobalsWhenClassScope)
throws DOMException {
public static IBinding[] findInScope(final IScope scope, String name, IASTTranslationUnit tu,
boolean removeGlobalsWhenClassScope) throws DOMException {
IBinding[] result= null;
result = scope.find(name);
result = scope.find(name, tu);
if (result == null || result.length == 0) {
return result;
}
@ -706,7 +706,7 @@ public class ASTManager implements IDisposable {
for (int i = 0; i < result.length; i++) {
IBinding binding = result[i];
IScope bscope= binding.getScope();
if (! (bscope instanceof ICPPClassScope || bscope instanceof ICCompositeTypeScope)) {
if (!(bscope instanceof ICPPClassScope || bscope instanceof ICCompositeTypeScope)) {
result[i]= null;
} else {
count++;
@ -1197,7 +1197,7 @@ public class ASTManager implements IDisposable {
if (scope != null) {
IBinding[] conflicting= null;
try {
conflicting= findInScope(scope, fRenameTo, true);
conflicting= findInScope(scope, fRenameTo, name.getTranslationUnit(), true);
} catch (Exception e) {
CUIPlugin.log(e);
}
@ -1445,7 +1445,7 @@ public class ASTManager implements IDisposable {
try {
oldBindingsScope = oldBinding.getScope();
if (oldBindingsScope != null) {
newBindingsAboverOrEqual = ASTManager.findInScope(oldBindingsScope, fRenameTo, false);
newBindingsAboverOrEqual = ASTManager.findInScope(oldBindingsScope, fRenameTo, null, false);
}
} catch (DOMException e) {
handleDOMException(tu, e, status);

View file

@ -96,10 +96,10 @@ public class CRenameClassProcessor extends CRenameTypeProcessor {
if (ctors != null) {
ArrayUtil.addAll(bindings, ctors);
}
IScope scope= ctype.getCompositeScope();
if (scope != null) {
IBinding[] dtors= scope.find("~" + argument.getName()); //$NON-NLS-1$
IBinding[] dtors= scope.find("~" + argument.getName(), argument.getTranslationUnit()); //$NON-NLS-1$
if (dtors != null) {
ArrayUtil.addAll(bindings, dtors);
}

View file

@ -14,6 +14,7 @@ import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.index.IIndexFileSet;
@ -25,9 +26,6 @@ import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope;
*/
@SuppressWarnings({"restriction","unused"})
public class C99Scope implements IC99Scope, IASTInternalScope {
private IScope parent;
private IASTNode physicalNode;
private IName scopeName;
@ -72,9 +70,13 @@ public class C99Scope implements IC99Scope, IASTInternalScope {
this.scopeName = scopeName;
}
@Override
public IBinding[] find( String name) {
public IBinding[] find(String name, IASTTranslationUnit tu) {
throw new UnsupportedOperationException();
}
@Override @Deprecated
public IBinding[] find(String name) {
throw new UnsupportedOperationException();
}
@ -87,9 +89,6 @@ public class C99Scope implements IC99Scope, IASTInternalScope {
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup) {
throw new UnsupportedOperationException();
}
@Override
public void addBinding(IBinding binding) {
@ -110,9 +109,7 @@ public class C99Scope implements IC99Scope, IASTInternalScope {
}
@Override
public IBinding getBinding(IASTName name, boolean resolve,
IIndexFileSet acceptLocalBindings) {
// TODO Auto-generated method stub
public IBinding getBinding(IASTName name, boolean resolve, IIndexFileSet acceptLocalBindings) {
return null;
}
@ -123,15 +120,11 @@ public class C99Scope implements IC99Scope, IASTInternalScope {
@Deprecated
public IBinding[] getBindings(IASTName name, boolean resolve,
boolean prefixLookup, IIndexFileSet acceptLocalBindings) {
return getBindings(new ScopeLookupData(name, resolve, prefixLookup));
}
return getBindings(new ScopeLookupData(name, resolve, prefixLookup));
}
@Override
public IBinding[] getBindings(ScopeLookupData lookup) {
// TODO Auto-generated method stub
return null;
return IBinding.EMPTY_BINDING_ARRAY;
}
}