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 fa7e4b806d6..e82dac7cfd9 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
@@ -1090,4 +1090,89 @@ public class IndexBugsTests extends BaseTestCase {
IFunctionType ft= ((IFunction) bindings[0]).getType();
assertEquals("void (long long)", ASTTypeUtil.getType(ft));
}
+
+ // static inline void staticInHeader() {};
+
+ // #include "header.h"
+ // void f1() {
+ // staticInHeader();
+ // }
+ public void testStaticFunctionsInHeader_Bug180305() throws Exception {
+ StringBuffer[] contents= getContentsForTest(2);
+ final IIndexManager indexManager = CCorePlugin.getIndexManager();
+ TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source1.cpp", contents[1].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source2.cpp", contents[1].toString());
+ indexManager.reindex(fCProject);
+ waitForIndexer();
+ IIndexBinding[] bindings= fIndex.findBindings("staticInHeader".toCharArray(), IndexFilter.ALL, NPM);
+ IFunction func= (IFunction) bindings[0];
+ assertTrue(func.isStatic());
+ IIndexName[] refs= fIndex.findReferences(func);
+ assertEquals(2, refs.length);
+ }
+
+ // static const int staticConstInHeader= 12;
+
+ // #include "header.h"
+ // void f1() {
+ // int a= staticConstInHeader;
+ // }
+ public void testStaticVariableInHeader_Bug180305() throws Exception {
+ StringBuffer[] contents= getContentsForTest(2);
+ final IIndexManager indexManager = CCorePlugin.getIndexManager();
+ TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source1.cpp", contents[1].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source2.cpp", contents[1].toString());
+ indexManager.reindex(fCProject);
+ waitForIndexer();
+ IIndexBinding[] bindings= fIndex.findBindings("staticConstInHeader".toCharArray(), IndexFilter.ALL, NPM);
+ IVariable var= (IVariable) bindings[0];
+ assertTrue(var.isStatic());
+ IIndexName[] refs= fIndex.findReferences(var);
+ assertEquals(2, refs.length);
+ }
+
+ // static inline void staticInHeader() {};
+
+ // #include "header.h"
+ // void f1() {
+ // staticInHeader();
+ // }
+ public void testStaticFunctionsInHeaderC_Bug180305() throws Exception {
+ StringBuffer[] contents= getContentsForTest(2);
+ final IIndexManager indexManager = CCorePlugin.getIndexManager();
+ TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source1.c", contents[1].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source2.c", contents[1].toString());
+ indexManager.reindex(fCProject);
+ waitForIndexer();
+ IIndexBinding[] bindings= fIndex.findBindings("staticInHeader".toCharArray(), IndexFilter.ALL, NPM);
+ IFunction func= (IFunction) bindings[0];
+ assertTrue(func.isStatic());
+ IIndexName[] refs= fIndex.findReferences(func);
+ assertEquals(2, refs.length);
+ }
+
+ // static const int staticConstInHeader= 12;
+
+ // #include "header.h"
+ // void f1() {
+ // int a= staticConstInHeader;
+ // }
+ public void testStaticVariableInHeaderC_Bug180305() throws Exception {
+ StringBuffer[] contents= getContentsForTest(2);
+ final IIndexManager indexManager = CCorePlugin.getIndexManager();
+ TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source1.c", contents[1].toString());
+ TestSourceReader.createFile(fCProject.getProject(), "source2.c", contents[1].toString());
+ indexManager.reindex(fCProject);
+ waitForIndexer();
+ IIndexBinding[] bindings= fIndex.findBindings("staticConstInHeader".toCharArray(), IndexFilter.ALL, NPM);
+ IVariable var= (IVariable) bindings[0];
+ assertTrue(var.isStatic());
+ IIndexName[] refs= fIndex.findReferences(var);
+ assertEquals(2, refs.length);
+ }
+
}
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
index 61adf23500d..5158443d028 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
@@ -766,6 +766,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
ILanguage language= configureWith.getLanguage();
fLanguageOfContext= language;
if (language != null) {
+ IASTTranslationUnit ast= null;
if (language instanceof AbstractLanguage) {
int options= 0;
if ((style & AST_SKIP_FUNCTION_BODIES) != 0) {
@@ -774,9 +775,15 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
if ((style & AST_CREATE_COMMENT_NODES) != 0) {
options |= AbstractLanguage.OPTION_ADD_COMMENTS;
}
- return ((AbstractLanguage)language).getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, options, ParserUtil.getParserLogService());
+ ast= ((AbstractLanguage)language).getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, options, ParserUtil.getParserLogService());
}
- return language.getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService());
+ else {
+ ast= language.getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService());
+ }
+ if (ast != null) {
+ ast.setIsHeaderUnit(isHeaderUnit());
+ }
+ return ast;
}
}
return null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java
index dd61943458d..1ddd1cbd6e8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java
@@ -1,13 +1,13 @@
/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM - Initial API and implementation
- * Markus Schorn (Wind River Systems)
+ * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.core.dom.ast;
@@ -32,7 +32,7 @@ public interface IASTNode {
/**
* Get the location of this node. In cases not involving macro expansions,
* the IASTNodeLocation [] result will only have one element in it, and it
- * will be an IASTFileLocation or subinterface.
+ * will be an IASTFileLocation or sub-interface.
*
* Where the node is completely generated within a macro expansion,
* IASTNodeLocation [] result will have one element in it, and it will be an
@@ -65,6 +65,12 @@ public interface IASTNode {
*/
public String getContainingFilename();
+ /**
+ * Lightweight check to see whether this node is part of the root file.
+ * @since 5.0
+ */
+ public boolean isPartOfTranslationUnitFile();
+
/**
* Get the parent node of this node in the tree.
*
@@ -96,7 +102,7 @@ public interface IASTNode {
public void setPropertyInParent(ASTNodeProperty property);
/**
- * Abstract method to be overriden by all subclasses. Necessary for
+ * Abstract method to be overridden by all subclasses. Necessary for
* visitation of the tree using an ASTVisitor
.
*
* @param visitor
@@ -116,7 +122,7 @@ public interface IASTNode {
/**
* Returns whether this node contains the given one. The decision is made
- * purly on location information and therefore the method is fast.
+ * purely on location information and therefore the method is fast.
* @param node the node to check
* @return whether this node contains the given one.
* @since 4.0
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
index a8080b346b1..e41814cea46 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
@@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.cdt.core.dom.ast;
+import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.parser.ParserLanguage;
@@ -261,5 +262,20 @@ public interface IASTTranslationUnit extends IASTNode, IAdaptable {
* @since 4.0
*/
public IASTComment[] getComments();
-
+
+
+ /**
+ * Returns the linkage this ast was parsed in
+ */
+ public ILinkage getLinkage();
+
+ /**
+ * Returns whether this ast represents a header file.
+ */
+ public boolean isHeaderUnit();
+
+ /**
+ * Sets whether this ast represents a header file.
+ */
+ public void setIsHeaderUnit(boolean headerUnit);
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java
index c17676d93a4..8913f35e4fc 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java
@@ -17,8 +17,12 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IScope;
+import org.eclipse.cdt.core.dom.ast.IVariable;
+import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalFunction;
+import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalVariable;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalVariable;
/**
* Access to methods on scopes and bindings internal to the parser.
@@ -78,10 +82,23 @@ public class ASTInternal {
}
}
- public static boolean isStatic(IFunction func, boolean resolveAll) throws DOMException {
+ public static boolean isStatic(IFunction func, boolean resolveAll, boolean checkHeaders) throws DOMException {
if (func instanceof ICPPInternalFunction) {
- return ((ICPPInternalFunction)func).isStatic(resolveAll);
+ return ((ICPPInternalFunction)func).isStatic(resolveAll, checkHeaders);
+ }
+ if (func instanceof ICInternalFunction) {
+ return ((ICInternalFunction) func).isStatic(resolveAll, checkHeaders);
}
return func.isStatic();
}
+
+ public static boolean isStatic(IVariable var, boolean checkHeaders) throws DOMException {
+ if (var instanceof ICPPInternalVariable) {
+ return ((ICPPInternalVariable)var).isStatic(checkHeaders);
+ }
+ if (var instanceof ICInternalVariable) {
+ return ((ICInternalVariable)var).isStatic(checkHeaders);
+ }
+ return var.isStatic();
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java
index fa2ff7fca3e..b57717e7b83 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java
@@ -159,6 +159,17 @@ public abstract class ASTNode implements IASTNode {
return fileLocation;
}
+ public boolean isPartOfTranslationUnitFile() {
+ IASTTranslationUnit ast = getTranslationUnit();
+ if (ast != null) {
+ ILocationResolver lr= (ILocationResolver) ast.getAdapter(ILocationResolver.class);
+ if (lr != null) {
+ return lr.isPartOfTranslationUnitFile(offset);
+ }
+ }
+ return false;
+ }
+
public IASTTranslationUnit getTranslationUnit() {
return parent != null ? parent.getTranslationUnit() : null;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
index 0cb2863975f..d10a23317e9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
@@ -13,6 +13,7 @@
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
@@ -45,6 +46,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ASTComment;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ASTPreprocessorSelectionResult;
@@ -83,7 +85,8 @@ public class CASTTranslationUnit extends CASTNode implements
private static final IASTName[] EMPTY_NAME_ARRAY = new IASTName[0];
- private IASTComment[] comments = new ASTComment[0];
+ private IASTComment[] comments = new ASTComment[0];
+ private boolean fIsHeader;
public IASTTranslationUnit getTranslationUnit() {
return this;
@@ -614,4 +617,16 @@ public class CASTTranslationUnit extends CASTNode implements
}
return null;
}
+
+ public ILinkage getLinkage() {
+ return Linkage.C_LINKAGE;
+ }
+
+ public boolean isHeaderUnit() {
+ return fIsHeader;
+ }
+
+ public void setIsHeaderUnit(boolean headerUnit) {
+ fIsHeader= headerUnit;
+ }
}
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 e4db731bef1..313ef3c0cdd 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
@@ -6,8 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM Rational Software - Initial API and implementation
- * Markus Schorn (Wind River Systems)
+ * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
@@ -335,18 +335,31 @@ public class CFunction extends PlatformObject implements IFunction, ICInternalFu
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
*/
public boolean isStatic() {
- return hasStorageClass( IASTDeclSpecifier.sc_static );
+ return isStatic(true, true);
}
-
- public boolean hasStorageClass( int storage ){
- if( (bits & FULLY_RESOLVED) == 0 ){
+
+ public boolean isStatic(boolean resolveAll, boolean checkHeaders) {
+ if( resolveAll && (bits & FULLY_RESOLVED) == 0 ){
resolveAllDeclarations();
}
+ return hasStorageClass( IASTDeclSpecifier.sc_static, checkHeaders );
+ }
+
+ public boolean hasStorageClass( int storage, boolean checkHeaders){
IASTDeclarator dtor = definition;
IASTDeclarator[] ds = declarators;
+
+ boolean useDeclsInRoot= checkHeaders;
int i = -1;
do{
if( dtor != null ){
+ if (!useDeclsInRoot) {
+ if (dtor.getTranslationUnit().isHeaderUnit()) {
+ return false;
+ }
+ useDeclsInRoot= true;
+ }
+
IASTNode parent = dtor.getParent();
while( !(parent instanceof IASTDeclaration) )
parent = parent.getParent();
@@ -357,8 +370,11 @@ public class CFunction extends PlatformObject implements IFunction, ICInternalFu
} else if( parent instanceof IASTFunctionDefinition )
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
- if( declSpec.getStorageClass() == storage )
- return true;
+ if( declSpec.getStorageClass() == storage ) {
+ if (checkHeaders || declSpec.isPartOfTranslationUnitFile()) {
+ return true;
+ }
+ }
}
if( ds != null && ++i < ds.length )
@@ -373,21 +389,34 @@ public class CFunction extends PlatformObject implements IFunction, ICInternalFu
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
*/
public boolean isExtern() {
- return hasStorageClass( IASTDeclSpecifier.sc_extern );
+ return isExtern(true);
+ }
+
+ public boolean isExtern(boolean resolveAll) {
+ if( resolveAll && (bits & FULLY_RESOLVED) == 0 ){
+ resolveAllDeclarations();
+ }
+ return hasStorageClass( IASTDeclSpecifier.sc_extern, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
*/
public boolean isAuto() {
- return hasStorageClass( IASTDeclSpecifier.sc_auto );
+ if( (bits & FULLY_RESOLVED) == 0 ){
+ resolveAllDeclarations();
+ }
+ return hasStorageClass( IASTDeclSpecifier.sc_auto, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
*/
public boolean isRegister() {
- return hasStorageClass( IASTDeclSpecifier.sc_register );
+ if( (bits & FULLY_RESOLVED) == 0 ){
+ resolveAllDeclarations();
+ }
+ return hasStorageClass( IASTDeclSpecifier.sc_register, true);
}
/* (non-Javadoc)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java
index bcdda3c0134..7ee176c575a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java
@@ -1,13 +1,13 @@
/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM Rational Software - Initial API and implementation
- * Markus Schorn (Wind River Systems)
+ * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
@@ -32,7 +32,7 @@ import org.eclipse.core.runtime.PlatformObject;
* Created on Nov 5, 2004
* @author aniefer
*/
-public class CVariable extends PlatformObject implements IVariable, ICInternalBinding {
+public class CVariable extends PlatformObject implements IVariable, ICInternalVariable {
public static class CVariableProblem extends ProblemBinding implements IVariable {
public CVariableProblem( IASTNode node, int id, char[] arg ) {
super( node, id, arg );
@@ -93,25 +93,40 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalBi
IASTDeclarator declarator = (IASTDeclarator) declarations[0].getParent();
return CVisitor.getContainingScope( declarator.getParent() );
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
- */
- public boolean isStatic() {
- return hasStorageClass( IASTDeclSpecifier.sc_static );
- }
-
- public boolean hasStorageClass( int storage ){
+
+ public boolean isStatic(boolean checkHeaders) {
+ return hasStorageClass(IASTDeclSpecifier.sc_static, checkHeaders);
+ }
+
+ public boolean isStatic() {
+ return isStatic(true);
+ }
+
+ public boolean hasStorageClass( int storage, boolean checkHeaders){
if( declarations == null )
return false;
+
+ boolean useDeclsInRoot= checkHeaders;
for( int i = 0; i < declarations.length && declarations[i] != null; i++ ){
- IASTNode parent = declarations[i].getParent();
+ final IASTName name = declarations[i];
+ if (!useDeclsInRoot) {
+ if (name.getTranslationUnit().isHeaderUnit()) {
+ return false;
+ }
+ useDeclsInRoot= true;
+ }
+
+ IASTNode parent = name.getParent();
while( !(parent instanceof IASTDeclaration) )
parent = parent.getParent();
if( parent instanceof IASTSimpleDeclaration ){
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
- if( declSpec.getStorageClass() == storage )
- return true;
+ if( declSpec.getStorageClass() == storage ) {
+ if (checkHeaders || declSpec.isPartOfTranslationUnitFile()) {
+ return true;
+ }
+ }
}
}
return false;
@@ -120,19 +135,19 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalBi
* @see org.eclipse.cdt.core.dom.ast.IVariable#isExtern()
*/
public boolean isExtern() {
- return hasStorageClass( IASTDeclSpecifier.sc_extern );
+ return hasStorageClass( IASTDeclSpecifier.sc_extern, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
*/
public boolean isAuto() {
- return hasStorageClass( IASTDeclSpecifier.sc_auto );
+ return hasStorageClass( IASTDeclSpecifier.sc_auto, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
*/
public boolean isRegister() {
- return hasStorageClass( IASTDeclSpecifier.sc_register );
+ return hasStorageClass( IASTDeclSpecifier.sc_register, true);
}
public ILinkage getLinkage() {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalFunction.java
index 2350f36406d..bd3757aacee 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalFunction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalFunction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,21 +7,26 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Jun 6, 2005
- */
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
/**
- * @author aniefer
- *
+ * Interface for ast-internal implementations of function bindings.
*/
public interface ICInternalFunction extends ICInternalBinding {
public void setFullyResolved( boolean resolved );
public void addDeclarator( IASTFunctionDeclarator fnDeclarator );
+
+ /**
+ * Returns whether there is a static declaration for this function.
+ * @param resolveAll checks for names that are not yet resolved to this binding.
+ * @param checkHeaders if false
declarations within header files are not
+ * considered.
+ */
+ public boolean isStatic(boolean resolveAll, boolean checkHeaders);
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalVariable.java
new file mode 100644
index 00000000000..e1b472920f2
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalVariable.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.dom.parser.c;
+
+import org.eclipse.cdt.core.dom.ast.DOMException;
+
+/**
+ * Interface for ast-internal implementations of variable bindings.
+ * @since 5.0
+ */
+public interface ICInternalVariable extends ICInternalBinding {
+
+ /**
+ * Returns whether there is a static declaration for this variable.
+ * @param checkHeaders if false
declarations within header files are not
+ * considered.
+ */
+ public boolean isStatic(boolean checkHeaders) throws DOMException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
index f7900d59cc6..fcebcabf0e1 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
@@ -98,6 +98,8 @@ public class CPPASTTranslationUnit extends CPPASTNode implements
private static final IASTName[] EMPTY_NAME_ARRAY = new IASTName[0];
private IASTComment[] comments = new ASTComment[0];
+
+ private boolean fIsHeader;
public IASTTranslationUnit getTranslationUnit() {
return this;
@@ -578,4 +580,12 @@ public class CPPASTTranslationUnit extends CPPASTNode implements
}
return null;
}
+
+ public boolean isHeaderUnit() {
+ return fIsHeader;
+ }
+
+ public void setIsHeaderUnit(boolean headerUnit) {
+ fIsHeader= headerUnit;
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java
index 4b867192ae1..d1d2f8cf312 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java
@@ -9,9 +9,6 @@
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Apr 14, 2005
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
@@ -175,9 +172,9 @@ public class CPPDeferredFunctionInstance extends CPPInstance implements ICPPFunc
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
*/
- public boolean isStatic( boolean resolveAll ) {
+ public boolean isStatic( boolean resolveAll, boolean checkHeaders) {
try {
- return ASTInternal.isStatic((IFunction) getTemplateDefinition(), resolveAll);
+ return ASTInternal.isStatic((IFunction) getTemplateDefinition(), resolveAll, checkHeaders);
} catch (DOMException e) {
return false;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java
index 3ec18d95b93..b5c505843a4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java
@@ -9,9 +9,6 @@
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Nov 29, 2004
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
@@ -161,7 +158,7 @@ public class CPPField extends CPPVariable implements ICPPField, ICPPInternalBind
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable#isMutable()
*/
public boolean isMutable() {
- return hasStorageClass( ICPPASTDeclSpecifier.sc_mutable );
+ return hasStorageClass( ICPPASTDeclSpecifier.sc_mutable, true);
}
public boolean isExtern() {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java
index 66cc3129c3b..6e07a06379b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java
@@ -9,9 +9,6 @@
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Dec 1, 2004
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ILinkage;
@@ -86,9 +83,9 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
public boolean takesVarArgs() throws DOMException {
return ((ICPPFunction)getBinding()).takesVarArgs();
}
- public boolean isStatic( boolean resolveAll ) {
+ public boolean isStatic( boolean resolveAll, boolean checkHeaders) {
try {
- return ASTInternal.isStatic((IFunction) getBinding(), resolveAll);
+ return ASTInternal.isStatic((IFunction) getBinding(), resolveAll, checkHeaders);
} catch (DOMException e) {
return false;
}
@@ -429,16 +426,16 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
*/
public boolean isStatic( ) {
- return isStatic( true );
+ return isStatic( true, true );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
*/
- public boolean isStatic( boolean resolveAll ) {
+ public boolean isStatic( boolean resolveAll, boolean checkHeaders ) {
if( resolveAll && (bits & FULLY_RESOLVED) == 0 ){
resolveAllDeclarations();
}
- return hasStorageClass( this, IASTDeclSpecifier.sc_static );
+ return hasStorageClass( this, IASTDeclSpecifier.sc_static, checkHeaders );
}
// }
// static public boolean isStatic
@@ -507,12 +504,23 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
}
static public boolean hasStorageClass( ICPPInternalFunction function, int storage ){
+ return hasStorageClass(function, storage, true);
+ }
+
+ static public boolean hasStorageClass( ICPPInternalFunction function, int storage, boolean checkHeaders){
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) function.getDefinition();
IASTNode[] ds = function.getDeclarations();
+ boolean useDeclsInRoot= checkHeaders;
int i = -1;
do{
if( dtor != null ){
+ if (!useDeclsInRoot) {
+ if (dtor.getTranslationUnit().isHeaderUnit()) {
+ return false;
+ }
+ useDeclsInRoot= true;
+ }
IASTNode parent = dtor.getParent();
while( !(parent instanceof IASTDeclaration) )
parent = parent.getParent();
@@ -522,8 +530,11 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
else if( parent instanceof IASTFunctionDefinition )
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
- if( declSpec.getStorageClass() == storage )
- return true;
+ if( declSpec.getStorageClass() == storage ) {
+ if (checkHeaders || declSpec.isPartOfTranslationUnitFile()) {
+ return true;
+ }
+ }
}
if( ds != null && ++i < ds.length ) {
dtor = (ICPPASTFunctionDeclarator) ds[i];
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java
index 55beefc6f93..dd1c433bf91 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java
@@ -6,12 +6,9 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM - Initial API and implementation
- * Markus Schorn (Wind River Systems)
+ * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Mar 29, 2005
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.CCorePlugin;
@@ -140,10 +137,10 @@ public class CPPFunctionInstance extends CPPInstance implements ICPPFunction, IC
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
*/
- public boolean isStatic( boolean resolveAll ) {
+ public boolean isStatic( boolean resolveAll, boolean checkHeaders ) {
ICPPFunction func = (ICPPFunction) getTemplateDefinition();
try {
- return ASTInternal.isStatic(func, resolveAll);
+ return ASTInternal.isStatic(func, resolveAll, checkHeaders);
} catch (DOMException e) {
return false;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java
index 8ad62961bfa..9ddea55d0b9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java
@@ -6,8 +6,9 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM - Initial API and implementation
- * Bryan Wilkinson (QNX)
+ * IBM - Initial API and implementation
+ * Bryan Wilkinson (QNX)
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Apr 22, 2005
@@ -95,19 +96,19 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP
return getFunction().isInline();
}
public boolean isStatic() {
- return isStatic( true );
+ return isStatic(true, true);
}
- public boolean isStatic(boolean resolveAll) {
+ public boolean isStatic(boolean resolveAll, boolean checkHeaders) {
//TODO resolveAll
IBinding f = getSpecializedBinding();
if( f instanceof ICPPInternalFunction)
- return ((ICPPInternalFunction)f).isStatic( resolveAll );
+ return ((ICPPInternalFunction)f).isStatic( resolveAll, checkHeaders);
if( f instanceof IIndexBinding && f instanceof ICPPFunction ) {
try {
return ((ICPPFunction) f).isStatic();
} catch(DOMException de) { /* cannot occur as we query the index */}
}
- return CPPFunction.hasStorageClass( this, IASTDeclSpecifier.sc_static );
+ return CPPFunction.hasStorageClass( this, IASTDeclSpecifier.sc_static, checkHeaders);
}
public boolean isExtern() throws DOMException {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java
index 50e2c29eaf0..b328c5d56a9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java
@@ -6,12 +6,9 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM - Initial API and implementation
- * Markus Schorn (Wind River Systems)
+ * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Mar 31, 2005
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
@@ -221,12 +218,20 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
return type;
}
- public boolean hasStorageClass( int storage ){
+ public boolean hasStorageClass( int storage, boolean checkHeaders){
IASTName name = (IASTName) getDefinition();
IASTNode[] ns = getDeclarations();
int i = -1;
+ boolean useDeclsInRoot= checkHeaders;
do{
if( name != null ){
+ if (!useDeclsInRoot) {
+ if (name.getTranslationUnit().isHeaderUnit()) {
+ return false;
+ }
+ useDeclsInRoot= true;
+ }
+
IASTNode parent = name.getParent();
while( !(parent instanceof IASTDeclaration) )
parent = parent.getParent();
@@ -236,8 +241,11 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
else if( parent instanceof IASTFunctionDefinition )
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
- if( declSpec.getStorageClass() == storage )
- return true;
+ if( declSpec.getStorageClass() == storage ) {
+ if (checkHeaders || declSpec.isPartOfTranslationUnitFile()) {
+ return true;
+ }
+ }
}
if( ns != null && ++i < ns.length )
name = (IASTName) ns[i];
@@ -310,13 +318,13 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
*/
public boolean isStatic() {
- return hasStorageClass( IASTDeclSpecifier.sc_static );
+ return hasStorageClass( IASTDeclSpecifier.sc_static, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction#isMutable()
*/
public boolean isMutable() {
- return hasStorageClass( ICPPASTDeclSpecifier.sc_mutable );
+ return hasStorageClass( ICPPASTDeclSpecifier.sc_mutable, true);
}
/* (non-Javadoc)
@@ -353,21 +361,21 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
*/
public boolean isExtern() {
- return hasStorageClass( IASTDeclSpecifier.sc_extern );
+ return hasStorageClass( IASTDeclSpecifier.sc_extern, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
*/
public boolean isAuto() {
- return hasStorageClass( IASTDeclSpecifier.sc_auto );
+ return hasStorageClass( IASTDeclSpecifier.sc_auto, true );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
*/
public boolean isRegister() {
- return hasStorageClass( IASTDeclSpecifier.sc_register);
+ return hasStorageClass( IASTDeclSpecifier.sc_register, true);
}
/* (non-Javadoc)
@@ -404,8 +412,8 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
*/
- public boolean isStatic( boolean resolveAll ) {
- return hasStorageClass( IASTDeclSpecifier.sc_static );
+ public boolean isStatic( boolean resolveAll, boolean checkHeaders ) {
+ return hasStorageClass( IASTDeclSpecifier.sc_static, checkHeaders);
}
/* (non-Javadoc)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
index 383c5ace639..b6bc56afdba 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
@@ -6,14 +6,11 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * IBM - Initial API and implementation
- * Markus Schorn (Wind River Systems)
- * Bryan Wilkinson (QNX)
- * Andrew Ferguson (Symbian)
+ * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
+ * Bryan Wilkinson (QNX)
+ * Andrew Ferguson (Symbian)
*******************************************************************************/
-/*
- * Created on Dec 8, 2004
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
@@ -1355,7 +1352,7 @@ public class CPPSemantics {
}
//it is not ambiguous if they are the same thing and it is static or an enumerator
if( binding instanceof IEnumerator ||
- (binding instanceof IFunction && ASTInternal.isStatic((IFunction) binding, false)) ||
+ (binding instanceof IFunction && ASTInternal.isStatic((IFunction) binding, false, true)) ||
(binding instanceof IVariable && ((IVariable)binding).isStatic()) )
{
ok = true;
@@ -2396,7 +2393,7 @@ public class CPPSemantics {
} else
varArgs = true;
- if( useImplicitObj && j == 0 && ASTInternal.isStatic(currFn, false)) {
+ if( useImplicitObj && j == 0 && ASTInternal.isStatic(currFn, false, true)) {
//13.3.1-4 for static member functions, the implicit object parameter is considered to match any object
cost = new Cost( source, target );
cost.rank = Cost.IDENTITY_RANK; //exact match, no cost
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java
index 756ebb40b60..a61fcab27b1 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java
@@ -10,9 +10,6 @@
* Markus Schorn (Wind River Systems)
* Ed Swartz (Nokia)
*******************************************************************************/
-/*
- * Created on Nov 29, 2004
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ILinkage;
@@ -39,7 +36,7 @@ import org.eclipse.core.runtime.PlatformObject;
/**
* @author aniefer
*/
-public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInternalBinding {
+public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInternalVariable {
public static class CPPVariableDelegate extends CPPDelegate implements ICPPVariable {
public CPPVariableDelegate( IASTName name, ICPPVariable binding ) {
super( name, binding );
@@ -254,30 +251,6 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt
return CPPVisitor.getContainingScope( definition != null ? definition : declarations[0] );
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMember#isStatic()
- */
- public boolean isStatic() {
- IASTDeclarator dtor = null;
- if( declarations != null ) {
- dtor= findDeclarator(declarations[0]);
- }
- else {
- dtor= findDeclarator(definition);
- }
-
- if (dtor == null) {
- return false;
- }
-
- IASTNode node = dtor.getParent();
- if( node instanceof IASTSimpleDeclaration ){
- IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)node).getDeclSpecifier();
- return (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static );
- }
- return false;
- }
-
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
*/
@@ -319,20 +292,32 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt
addDeclaration( node );
}
- public boolean hasStorageClass( int storage ){
+ public boolean hasStorageClass(int storage, boolean checkHeaders) {
IASTName name = (IASTName) getDefinition();
IASTNode[] ns = getDeclarations();
+
+ boolean useDeclsInRoot= checkHeaders;
int i = -1;
do{
if( name != null ){
+ if (!useDeclsInRoot) {
+ if (name.getTranslationUnit().isHeaderUnit()) {
+ return false;
+ }
+ useDeclsInRoot= true;
+ }
+
IASTNode parent = name.getParent();
while( !(parent instanceof IASTDeclaration) )
parent = parent.getParent();
if( parent instanceof IASTSimpleDeclaration ){
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
- if( declSpec.getStorageClass() == storage )
- return true;
+ if (declSpec.getStorageClass() == storage) {
+ if (checkHeaders || declSpec.isPartOfTranslationUnitFile()) {
+ return true;
+ }
+ }
}
}
if( ns != null && ++i < ns.length )
@@ -351,28 +336,37 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt
return false;
}
- /* (non-Javadoc)
+
+ public boolean isStatic(boolean checkHeaders) {
+ return hasStorageClass(IASTDeclSpecifier.sc_static, checkHeaders);
+ }
+
+ public boolean isStatic() {
+ return isStatic(true);
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isExtern()
*/
public boolean isExtern() {
- return hasStorageClass( IASTDeclSpecifier.sc_extern );
+ return hasStorageClass( IASTDeclSpecifier.sc_extern, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
*/
public boolean isAuto() {
- return hasStorageClass( IASTDeclSpecifier.sc_auto );
+ return hasStorageClass( IASTDeclSpecifier.sc_auto, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
*/
public boolean isRegister() {
- return hasStorageClass( IASTDeclSpecifier.sc_register );
+ return hasStorageClass( IASTDeclSpecifier.sc_register, true);
}
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
- }
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalFunction.java
index 00fae996622..8344c4f2b1a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalFunction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalFunction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,22 +7,26 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
-/*
- * Created on Apr 26, 2005
- */
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IBinding;
/**
- * @author aniefer
+ * Interface for ast-internal implementations of function bindings.
*/
public interface ICPPInternalFunction extends ICPPInternalBinding {
public IBinding resolveParameter( IASTParameterDeclaration param );
- public boolean isStatic( boolean resolveAll );
+ /**
+ * Returns whether there is a static declaration for this function.
+ * @param resolveAll checks for names that are not yet resolved to this binding.
+ * @param checkHeaders if false
declarations within header files are not
+ * considered.
+ */
+ public boolean isStatic(boolean resolveAll, boolean checkHeaders);
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalVariable.java
new file mode 100644
index 00000000000..f2cf982da37
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalVariable.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.dom.parser.cpp;
+
+import org.eclipse.cdt.core.dom.ast.DOMException;
+
+
+/**
+ * Interface for ast-internal implementations of variable bindings.
+ * @since 5.0
+ */
+public interface ICPPInternalVariable extends ICPPInternalBinding {
+
+ /**
+ * Returns whether there is a static declaration for this variable.
+ * @param checkHeaders if false
declarations within header files are not
+ * considered.
+ */
+ public boolean isStatic(boolean checkHeaders) throws DOMException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ILocationResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ILocationResolver.java
index 01395f9a1f0..b0b5e5f9971 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ILocationResolver.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ILocationResolver.java
@@ -133,4 +133,11 @@ public interface ILocationResolver extends org.eclipse.cdt.internal.core.parser.
* a macro expansion ({@link IASTName}).
*/
IASTNode findSurroundingPreprocessorNode(int sequenceNumber, int length);
+
+ /**
+ * Returns whether the specified sequence number points into the root file of the
+ * translation unit, or not.
+ * @param offset
+ */
+ boolean isPartOfTranslationUnitFile(int sequenceNumber);
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtxFile.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtxFile.java
index 04626b8dd0f..0c3ea46b7e8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtxFile.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtxFile.java
@@ -90,4 +90,12 @@ class LocationCtxFile extends LocationCtxContainer {
ASTFileLocation createFileLocation(int start, int length) {
return new ASTFileLocation(this, start, length);
}
+
+ public boolean isThisFile(int sequenceNumber) {
+ LocationCtx child= findChildLessOrEqualThan(sequenceNumber, false);
+ if (!(child instanceof LocationCtxFile)) {
+ return true;
+ }
+ return sequenceNumber >= child.fSequenceNumber + child.getSequenceLength();
+ }
}
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java
index fe3011bf87f..1372153d326 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java
@@ -49,7 +49,7 @@ public class LocationMap implements ILocationResolver {
private ArrayList fBuiltinMacros= new ArrayList();
private IdentityHashMap fMacroReferences= new IdentityHashMap();
- private LocationCtx fRootContext= null;
+ private LocationCtxFile fRootContext= null;
private LocationCtx fCurrentContext= null;
private int fLastChildInsertionOffset;
@@ -84,7 +84,7 @@ public class LocationMap implements ILocationResolver {
public ILocationCtx pushTranslationUnit(String filename, char[] buffer) {
assert fCurrentContext == null;
fTranslationUnitPath= filename;
- fRootContext= fCurrentContext= new LocationCtxFile(null, filename, buffer, 0, 0, 0, null);
+ fCurrentContext= fRootContext= new LocationCtxFile(null, filename, buffer, 0, 0, 0, null);
fLastChildInsertionOffset= 0;
return fCurrentContext;
}
@@ -367,6 +367,11 @@ public class LocationMap implements ILocationResolver {
return (IASTNodeLocation[]) result.toArray(new IASTNodeLocation[result.size()]);
}
+
+ public boolean isPartOfTranslationUnitFile(int sequenceNumber) {
+ return fRootContext.isThisFile(sequenceNumber);
+ }
+
public IASTImageLocation getImageLocation(int sequenceNumber, int length) {
ArrayList result= new ArrayList();
fRootContext.collectLocations(sequenceNumber, length, result);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java
index 12dd90e87ac..c445277198a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java
@@ -84,7 +84,7 @@ public class PDOMASTAdapter {
}
public String getContainingFilename() {
- return fDelegate.getContainingFilename();
+ return fLocation.getFileName();
}
public IASTFileLocation getFileLocation() {
@@ -154,6 +154,10 @@ public class PDOMASTAdapter {
public IASTImageLocation getImageLocation() {
return null;
}
+
+ public boolean isPartOfTranslationUnitFile() {
+ return fLocation.getFileName().equals(fDelegate.getTranslationUnit().getFilePath());
+ }
}
private static class AnonymousEnumeration implements IEnumeration {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotation.java
index d5cfad2dc6e..5b214223338 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotation.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotation.java
@@ -60,7 +60,7 @@ public class PDOMCAnnotation {
modifiers |= (function.isAuto() ? 1 : 0) << PDOMCAnnotation.AUTO_OFFSET;
modifiers |= (function.isExtern() ? 1 : 0) << PDOMCAnnotation.EXTERN_OFFSET;
modifiers |= (function.isRegister() ? 1 : 0) << PDOMCAnnotation.REGISTER_OFFSET;
- modifiers |= (ASTInternal.isStatic(function, false) ? 1 : 0) << PDOMCAnnotation.STATIC_OFFSET;
+ modifiers |= (ASTInternal.isStatic(function, false, true) ? 1 : 0) << PDOMCAnnotation.STATIC_OFFSET;
modifiers |= (function.isInline() ? 1 : 0) << PDOMCAnnotation.INLINE_OFFSET;
modifiers |= (function.takesVarArgs() ? 1 : 0) << PDOMCAnnotation.VARARGS_OFFSET;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java
index fd5cb0d51ba..ef2f046d9cb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java
@@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.c.ICBasicType;
import org.eclipse.cdt.internal.core.Util;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
@@ -258,11 +259,11 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants {
}
if (binding instanceof IVariable) {
IVariable var= (IVariable) binding;
- return var.isStatic();
+ return ASTInternal.isStatic(var, false);
}
if (binding instanceof IFunction) {
IFunction f= (IFunction) binding;
- return f.isStatic();
+ return ASTInternal.isStatic(f, false, false);
}
return false;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java
index cb5fec50c53..5fe08457498 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java
@@ -58,9 +58,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPBasicType;
import org.eclipse.cdt.internal.core.Util;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction;
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
@@ -801,17 +801,15 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
}
if (binding instanceof ICPPVariable) {
if (!(binding.getScope() instanceof CPPBlockScope)) {
- ICPPVariable var= (ICPPVariable) binding;
- return var.isStatic();
+ return ASTInternal.isStatic((ICPPVariable) binding, false);
}
return false;
}
if (binding instanceof ICPPMethod) {
return false;
}
- if (binding instanceof ICPPInternalFunction) {
- ICPPInternalFunction func = (ICPPInternalFunction)binding;
- return func.isStatic(false);
+ if (binding instanceof ICPPFunction) {
+ return ASTInternal.isStatic((ICPPFunction) binding, false, false);
}
return false;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java
index 6a709f350a1..00e5e3f04fd 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java
@@ -165,7 +165,11 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer
return null;
}
- return createAST((AbstractLanguage) language, codeReader, scannerInfo, options, pm);
+ IASTTranslationUnit ast= createAST((AbstractLanguage) language, codeReader, scannerInfo, options, pm);
+ if (ast != null) {
+ ast.setIsHeaderUnit(tu.isHeaderUnit());
+ }
+ return ast;
}
/**