1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

bug 90817: promote caching methods to IScope and support remove binding

This commit is contained in:
Andrew Niefer 2005-04-19 17:45:50 +00:00
parent bd75012bd8
commit e832d582ff
10 changed files with 170 additions and 147 deletions

View file

@ -1,5 +1,5 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
@ -48,4 +48,56 @@ public interface IScope {
* @return
*/
public IASTNode getPhysicalNode() throws DOMException;
/**
* The IScope serves as a mechanism for caching IASTNames and bindings to
* speed up resolution.
*/
/**
* Add an IASTName to be cached in this scope
*
* @param name
* @throws DOMException
*/
public void addName(IASTName name) throws DOMException;
/**
* remove the given binding from this scope
*
* @param binding
* @throws DOMException
*/
void removeBinding(IBinding binding) throws DOMException;
/**
* Get 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 == false and the appropriate binding
* has not yet been resolved.
*
* @param name
* @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 null
* @throws DOMException
*/
public IBinding getBinding(IASTName name, boolean resolve)
throws DOMException;
/**
* Set whether or not all the names in this scope have been cached
*
* @param b
*/
public void setFullyCached(boolean b) throws DOMException;
/**
* whether or not this scope's cache contains all the names
*
* @return
*/
public boolean isFullyCached() throws DOMException;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
@ -14,57 +14,10 @@
*/
package org.eclipse.cdt.core.dom.ast.c;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
/**
* @author aniefer
*/
public interface ICScope extends IScope {
/**
* remove the given binding from this scope
*
* @param binding
* @throws DOMException
*/
void removeBinding(IBinding binding) throws DOMException;
/**
* Add an IASTName to be cached in this scope
*
* @param name
* @throws DOMException
*/
public void addName(IASTName name) throws DOMException;
/**
* Get the binding that the given name would resolve to in this scope. Could
* return null if there is no matching binding in this scope, or if resolve ==
* false and the appropriate binding has not yet been resolved.
*
* @param name
* @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 null
* @throws DOMException
*/
public IBinding getBinding(IASTName name, boolean resolve)
throws DOMException;
/**
* Set whether or not all the names in this scope have been cached
*
* @param b
*/
public void setFullyCached(boolean b) throws DOMException;
/**
* whether or not this scope's cache contains all the names
*
* @return
*/
public boolean isFullyCached() throws DOMException;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
@ -13,53 +13,11 @@
*/
package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
/**
* The ICPPScope serves as a mechanism for caching IASTNames and bindings to
* speed up resolution.
*
* @author aniefer
*/
public interface ICPPScope extends IScope {
/**
* Add an IASTName to be cached in this scope
*
* @param name
* @throws DOMException
*/
public void addName(IASTName name) throws DOMException;
/**
* Get the binding that the given name would resolve to in this scope. Could
* return null if there is no matching binding in this scope, or if resolve ==
* false and the appropriate binding has not yet been resolved.
*
* @param name
* @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 null
* @throws DOMException
*/
public IBinding getBinding(IASTName name, boolean resolve)
throws DOMException;
/**
* Set whether or not all the names in this scope have been cached
*
* @param b
*/
public void setFullyCached(boolean b) throws DOMException;
/**
* whether or not this scope's cache contains all the names
*
* @return
*/
public boolean isFullyCached() throws DOMException;
}

View file

@ -143,7 +143,41 @@ public class ProblemBinding implements IProblemBinding, IType, IScope {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getScopeName()
*/
public IASTName getScopeName() throws DOMException {
public IASTName getScopeName() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#addName(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public void addName( IASTName name ) throws DOMException {
throw new DOMException( this );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
*/
public void removeBinding( IBinding binding ) throws DOMException {
throw new DOMException( this );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getBinding(org.eclipse.cdt.core.dom.ast.IASTName, boolean)
*/
public IBinding getBinding( IASTName name, boolean resolve ) throws DOMException {
throw new DOMException( this );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#setFullyCached(boolean)
*/
public void setFullyCached( boolean b ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#isFullyCached()
*/
public boolean isFullyCached() throws DOMException {
throw new DOMException( this );
}
}

View file

@ -192,7 +192,7 @@ public class CScope implements ICScope {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getScopeName()
*/
public IASTName getScopeName() throws DOMException {
public IASTName getScopeName() {
if( physicalNode instanceof IASTCompositeTypeSpecifier ){
return ((IASTCompositeTypeSpecifier) physicalNode).getName();
}

View file

@ -13,7 +13,6 @@
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
@ -28,7 +27,7 @@ public class CPPBlockScope extends CPPNamespaceScope implements ICPPBlockScope {
super( physicalNode );
}
public IASTName getScopeName() throws DOMException{
public IASTName getScopeName(){
IASTNode node = getPhysicalNode();
if( node instanceof IASTCompoundStatement && node.getParent() instanceof IASTFunctionDefinition ){
return ((IASTFunctionDefinition)node.getParent()).getDeclarator().getName();

View file

@ -21,8 +21,8 @@ import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.ObjectMap;
@ -195,4 +195,25 @@ public class CPPClassInstanceScope implements ICPPClassScope {
ICPPClassScope scope = (ICPPClassScope) getOriginalClass().getCompositeScope();
return scope.getPhysicalNode();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
*/
public void removeBinding(IBinding binding) {
char [] name = binding.getNameCharArray();
if( ! bindings.containsKey( name ) )
return;
Object obj = bindings.get( name );
if( obj instanceof ObjectSet ){
ObjectSet set = (ObjectSet) obj;
set.remove( binding );
if( set.size() == 0 )
bindings.remove( name, 0, name.length );
} else {
bindings.remove( name, 0, name.length );
}
isFullyCached = false;
}
}

View file

@ -58,12 +58,7 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
private void createImplicitMembers(){
//create bindings for the implicit members, if the user declared them then those declarations
//will resolve to these bindings.
ICPPASTCompositeTypeSpecifier compTypeSpec;
try {
compTypeSpec = (ICPPASTCompositeTypeSpecifier) getPhysicalNode();
} catch ( DOMException e ) {
return;
}
ICPPASTCompositeTypeSpecifier compTypeSpec = (ICPPASTCompositeTypeSpecifier) getPhysicalNode();
IASTName name = compTypeSpec.getName();
if( name instanceof ICPPASTQualifiedName ){
@ -118,10 +113,13 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
char [] c = binding.getNameCharArray();
Object o = bindings.get( c );
if( o != null ){
if( o instanceof Object[] ){
bindings.put( c, ArrayUtil.append( Object.class, (Object[]) o, binding ) );
if( o instanceof ObjectSet ){
((ObjectSet)o).put( binding );
} else {
bindings.put( c, new Object[] { o, binding } );
ObjectSet set = new ObjectSet(2);
set.put( o );
set.put( binding );
bindings.put( c, set );
}
} else {
bindings.put( c, binding );
@ -228,12 +226,7 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope#getClassType()
*/
public ICPPClassType getClassType() {
ICPPASTCompositeTypeSpecifier compSpec;
try {
compSpec = (ICPPASTCompositeTypeSpecifier) getPhysicalNode();
} catch (DOMException e) {
return null;
}
ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) getPhysicalNode();
return (ICPPClassType) compSpec.getName().resolveBinding();
}
@ -250,11 +243,24 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPScope#getScopeName()
*/
public IASTName getScopeName() throws DOMException {
public IASTName getScopeName() {
IASTNode node = getPhysicalNode();
if( node instanceof ICPPASTCompositeTypeSpecifier ){
return ((ICPPASTCompositeTypeSpecifier)node).getName();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
*/
public void removeBinding(IBinding binding) {
if( binding instanceof ICPPConstructor ){
if( constructorBindings.containsKey( binding ) )
constructorBindings.remove( binding );
setFullyCached( false );
} else {
super.removeBinding( binding );
}
}
}

View file

@ -101,7 +101,7 @@ public class CPPFunctionScope extends CPPScope implements ICPPFunctionScope {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope#getBodyScope()
*/
public IScope getBodyScope() throws DOMException {
public IScope getBodyScope() {
IASTFunctionDeclarator fnDtor = (IASTFunctionDeclarator) getPhysicalNode();
IASTNode parent = fnDtor.getParent();
if( parent instanceof IASTFunctionDefinition ){
@ -116,7 +116,7 @@ public class CPPFunctionScope extends CPPScope implements ICPPFunctionScope {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPScope#getScopeName()
*/
public IASTName getScopeName() throws DOMException {
public IASTName getScopeName() {
IASTNode node = getPhysicalNode();
if( node instanceof ICPPASTFunctionDeclarator ){
return ((ICPPASTFunctionDeclarator)node).getName();

View file

@ -35,38 +35,9 @@ abstract public class CPPScope implements ICPPScope{
public CPPScopeProblem( IASTNode node, int id, char[] arg ) {
super( node, id, arg );
}
public void addName( IASTName name ) throws DOMException {
throw new DOMException( this );
}
public IBinding getBinding( IASTName name, boolean resolve ) throws DOMException {
throw new DOMException( this );
}
public IScope getParent() throws DOMException {
throw new DOMException( this );
}
public IBinding[] find( String name ) throws DOMException {
throw new DOMException( this );
}
public void setFullyCached(boolean b) {
}
public boolean isFullyCached() {
return false;
}
public IASTName getScopeName() throws DOMException {
throw new DOMException( this );
}
}
public static class CPPTemplateProblem extends CPPScopeProblem {
public CPPTemplateProblem( IASTNode node, int id, char[] arg) {
super( node, id, arg);
}
}
private IASTNode physicalNode;
private IASTNode physicalNode;
public CPPScope( IASTNode physicalNode ) {
this.physicalNode = physicalNode;
}
@ -78,7 +49,7 @@ abstract public class CPPScope implements ICPPScope{
return CPPVisitor.getContainingScope( physicalNode );
}
public IASTNode getPhysicalNode() throws DOMException{
public IASTNode getPhysicalNode() {
return physicalNode;
}
@ -99,7 +70,6 @@ abstract public class CPPScope implements ICPPScope{
if( o != null ){
if( o instanceof ObjectSet ){
((ObjectSet)o).put( name );
//bindings.put( c, ArrayUtil.append( Object.class, (Object[]) o, name ) );
} else {
ObjectSet temp = new ObjectSet( 2 );
temp.put( o );
@ -167,6 +137,36 @@ abstract public class CPPScope implements ICPPScope{
return isfull;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
*/
public void removeBinding(IBinding binding) {
char [] name = binding.getNameCharArray();
if( ! bindings.containsKey( name ) )
return;
Object obj = bindings.get( name );
if( obj instanceof ObjectSet ){
ObjectSet set = (ObjectSet) obj;
for ( int i = set.size() - 1; i > 0; i-- ) {
Object o = set.keyAt( i );
if( (o instanceof IBinding && o == binding) ||
(o instanceof IASTName && ((IASTName)o).getBinding() == binding) )
{
set.remove( o );
}
}
if( set.size() == 0 )
bindings.remove( name, 0, name.length );
} else if( (obj instanceof IBinding && obj == binding) ||
(obj instanceof IASTName && ((IASTName)obj).getBinding() == binding) )
{
bindings.remove( name, 0, name.length );
}
isfull = false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String)
*/