From da6d9d1a661106c20ac1f3c8bf035974e3bce71e Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 18 Dec 2007 12:30:54 +0000 Subject: [PATCH] Fixes exceptions parsing c-files, bug 213287 --- .../internal/index/tests/IndexBugsTests.java | 4 +- .../internal/core/dom/parser/c/CFunction.java | 3 +- .../internal/core/dom/parser/c/CVisitor.java | 76 ++++++++++--------- .../cdt/internal/core/pdom/PDOMWriter.java | 3 + 4 files changed, 47 insertions(+), 39 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index b839174f036..d88739f3dbf 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -1168,7 +1168,7 @@ public class IndexBugsTests extends BaseTestCase { fIndex.acquireReadLock(); try { IIndexBinding[] bindings = fIndex.findBindings("staticInHeader".toCharArray(), - IndexFilter.ALL, NPM); + IndexFilter.C_DECLARED_OR_IMPLICIT, NPM); IFunction func = (IFunction) bindings[0]; assertTrue(func.isStatic()); IIndexName[] refs = fIndex.findReferences(func); @@ -1195,7 +1195,7 @@ public class IndexBugsTests extends BaseTestCase { fIndex.acquireReadLock(); try { IIndexBinding[] bindings = fIndex.findBindings("staticConstInHeader".toCharArray(), - IndexFilter.ALL, NPM); + IndexFilter.C_DECLARED_OR_IMPLICIT, NPM); IVariable var = (IVariable) bindings[0]; assertTrue(var.isStatic()); IIndexName[] refs = fIndex.findReferences(var); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java index 313ef3c0cdd..b0d9447e74a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java @@ -34,7 +34,6 @@ import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.Linkage; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.PlatformObject; @@ -110,7 +109,7 @@ public class CFunction extends PlatformObject implements IFunction, ICInternalFu bits |= RESOLUTION_IN_PROGRESS; IASTTranslationUnit tu = getTranslationUnit(); if( tu != null ){ - CPPVisitor.getDeclarations( tu, this ); + CVisitor.getDeclarations( tu, this ); } declarators = (IASTStandardFunctionDeclarator[]) ArrayUtil.trim( IASTStandardFunctionDeclarator.class, declarators ); bits |= FULLY_RESOLVED; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index 79ab33bf59a..46ccf27fb22 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -91,7 +91,6 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; -import org.eclipse.cdt.core.dom.ast.c.ICScope; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTSimpleDeclSpecifier; @@ -119,9 +118,8 @@ public class CVisitor { } public int visit(IASTName name) { if ( name.getBinding() != null ) { - ICScope scope; try { - scope = (ICScope)name.resolveBinding().getScope(); + IScope scope = name.resolveBinding().getScope(); if ( scope != null ) ASTInternal.removeBinding(scope, name.resolveBinding()); } catch ( DOMException e ) { @@ -492,13 +490,14 @@ public class CVisitor { private static IBinding createBinding( ICASTEnumerationSpecifier enumeration ){ IASTName name = enumeration.getName(); - ICScope scope = (ICScope) getContainingScope( enumeration ); - IBinding binding; - try { - binding = scope.getBinding( name, false ); - } catch ( DOMException e ) { - binding = null; - } + IScope scope = getContainingScope( enumeration ); + IBinding binding= null; + if (scope != null) { + try { + binding = scope.getBinding( name, false ); + } catch ( DOMException e ) { + } + } if (binding != null && !(binding instanceof IIndexBinding)) { if (binding instanceof IEnumeration) { if (binding instanceof CEnumeration) { @@ -721,9 +720,11 @@ public class CVisitor { int op = ((IASTUnaryExpression)expression).getOperator(); if( op == IASTUnaryExpression.op_sizeof ){ IScope scope = getContainingScope( expression ); - IBinding [] bs = scope.find( SIZE_T ); - if( bs.length > 0 && bs[0] instanceof IType ){ - return (IType) bs[0]; + if (scope != null) { + IBinding [] bs = scope.find( SIZE_T ); + if( bs.length > 0 && bs[0] instanceof IType ){ + return (IType) bs[0]; + } } return new CBasicType( IBasicType.t_int, CBasicType.IS_LONG | CBasicType.IS_UNSIGNED, expression ); } @@ -815,7 +816,7 @@ public class CVisitor { } if ( declarator.getParent() instanceof IASTFunctionDefinition ) { - ICScope scope = (ICScope) ((IASTCompoundStatement)((IASTFunctionDefinition)declarator.getParent()).getBody()).getScope(); + IScope scope = ((IASTCompoundStatement)((IASTFunctionDefinition)declarator.getParent()).getBody()).getScope(); if ( scope != null && binding != null ) try { ASTInternal.addName( scope, name); @@ -854,7 +855,7 @@ public class CVisitor { } while (node instanceof IASTDeclarator); - ICScope scope = (ICScope) getContainingScope( parent ); + IScope scope = getContainingScope( parent ); ASTNodeProperty prop = parent.getPropertyInParent(); if( prop == IASTDeclarationStatement.DECLARATION ){ @@ -941,19 +942,21 @@ public class CVisitor { private static IBinding createBinding( ICASTCompositeTypeSpecifier compositeTypeSpec ){ - ICScope scope = null; + IScope scope = null; IBinding binding = null; IASTName name = compositeTypeSpec.getName(); try { - scope = (ICScope) getContainingScope( compositeTypeSpec ); + scope = getContainingScope( compositeTypeSpec ); while( scope instanceof ICCompositeTypeScope ) - scope = (ICScope) scope.getParent(); + scope = scope.getParent(); - binding = scope.getBinding( name, false ); - if( binding != null && !(binding instanceof IIndexBinding)){ - if (binding instanceof CStructure) - ((CStructure)binding).addDefinition( compositeTypeSpec ); - return binding; + if (scope != null) { + binding = scope.getBinding( name, false ); + if( binding != null && !(binding instanceof IIndexBinding)){ + if (binding instanceof CStructure) + ((CStructure)binding).addDefinition( compositeTypeSpec ); + return binding; + } } } catch (DOMException e2) { } @@ -961,8 +964,8 @@ public class CVisitor { binding = new CStructure( name ); try { - scope = (ICScope) binding.getScope(); - ASTInternal.addName( scope, name ); + scope= binding.getScope(); + ASTInternal.addName(scope, name); } catch ( DOMException e ) { } @@ -1094,6 +1097,9 @@ public class CVisitor { return null; } + /** + * May return null, e.g. for parameter names in function-prototypes. + */ public static IScope getContainingScope( IASTNode node ){ if( node == null ) return null; @@ -1122,7 +1128,7 @@ public class CVisitor { parent = ((IASTDeclarator)parent).getParent(); if ( parent instanceof IASTFunctionDefinition ) return ((IASTCompoundStatement)((IASTFunctionDefinition)parent).getBody()).getScope(); - return null; + return null; // parameter name in function declarations } } else if( node instanceof IASTEnumerator ){ @@ -1206,10 +1212,10 @@ public class CVisitor { IASTNode parent = blockItem.getParent(); IASTNode [] nodes = null; - ICScope scope = null; + IScope scope = null; if( parent instanceof IASTCompoundStatement ){ IASTCompoundStatement compound = (IASTCompoundStatement) parent; - scope = (ICScope) compound.getScope(); + scope = compound.getScope(); if( parent.getParent() instanceof IASTFunctionDefinition ){ IASTFunctionDeclarator dtor = ((IASTFunctionDefinition)parent.getParent()).getDeclarator(); @@ -1225,7 +1231,7 @@ public class CVisitor { IASTTranslationUnit translation = (IASTTranslationUnit) parent; if (!prefix) { nodes = translation.getDeclarations(); - scope = (ICScope) translation.getScope(); + scope = translation.getScope(); } else { // The index will be search later, still we need to look at the declarations found in // the AST, bug 180883 @@ -1235,11 +1241,11 @@ public class CVisitor { } else if( parent instanceof IASTStandardFunctionDeclarator ){ IASTStandardFunctionDeclarator dtor = (IASTStandardFunctionDeclarator) parent; nodes = dtor.getParameters(); - scope = (ICScope) getContainingScope( blockItem ); + scope = getContainingScope( blockItem ); } else if( parent instanceof ICASTKnRFunctionDeclarator ){ ICASTKnRFunctionDeclarator dtor = (ICASTKnRFunctionDeclarator) parent; nodes = dtor.getParameterDeclarations(); - scope = (ICScope) getContainingScope( blockItem ); + scope = getContainingScope( blockItem ); } boolean typesOnly = (bits & TAGS) != 0; @@ -1401,7 +1407,7 @@ public class CVisitor { return external; } - private static IASTName checkForBinding( ICScope scope, IASTDeclSpecifier declSpec, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ + private static IASTName checkForBinding( IScope scope, IASTDeclSpecifier declSpec, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ IASTName tempName = null; IASTName resultName = null; char [] n = name.toCharArray(); @@ -1485,7 +1491,7 @@ public class CVisitor { return prefixMap; } - private static IASTName checkForBinding( ICScope scope, IASTParameterDeclaration paramDecl, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ + private static IASTName checkForBinding( IScope scope, IASTParameterDeclaration paramDecl, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ if( paramDecl == null ) return null; IASTDeclarator dtor = paramDecl.getDeclarator(); @@ -1513,7 +1519,7 @@ public class CVisitor { * if not a prefix lookup, returns IASTName * if doing prefix lookup, results are in prefixMap, returns null */ - private static IASTName checkForBinding( ICScope scope, IASTNode node, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ + private static IASTName checkForBinding( IScope scope, IASTNode node, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ if( node instanceof IASTDeclaration ){ return checkForBinding( scope, (IASTDeclaration) node, name, typesOnly, prefixMap ); } else if( node instanceof IASTParameterDeclaration ){ @@ -1528,7 +1534,7 @@ public class CVisitor { } return null; } - private static IASTName checkForBinding( ICScope scope, IASTDeclaration declaration, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ + private static IASTName checkForBinding( IScope scope, IASTDeclaration declaration, IASTName name, boolean typesOnly, CharArrayObjectMap prefixMap ) throws DOMException{ char [] n = name.toCharArray(); IASTName tempName = null; IASTName resultName = null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java index cbf5c3881a1..49c5a4ad0ca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java @@ -51,6 +51,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.osgi.util.NLS; /** @@ -142,6 +143,8 @@ abstract public class PDOMWriter { if (msg.equals(status.getMessage())) { throw new CoreException(status); } + throw new CoreException(new Status(status.getSeverity(), status.getPlugin(), status.getCode(), + msg + ':' + status.getMessage(), status.getException())); } throw new CoreException(new MultiStatus(CCorePlugin.PLUGIN_ID, 0, (IStatus[]) stati.toArray(new IStatus[stati.size()]), msg, null));