mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix for 167396, inheritance relations in PDOM.
This commit is contained in:
parent
10fedfa4d0
commit
9c3fe10028
8 changed files with 210 additions and 63 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
* Copyright (c) 2005, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -71,7 +71,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
||||||
|
|
||||||
private Database db;
|
private Database db;
|
||||||
|
|
||||||
public static final int VERSION = 20;
|
public static final int VERSION = 22;
|
||||||
// 0 - the beginning of it all
|
// 0 - the beginning of it all
|
||||||
// 1 - first change to kick off upgrades
|
// 1 - first change to kick off upgrades
|
||||||
// 2 - added file inclusions
|
// 2 - added file inclusions
|
||||||
|
@ -94,6 +94,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
||||||
// 19 - alter representation of paths in the pdom (162172)
|
// 19 - alter representation of paths in the pdom (162172)
|
||||||
// 20 - add pointer to member types, array types, return types for functions
|
// 20 - add pointer to member types, array types, return types for functions
|
||||||
// 21 - change representation of paths in the pdom (167549)
|
// 21 - change representation of paths in the pdom (167549)
|
||||||
|
// 22 - fix inheritance relations (167396)
|
||||||
|
|
||||||
public static final int LINKAGES = Database.DATA_AREA;
|
public static final int LINKAGES = Database.DATA_AREA;
|
||||||
public static final int FILE_INDEX = Database.DATA_AREA + 4;
|
public static final int FILE_INDEX = Database.DATA_AREA + 4;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
* Copyright (c) 2005, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.pdom.dom;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
@ -211,6 +212,7 @@ public class PDOMFile implements IIndexFragmentFile {
|
||||||
PDOMBinding binding = ((WritablePDOM) pdom).addBinding(name);
|
PDOMBinding binding = ((WritablePDOM) pdom).addBinding(name);
|
||||||
if (binding != null) {
|
if (binding != null) {
|
||||||
result= new PDOMName(pdom, name, this, binding, caller);
|
result= new PDOMName(pdom, name, this, binding, caller);
|
||||||
|
binding.getLinkageImpl().onCreateName(result, name);
|
||||||
}
|
}
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
|
@ -238,11 +240,17 @@ public class PDOMFile implements IIndexFragmentFile {
|
||||||
setFirstMacro(null);
|
setFirstMacro(null);
|
||||||
|
|
||||||
// Delete all the names in this file
|
// Delete all the names in this file
|
||||||
|
ArrayList names= new ArrayList();
|
||||||
PDOMName name = getFirstName();
|
PDOMName name = getFirstName();
|
||||||
while (name != null) {
|
while (name != null) {
|
||||||
PDOMName nextName = name.getNextInFile();
|
names.add(name);
|
||||||
|
name.getPDOMBinding().getLinkageImpl().onDeleteName(name);
|
||||||
|
name= name.getNextInFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Iterator iterator = names.iterator(); iterator.hasNext();) {
|
||||||
|
name = (PDOMName) iterator.next();
|
||||||
name.delete();
|
name.delete();
|
||||||
name = nextName;
|
|
||||||
}
|
}
|
||||||
setFirstName(null);
|
setFirstName(null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
* Copyright (c) 2005, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -226,4 +226,26 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
|
|
||||||
return visitor.getBinding();
|
return visitor.getBinding();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback informing the linkage that a name has been added. This is
|
||||||
|
* used to do addtional processing, like establishing inheritance relationships.
|
||||||
|
* @param pdomName the name that was inserted into the linkage
|
||||||
|
* @param name the name that caused the insertion
|
||||||
|
* @throws CoreException
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public void onCreateName(PDOMName pdomName, IASTName name) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback informing the linkage that a name is about to be deleted. This is
|
||||||
|
* used to do addtional processing, like removing inheritance relationships.
|
||||||
|
* @param pdomName the name that was inserted into the linkage
|
||||||
|
* @param name the name that caused the insertion
|
||||||
|
* @throws CoreException
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public void onDeleteName(PDOMName nextName) throws CoreException {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
* Copyright (c) 2005, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -50,6 +50,9 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation {
|
||||||
private static final int IS_DECLARATION = 1;
|
private static final int IS_DECLARATION = 1;
|
||||||
private static final int IS_DEFINITION = 2;
|
private static final int IS_DEFINITION = 2;
|
||||||
private static final int IS_REFERENCE = 3;
|
private static final int IS_REFERENCE = 3;
|
||||||
|
private static final int DECL_DEF_REF_MASK= 3;
|
||||||
|
private static final int IS_INHERITANCE_SPEC = 4;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public PDOMName(PDOM pdom, IASTName name, PDOMFile file, PDOMBinding binding, PDOMName caller) throws CoreException {
|
public PDOMName(PDOM pdom, IASTName name, PDOMFile file, PDOMBinding binding, PDOMName caller) throws CoreException {
|
||||||
|
@ -192,13 +195,26 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte getFlags() throws CoreException {
|
private byte getFlags(int mask) throws CoreException {
|
||||||
return pdom.getDB().getByte(record + FLAGS);
|
return (byte) (pdom.getDB().getByte(record + FLAGS) & mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setIsBaseSpecifier(boolean val) throws CoreException {
|
||||||
|
byte flags= getFlags(0xff);
|
||||||
|
if (val)
|
||||||
|
flags |= IS_INHERITANCE_SPEC;
|
||||||
|
else
|
||||||
|
flags &= ~IS_INHERITANCE_SPEC;
|
||||||
|
pdom.getDB().putByte(record + FLAGS, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBaseSpecifier() throws CoreException {
|
||||||
|
return getFlags(IS_INHERITANCE_SPEC) == IS_INHERITANCE_SPEC;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isDeclaration() {
|
public boolean isDeclaration() {
|
||||||
try {
|
try {
|
||||||
byte flags = getFlags();
|
byte flags = getFlags(DECL_DEF_REF_MASK);
|
||||||
return flags == IS_DECLARATION || flags == IS_DEFINITION;
|
return flags == IS_DECLARATION || flags == IS_DEFINITION;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
|
@ -208,7 +224,7 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation {
|
||||||
|
|
||||||
public boolean isReference() {
|
public boolean isReference() {
|
||||||
try {
|
try {
|
||||||
byte flags = getFlags();
|
byte flags = getFlags(DECL_DEF_REF_MASK);
|
||||||
return flags == IS_REFERENCE;
|
return flags == IS_REFERENCE;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
|
@ -218,7 +234,7 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation {
|
||||||
|
|
||||||
public boolean isDefinition() {
|
public boolean isDefinition() {
|
||||||
try {
|
try {
|
||||||
byte flags = getFlags();
|
byte flags = getFlags(DECL_DEF_REF_MASK);
|
||||||
return flags == IS_DEFINITION;
|
return flags == IS_DEFINITION;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
|
@ -286,7 +302,7 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation {
|
||||||
if (prevName != null)
|
if (prevName != null)
|
||||||
prevName.setNextInBinding(nextName);
|
prevName.setNextInBinding(nextName);
|
||||||
else {
|
else {
|
||||||
switch (getFlags()) {
|
switch (getFlags(DECL_DEF_REF_MASK)) {
|
||||||
case IS_DECLARATION:
|
case IS_DECLARATION:
|
||||||
getPDOMBinding().setFirstDeclaration(nextName);
|
getPDOMBinding().setFirstDeclaration(nextName);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
* Copyright (c) 2006, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -7,15 +7,16 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX - Initial API and implementation
|
* QNX - Initial API and implementation
|
||||||
|
* Markus Schorn (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
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.ICPPBase;
|
||||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,7 +24,7 @@ import org.eclipse.core.runtime.CoreException;
|
||||||
*/
|
*/
|
||||||
class PDOMCPPBase implements ICPPBase {
|
class PDOMCPPBase implements ICPPBase {
|
||||||
|
|
||||||
private static final int BASECLASS = 0;
|
private static final int BASECLASS_SPECIFIER = 0;
|
||||||
private static final int NEXTBASE = 4;
|
private static final int NEXTBASE = 4;
|
||||||
private static final int FLAGS = 8;
|
private static final int FLAGS = 8;
|
||||||
|
|
||||||
|
@ -37,13 +38,13 @@ class PDOMCPPBase implements ICPPBase {
|
||||||
this.record = record;
|
this.record = record;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PDOMCPPBase(PDOM pdom, PDOMCPPClassType baseClass, boolean isVirtual, int visibility) throws CoreException {
|
public PDOMCPPBase(PDOM pdom, PDOMName baseClassSpec, boolean isVirtual, int visibility) throws CoreException {
|
||||||
this.pdom = pdom;
|
this.pdom = pdom;
|
||||||
Database db = pdom.getDB();
|
Database db = pdom.getDB();
|
||||||
this.record = db.malloc(RECORD_SIZE);
|
this.record = db.malloc(RECORD_SIZE);
|
||||||
|
|
||||||
int baserec = baseClass != null ? baseClass.getRecord() : 0;
|
int baserec = baseClassSpec != null ? baseClassSpec.getRecord() : 0;
|
||||||
db.putInt(record + BASECLASS, baserec);
|
db.putInt(record + BASECLASS_SPECIFIER, baserec);
|
||||||
|
|
||||||
byte flags = (byte)(visibility | (isVirtual ? 4 : 0));
|
byte flags = (byte)(visibility | (isVirtual ? 4 : 0));
|
||||||
db.putByte(record + FLAGS, flags);
|
db.putByte(record + FLAGS, flags);
|
||||||
|
@ -66,18 +67,31 @@ class PDOMCPPBase implements ICPPBase {
|
||||||
private int getFlags() throws CoreException {
|
private int getFlags() throws CoreException {
|
||||||
return pdom.getDB().getByte(record + FLAGS);
|
return pdom.getDB().getByte(record + FLAGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBinding getBaseClass() throws DOMException {
|
public PDOMName getBaseClassSpecifierImpl() {
|
||||||
try {
|
try {
|
||||||
int rec = pdom.getDB().getInt(record + BASECLASS);
|
int rec = pdom.getDB().getInt(record + BASECLASS_SPECIFIER);
|
||||||
return rec != 0 ? new PDOMCPPClassType(pdom, rec) : null;
|
if (rec != 0) {
|
||||||
|
return new PDOMName(pdom, rec);
|
||||||
|
}
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getVisibility() throws DOMException {
|
public IBinding getBaseClass() {
|
||||||
|
try {
|
||||||
|
PDOMName name= getBaseClassSpecifierImpl();
|
||||||
|
if (name != null)
|
||||||
|
return name.getPDOMBinding();
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVisibility() {
|
||||||
try {
|
try {
|
||||||
return getFlags() & 0x3;
|
return getFlags() & 0x3;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
@ -87,7 +101,7 @@ class PDOMCPPBase implements ICPPBase {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVirtual() throws DOMException {
|
public boolean isVirtual() {
|
||||||
try {
|
try {
|
||||||
return (getFlags() & 0x4) != 0;
|
return (getFlags() & 0x4) != 0;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
@ -96,4 +110,7 @@ class PDOMCPPBase implements ICPPBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void delete() throws CoreException {
|
||||||
|
pdom.getDB().free(record);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
|
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -192,13 +193,9 @@ ICPPClassScope, IPDOMMemberOwner, IIndexType {
|
||||||
|
|
||||||
// Visit my base classes
|
// Visit my base classes
|
||||||
for (PDOMCPPBase base = getFirstBase(); base != null; base = base.getNextBase()) {
|
for (PDOMCPPBase base = getFirstBase(); base != null; base = base.getNextBase()) {
|
||||||
try {
|
IBinding baseClass = base.getBaseClass();
|
||||||
IBinding baseClass = base.getBaseClass();
|
if (baseClass != null && baseClass instanceof PDOMCPPClassType)
|
||||||
if (baseClass != null && baseClass instanceof PDOMCPPClassType)
|
((PDOMCPPClassType)baseClass).acceptInHierarchy(visited, visitor);
|
||||||
((PDOMCPPClassType)baseClass).acceptInHierarchy(visited, visitor);
|
|
||||||
} catch (DOMException e) {
|
|
||||||
throw new CoreException(Util.createStatus(e));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,4 +424,26 @@ ICPPClassScope, IPDOMMemberOwner, IIndexType {
|
||||||
public boolean mayHaveChildren() {
|
public boolean mayHaveChildren() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeBase(PDOMName pdomName) throws CoreException {
|
||||||
|
PDOMCPPBase base= getFirstBase();
|
||||||
|
PDOMCPPBase predecessor= null;
|
||||||
|
int nameRec= pdomName.getRecord();
|
||||||
|
while (base != null) {
|
||||||
|
if (base.getBaseClassSpecifierImpl().getRecord() == nameRec) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
predecessor= base;
|
||||||
|
base= base.getNextBase();
|
||||||
|
}
|
||||||
|
if (base != null) {
|
||||||
|
if (predecessor != null) {
|
||||||
|
predecessor.setNextBase(base.getNextBase());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setFirstBase(base.getNextBase());
|
||||||
|
}
|
||||||
|
base.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
* Copyright (c) 2005, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -25,7 +25,6 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||||
|
@ -51,6 +50,7 @@ import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
@ -123,10 +123,6 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
PDOMBinding pdomBinding = addBinding(binding);
|
PDOMBinding pdomBinding = addBinding(binding);
|
||||||
if (pdomBinding instanceof PDOMCPPClassType) {
|
if (pdomBinding instanceof PDOMCPPClassType) {
|
||||||
PDOMCPPClassType pdomClassType= (PDOMCPPClassType) pdomBinding;
|
PDOMCPPClassType pdomClassType= (PDOMCPPClassType) pdomBinding;
|
||||||
IASTNode baseNode= name.getParent();
|
|
||||||
if (baseNode instanceof ICPPASTBaseSpecifier)
|
|
||||||
addBaseClasses(pdomClassType, (ICPPASTBaseSpecifier) baseNode);
|
|
||||||
|
|
||||||
if (binding instanceof ICPPClassType && name.isDefinition()) {
|
if (binding instanceof ICPPClassType && name.isDefinition()) {
|
||||||
addImplicitMethods(pdomClassType, (ICPPClassType) binding);
|
addImplicitMethods(pdomClassType, (ICPPClassType) binding);
|
||||||
}
|
}
|
||||||
|
@ -150,17 +146,6 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
return pdomBinding;
|
return pdomBinding;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addBaseClasses(PDOMCPPClassType pdomBinding, ICPPASTBaseSpecifier baseNode) throws CoreException {
|
|
||||||
ICPPASTCompositeTypeSpecifier ownerNode = (ICPPASTCompositeTypeSpecifier)baseNode.getParent();
|
|
||||||
IBinding ownerBinding = adaptBinding(ownerNode.getName().resolveBinding());
|
|
||||||
if (ownerBinding != null && ownerBinding instanceof PDOMCPPClassType) {
|
|
||||||
PDOMCPPClassType ownerClass = (PDOMCPPClassType)ownerBinding;
|
|
||||||
PDOMCPPBase pdomBase = new PDOMCPPBase(pdom, pdomBinding,
|
|
||||||
baseNode.isVirtual(), baseNode.getVisibility());
|
|
||||||
ownerClass.addBase(pdomBase);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
|
private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
|
||||||
PDOMBinding pdomBinding= null;
|
PDOMBinding pdomBinding= null;
|
||||||
|
|
||||||
|
@ -363,4 +348,38 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
public IBTreeComparator getIndexComparator() {
|
public IBTreeComparator getIndexComparator() {
|
||||||
return new CPPFindBinding.CPPBindingBTreeComparator(pdom);
|
return new CPPFindBinding.CPPBindingBTreeComparator(pdom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onCreateName(PDOMName pdomName, IASTName name) throws CoreException {
|
||||||
|
super.onCreateName(pdomName, name);
|
||||||
|
|
||||||
|
PDOMName derivedClassName= (PDOMName) pdomName.getEnclosingDefinition();
|
||||||
|
if (derivedClassName != null) {
|
||||||
|
IASTNode parentNode= name.getParent();
|
||||||
|
if (parentNode instanceof ICPPASTBaseSpecifier) {
|
||||||
|
ICPPASTBaseSpecifier baseNode= (ICPPASTBaseSpecifier) parentNode;
|
||||||
|
PDOMBinding derivedClassBinding= derivedClassName.getPDOMBinding();
|
||||||
|
if (derivedClassBinding instanceof PDOMCPPClassType) {
|
||||||
|
PDOMCPPClassType ownerClass = (PDOMCPPClassType)derivedClassBinding;
|
||||||
|
PDOMCPPBase pdomBase = new PDOMCPPBase(pdom, pdomName, baseNode.isVirtual(), baseNode.getVisibility());
|
||||||
|
ownerClass.addBase(pdomBase);
|
||||||
|
pdomName.setIsBaseSpecifier(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDeleteName(PDOMName pdomName) throws CoreException {
|
||||||
|
super.onDeleteName(pdomName);
|
||||||
|
|
||||||
|
if (pdomName.isBaseSpecifier()) {
|
||||||
|
PDOMName derivedClassName= (PDOMName) pdomName.getEnclosingDefinition();
|
||||||
|
if (derivedClassName != null) {
|
||||||
|
PDOMBinding derivedClassBinding= derivedClassName.getPDOMBinding();
|
||||||
|
if (derivedClassBinding instanceof PDOMCPPClassType) {
|
||||||
|
PDOMCPPClassType ownerClass = (PDOMCPPClassType)derivedClassBinding;
|
||||||
|
ownerClass.removeBase(pdomName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -12,31 +12,34 @@
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer;
|
package org.eclipse.cdt.internal.core.pdom.indexer;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
||||||
|
|
||||||
abstract public class IndexerASTVisitor extends ASTVisitor {
|
abstract public class IndexerASTVisitor extends ASTVisitor {
|
||||||
private IASTName fDefinitionName;
|
private IASTName fDefinitionName;
|
||||||
private IASTNode fDefinition;
|
private IASTNode fDefinitionNode;
|
||||||
|
|
||||||
public IndexerASTVisitor() {
|
public IndexerASTVisitor() {
|
||||||
shouldVisitNames= true;
|
shouldVisitNames= true;
|
||||||
shouldVisitDeclarations= true;
|
shouldVisitDeclarations= true;
|
||||||
shouldVisitInitializers= true;
|
shouldVisitInitializers= true;
|
||||||
|
shouldVisitDeclSpecifiers= true;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract public void visit(IASTName name, IASTName definitionName);
|
abstract public void visit(IASTName name, IASTName definitionName);
|
||||||
|
|
||||||
final public int visit(IASTName name) {
|
final public int visit(IASTName name) {
|
||||||
if (!(name instanceof ICPPASTQualifiedName)) {
|
if (!(name instanceof ICPPASTQualifiedName)) {
|
||||||
if (fDefinition != null) {
|
if (fDefinitionNode != null) {
|
||||||
if (!fDefinition.contains(name)) {
|
if (!fDefinitionNode.contains(name)) {
|
||||||
fDefinition= null;
|
fDefinitionNode= null;
|
||||||
fDefinitionName= null;
|
fDefinitionName= null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,7 +53,7 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
|
||||||
public int visit(IASTDeclaration decl) {
|
public int visit(IASTDeclaration decl) {
|
||||||
if (decl instanceof IASTFunctionDefinition) {
|
if (decl instanceof IASTFunctionDefinition) {
|
||||||
IASTFunctionDefinition fdef= (IASTFunctionDefinition) decl;
|
IASTFunctionDefinition fdef= (IASTFunctionDefinition) decl;
|
||||||
fDefinition= decl;
|
fDefinitionNode= decl;
|
||||||
fDefinitionName= fdef.getDeclarator().getName();
|
fDefinitionName= fdef.getDeclarator().getName();
|
||||||
if (fDefinitionName instanceof ICPPASTQualifiedName) {
|
if (fDefinitionName instanceof ICPPASTQualifiedName) {
|
||||||
fDefinitionName= ((ICPPASTQualifiedName) fDefinitionName).getLastName();
|
fDefinitionName= ((ICPPASTQualifiedName) fDefinitionName).getLastName();
|
||||||
|
@ -59,15 +62,57 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
|
||||||
}
|
}
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int visit(IASTInitializer initializer) {
|
// leave methods don't get called correctly: bug 152846
|
||||||
if (fDefinition == null) {
|
// public int leave(IASTDeclaration decl) {
|
||||||
IASTNode cand= initializer.getParent();
|
// if (decl == fDefinitionNode) {
|
||||||
if (cand instanceof IASTDeclarator) {
|
// fDefinitionNode= null;
|
||||||
fDefinition= cand;
|
// fDefinitionName= null;
|
||||||
fDefinitionName= ((IASTDeclarator) fDefinition).getName();
|
// }
|
||||||
|
// return PROCESS_CONTINUE;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public int visit(IASTDeclSpecifier declspec) {
|
||||||
|
if (declspec instanceof ICPPASTCompositeTypeSpecifier) {
|
||||||
|
if (fDefinitionNode == null || !fDefinitionNode.contains(declspec)) {
|
||||||
|
ICPPASTCompositeTypeSpecifier cts= (ICPPASTCompositeTypeSpecifier) declspec;
|
||||||
|
fDefinitionNode= declspec;
|
||||||
|
fDefinitionName= cts.getName();
|
||||||
|
if (fDefinitionName instanceof ICPPASTQualifiedName) {
|
||||||
|
fDefinitionName= ((ICPPASTQualifiedName) fDefinitionName).getLastName();
|
||||||
|
}
|
||||||
|
visit(fDefinitionName, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// leave methods don't get called correctly: bug 152846
|
||||||
|
// public int leave(IASTDeclSpecifier declspec) {
|
||||||
|
// if (declspec == fDefinitionNode) {
|
||||||
|
// fDefinitionNode= null;
|
||||||
|
// fDefinitionName= null;
|
||||||
|
// }
|
||||||
|
// return PROCESS_CONTINUE;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public int visit(IASTInitializer initializer) {
|
||||||
|
if (fDefinitionNode == null) {
|
||||||
|
IASTNode cand= initializer.getParent();
|
||||||
|
if (cand instanceof IASTDeclarator) {
|
||||||
|
fDefinitionNode= cand;
|
||||||
|
fDefinitionName= ((IASTDeclarator) cand).getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PROCESS_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// leave methods don't get called correctly: bug 152846
|
||||||
|
// public int leave(IASTInitializer initializer) {
|
||||||
|
// if (fDefinitionNode == initializer) {
|
||||||
|
// fDefinitionNode= null;
|
||||||
|
// fDefinitionName= null;
|
||||||
|
// }
|
||||||
|
// return PROCESS_CONTINUE;
|
||||||
|
// }
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue