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 9f2d9d56ec0..b3a8701db87 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 @@ -75,4 +75,5 @@ public interface IASTTranslationUnit extends IASTNode { public IASTVisitor getVisitor(); + public String getFilePath(); } \ No newline at end of file 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 3b06bb5d60d..8beca9b28e7 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 @@ -9,7 +9,6 @@ * IBM Rational Software - Initial API and implementation */ package org.eclipse.cdt.internal.core.dom.parser.c; - import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; @@ -43,366 +42,447 @@ import org.eclipse.cdt.internal.core.parser.scanner2.InvalidPreprocessorNodeExce /** * @author jcamelon */ -public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit, IRequiresLocationInformation { +public class CASTTranslationUnit extends CASTNode implements + IASTTranslationUnit, IRequiresLocationInformation { + private IASTDeclaration[] decls = null; - private IASTDeclaration [] decls = null; - private static final int DEFAULT_CHILDREN_LIST_SIZE = 8; - private int currentIndex = 0; - - //Binding - private CScope compilationUnit = null; - private CVisitor visitor = null; - private ILocationResolver resolver; - private static final IASTPreprocessorStatement[] EMPTY_PREPROCESSOR_STATEMENT_ARRAY = new IASTPreprocessorStatement[0]; - private static final IASTNodeLocation[] EMPTY_PREPROCESSOR_LOCATION_ARRAY = new IASTNodeLocation[0]; - private static final IASTPreprocessorMacroDefinition[] EMPTY_PREPROCESSOR_MACRODEF_ARRAY = new IASTPreprocessorMacroDefinition[0]; - private static final IASTPreprocessorIncludeStatement[] EMPTY_PREPROCESSOR_INCLUSION_ARRAY = new IASTPreprocessorIncludeStatement[0]; - private static final IASTProblem[] EMPTY_PROBLEM_ARRAY = new IASTProblem[0]; - private static final String EMPTY_STRING = ""; //$NON-NLS-1$ - - public void addDeclaration( IASTDeclaration d ) - { - if( decls == null ) - { - decls = new IASTDeclaration[ DEFAULT_CHILDREN_LIST_SIZE ]; - currentIndex = 0; - } - if( decls.length == currentIndex ) - { - IASTDeclaration [] old = decls; - decls = new IASTDeclaration[ old.length * 2 ]; - for( int i = 0; i < old.length; ++i ) - decls[i] = old[i]; - } - decls[ currentIndex++ ] = d; - } + private static final int DEFAULT_CHILDREN_LIST_SIZE = 8; - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getDeclarations() - */ - public IASTDeclaration[] getDeclarations() { - if( decls == null ) return IASTDeclaration.EMPTY_DECLARATION_ARRAY; - removeNullDeclarations(); - return decls; - } + private int currentIndex = 0; - /** - * @param decls2 - */ - private void removeNullDeclarations() { - int nullCount = 0; - for( int i = 0; i < decls.length; ++i ) - if( decls[i] == null ) - ++nullCount; - if( nullCount == 0 ) return; - IASTDeclaration [] old = decls; - int newSize = old.length - nullCount; - decls = new IASTDeclaration[ newSize ]; - for( int i = 0; i < newSize; ++i ) - decls[i] = old[i]; - currentIndex = newSize; - } + // Binding + private CScope compilationUnit = null; - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getScope() - */ - public IScope getScope() { - if( compilationUnit == null ) - compilationUnit = new CScope( this ); - return compilationUnit; - } - - /* (non-Javadoc) + private CVisitor visitor = null; + + private ILocationResolver resolver; + + private static final IASTPreprocessorStatement[] EMPTY_PREPROCESSOR_STATEMENT_ARRAY = new IASTPreprocessorStatement[0]; + + private static final IASTNodeLocation[] EMPTY_PREPROCESSOR_LOCATION_ARRAY = new IASTNodeLocation[0]; + + private static final IASTPreprocessorMacroDefinition[] EMPTY_PREPROCESSOR_MACRODEF_ARRAY = new IASTPreprocessorMacroDefinition[0]; + + private static final IASTPreprocessorIncludeStatement[] EMPTY_PREPROCESSOR_INCLUSION_ARRAY = new IASTPreprocessorIncludeStatement[0]; + + private static final IASTProblem[] EMPTY_PROBLEM_ARRAY = new IASTProblem[0]; + + private static final String EMPTY_STRING = ""; //$NON-NLS-1$ + + public void addDeclaration(IASTDeclaration d) { + if (decls == null) { + decls = new IASTDeclaration[DEFAULT_CHILDREN_LIST_SIZE]; + currentIndex = 0; + } + if (decls.length == currentIndex) { + IASTDeclaration[] old = decls; + decls = new IASTDeclaration[old.length * 2]; + for (int i = 0; i < old.length; ++i) + decls[i] = old[i]; + } + decls[currentIndex++] = d; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getDeclarations() + */ + public IASTDeclaration[] getDeclarations() { + if (decls == null) + return IASTDeclaration.EMPTY_DECLARATION_ARRAY; + removeNullDeclarations(); + return decls; + } + + /** + * @param decls2 + */ + private void removeNullDeclarations() { + int nullCount = 0; + for (int i = 0; i < decls.length; ++i) + if (decls[i] == null) + ++nullCount; + if (nullCount == 0) + return; + IASTDeclaration[] old = decls; + int newSize = old.length - nullCount; + decls = new IASTDeclaration[newSize]; + for (int i = 0; i < newSize; ++i) + decls[i] = old[i]; + currentIndex = newSize; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getScope() + */ + public IScope getScope() { + if (compilationUnit == null) + compilationUnit = new CScope(this); + return compilationUnit; + } + + /* + * (non-Javadoc) + * * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getDeclarations(org.eclipse.cdt.core.dom.ast.IBinding) */ public IASTName[] getDeclarations(IBinding binding) { - //TODO if binding is macro, circumvent the visitor + // TODO if binding is macro, circumvent the visitor return CVisitor.getDeclarations(this, binding); } - - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getReferences(org.eclipse.cdt.core.dom.ast.IBinding) */ public IASTName[] getReferences(IBinding binding) { - //TODO if binding is macro, circumvent the visitor - return CVisitor.getReferences( this, binding ); + // TODO if binding is macro, circumvent the visitor + return CVisitor.getReferences(this, binding); } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getLocationInfo(int, + * int) + */ + public IASTNodeLocation[] getLocationInfo(int offset, int length) { + if (resolver == null) + return EMPTY_PREPROCESSOR_LOCATION_ARRAY; + return resolver.getLocations(offset, length); + } + private class CFindNodeForOffsetAction extends CVisitor.CBaseVisitorAction { + { + processNames = true; + processDeclarations = true; + processInitializers = true; + processParameterDeclarations = true; + processDeclarators = true; + processDeclSpecifiers = true; + processDesignators = true; + processExpressions = true; + processStatements = true; + processTypeIds = true; + processEnumerators = true; + } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getLocationInfo(int, int) - */ - public IASTNodeLocation[] getLocationInfo(int offset, int length) { - if( resolver == null ) return EMPTY_PREPROCESSOR_LOCATION_ARRAY; - return resolver.getLocations(offset,length); - } + IASTNode foundNode = null; - private class CFindNodeForOffsetAction extends CVisitor.CBaseVisitorAction { - { - processNames = true; - processDeclarations = true; - processInitializers = true; - processParameterDeclarations = true; - processDeclarators = true; - processDeclSpecifiers = true; - processDesignators = true; - processExpressions = true; - processStatements = true; - processTypeIds = true; - processEnumerators = true; - } - - IASTNode foundNode = null; - int offset = 0; - int length = 0; - - /** + int offset = 0; + + int length = 0; + + /** * */ public CFindNodeForOffsetAction(int offset, int length) { this.offset = offset; this.length = length; } - - public int processNode(IASTNode node) { - if (foundNode != null) - return PROCESS_ABORT; - - if (node instanceof ASTNode && - ((ASTNode)node).getOffset() == offset && - ((ASTNode)node).getLength() == length) { - foundNode = node; - return PROCESS_ABORT; - } - - // skip the rest of this node if the selection is outside of its bounds - if (node instanceof ASTNode && - offset > ((ASTNode)node).getOffset() + ((ASTNode)node).getLength()) - return PROCESS_SKIP; - - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) - */ - public int processDeclaration(IASTDeclaration declaration) { - // use declarations to determine if the search has gone past the offset (i.e. don't know the order the visitor visits the nodes) - if (declaration instanceof ASTNode && ((ASTNode)declaration).getOffset() > offset) - return PROCESS_ABORT; - - return processNode(declaration); - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator) - */ - public int processDeclarator(IASTDeclarator declarator) { - int ret = processNode(declarator); - - IASTPointerOperator[] ops = declarator.getPointerOperators(); - for(int i=0; i= 0) { - CFindNodeForOffsetAction nodeFinder = new CFindNodeForOffsetAction(globalOffset, realLength); - getVisitor().visitTranslationUnit(nodeFinder); - node = nodeFinder.getNode(); - } - } - - return node; - } + public int processNode(IASTNode node) { + if (foundNode != null) + return PROCESS_ABORT; + if (node instanceof ASTNode + && ((ASTNode) node).getOffset() == offset + && ((ASTNode) node).getLength() == length) { + foundNode = node; + return PROCESS_ABORT; + } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getMacroDefinitions() - */ - public IASTPreprocessorMacroDefinition[] getMacroDefinitions() { - if( resolver == null ) return EMPTY_PREPROCESSOR_MACRODEF_ARRAY; - IASTPreprocessorMacroDefinition [] result = resolver.getMacroDefinitions(); - setParentRelationship( result, IASTTranslationUnit.PREPROCESSOR_STATEMENT ); - return result; - } + // skip the rest of this node if the selection is outside of its + // bounds + if (node instanceof ASTNode + && offset > ((ASTNode) node).getOffset() + + ((ASTNode) node).getLength()) + return PROCESS_SKIP; + return PROCESS_CONTINUE; + } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getIncludeDirectives() - */ - public IASTPreprocessorIncludeStatement[] getIncludeDirectives() { - if( resolver == null ) return EMPTY_PREPROCESSOR_INCLUSION_ARRAY; - IASTPreprocessorIncludeStatement [] result = resolver.getIncludeDirectives(); - setParentRelationship( result, IASTTranslationUnit.PREPROCESSOR_STATEMENT ); - return result; - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) + */ + public int processDeclaration(IASTDeclaration declaration) { + // use declarations to determine if the search has gone past the + // offset (i.e. don't know the order the visitor visits the nodes) + if (declaration instanceof ASTNode + && ((ASTNode) declaration).getOffset() > offset) + return PROCESS_ABORT; + return processNode(declaration); + } - /** - * @param result - * @param preprocessor_statement - */ - protected void setParentRelationship(IASTNode[] result, ASTNodeProperty property ) { - for( int i = 0; i < result.length; ++i ) - { - result[i].setParent( this ); - result[i].setPropertyInParent( property ); - } - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator) + */ + public int processDeclarator(IASTDeclarator declarator) { + int ret = processNode(declarator); + IASTPointerOperator[] ops = declarator.getPointerOperators(); + for (int i = 0; i < ops.length; i++) + processNode(ops[i]); - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getAllPreprocessorStatements() - */ - public IASTPreprocessorStatement[] getAllPreprocessorStatements() { - if( resolver == null ) return EMPTY_PREPROCESSOR_STATEMENT_ARRAY; - IASTPreprocessorStatement [] result = resolver.getAllPreprocessorStatements(); - setParentRelationship( result, IASTTranslationUnit.PREPROCESSOR_STATEMENT ); - return result; - } + if (declarator instanceof IASTArrayDeclarator) { + IASTArrayModifier[] mods = ((IASTArrayDeclarator) declarator) + .getArrayModifiers(); + for (int i = 0; i < mods.length; i++) + processNode(mods[i]); + } + return ret; + } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.parser2.IRequiresLocationInformation#setLocationResolver(org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver) - */ - public void setLocationResolver(ILocationResolver resolver) { - this.resolver = resolver; - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDesignator(org.eclipse.cdt.core.dom.ast.c.ICASTDesignator) + */ + public int processDesignator(ICASTDesignator designator) { + return processNode(designator); + } - - /* (non-Javadoc) - * @see java.lang.Object#finalize() - */ - protected void finalize() throws Throwable { - if( resolver != null ) resolver.cleanup(); - super.finalize(); - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier) + */ + public int processDeclSpecifier(IASTDeclSpecifier declSpec) { + return processNode(declSpec); + } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) + */ + public int processEnumerator(IASTEnumerator enumerator) { + return processNode((IASTNode) enumerator); + } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getPreprocesorProblems() - */ - public IASTProblem[] getPreprocesorProblems() { - if( resolver == null ) return EMPTY_PROBLEM_ARRAY; - IASTProblem [] result = resolver.getScannerProblems(); - for( int i = 0; i < result.length; ++i ) - { - IASTProblem p = result[i]; - p.setParent( this ); - p.setPropertyInParent( IASTTranslationUnit.SCANNER_PROBLEM ); - } - return result; - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression) + */ + public int processExpression(IASTExpression expression) { + return processNode(expression); + } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer) + */ + public int processInitializer(IASTInitializer initializer) { + return processNode(initializer); + } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getUnpreprocessedSignature(org.eclipse.cdt.core.dom.ast.IASTNodeLocation[]) - */ - public String getUnpreprocessedSignature(IASTNodeLocation[] locations) { - if( resolver == null ) return EMPTY_STRING; - return new String( resolver.getUnpreprocessedSignature(locations) ); - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int processName(IASTName name) { + if (name.toString() != null) + return processNode(name); + return PROCESS_CONTINUE; + } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) + */ + public int processParameterDeclaration( + IASTParameterDeclaration parameterDeclaration) { + return processNode(parameterDeclaration); + } - /* (non-Javadoc) + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement) + */ + public int processStatement(IASTStatement statement) { + return processNode(statement); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId) + */ + public int processTypeId(IASTTypeId typeId) { + return processNode(typeId); + } + + public IASTNode getNode() { + return foundNode; + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getNodeForLocation(org.eclipse.cdt.core.dom.ast.IASTNodeLocation) + */ + public IASTNode selectNodeForLocation(String path, int realOffset, + int realLength) { + IASTNode node = null; + + try { + node = resolver.getPreprocessorNode(path, realOffset, realLength); + } catch (InvalidPreprocessorNodeException ipne) { + // extract global offset from the exception, use it to get the node + // from the AST if it's valid + int globalOffset = ipne.getGlobalOffset(); + if (globalOffset >= 0) { + CFindNodeForOffsetAction nodeFinder = new CFindNodeForOffsetAction( + globalOffset, realLength); + getVisitor().visitTranslationUnit(nodeFinder); + node = nodeFinder.getNode(); + } + } + + return node; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getMacroDefinitions() + */ + public IASTPreprocessorMacroDefinition[] getMacroDefinitions() { + if (resolver == null) + return EMPTY_PREPROCESSOR_MACRODEF_ARRAY; + IASTPreprocessorMacroDefinition[] result = resolver + .getMacroDefinitions(); + setParentRelationship(result, + IASTTranslationUnit.PREPROCESSOR_STATEMENT); + return result; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getIncludeDirectives() + */ + public IASTPreprocessorIncludeStatement[] getIncludeDirectives() { + if (resolver == null) + return EMPTY_PREPROCESSOR_INCLUSION_ARRAY; + IASTPreprocessorIncludeStatement[] result = resolver + .getIncludeDirectives(); + setParentRelationship(result, + IASTTranslationUnit.PREPROCESSOR_STATEMENT); + return result; + } + + /** + * @param result + * @param preprocessor_statement + */ + protected void setParentRelationship(IASTNode[] result, + ASTNodeProperty property) { + for (int i = 0; i < result.length; ++i) { + result[i].setParent(this); + result[i].setPropertyInParent(property); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getAllPreprocessorStatements() + */ + public IASTPreprocessorStatement[] getAllPreprocessorStatements() { + if (resolver == null) + return EMPTY_PREPROCESSOR_STATEMENT_ARRAY; + IASTPreprocessorStatement[] result = resolver + .getAllPreprocessorStatements(); + setParentRelationship(result, + IASTTranslationUnit.PREPROCESSOR_STATEMENT); + return result; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.core.parser2.IRequiresLocationInformation#setLocationResolver(org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver) + */ + public void setLocationResolver(ILocationResolver resolver) { + this.resolver = resolver; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#finalize() + */ + protected void finalize() throws Throwable { + if (resolver != null) + resolver.cleanup(); + super.finalize(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getPreprocesorProblems() + */ + public IASTProblem[] getPreprocesorProblems() { + if (resolver == null) + return EMPTY_PROBLEM_ARRAY; + IASTProblem[] result = resolver.getScannerProblems(); + for (int i = 0; i < result.length; ++i) { + IASTProblem p = result[i]; + p.setParent(this); + p.setPropertyInParent(IASTTranslationUnit.SCANNER_PROBLEM); + } + return result; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getUnpreprocessedSignature(org.eclipse.cdt.core.dom.ast.IASTNodeLocation[]) + */ + public String getUnpreprocessedSignature(IASTNodeLocation[] locations) { + if (resolver == null) + return EMPTY_STRING; + return new String(resolver.getUnpreprocessedSignature(locations)); + } + + /* + * (non-Javadoc) + * * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getVisitor() */ - public IASTVisitor getVisitor() { - if( visitor == null ) - visitor = new CVisitor( this ); - return visitor; - } + public IASTVisitor getVisitor() { + if (visitor == null) + visitor = new CVisitor(this); + return visitor; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getFilePath() + */ + public String getFilePath() { + if (resolver == null) + return EMPTY_STRING; + return new String(resolver.getTranslationUnitPath()); + } } 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 dc695cab491..4ef67bfeba1 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 @@ -67,7 +67,6 @@ public class CPPASTTranslationUnit extends CPPASTNode implements private ILocationResolver resolver; - private static final IASTNode[] EMPTY_NODE_ARRAY = new IASTNode[0]; private static final IASTPreprocessorStatement[] EMPTY_PREPROCESSOR_STATEMENT_ARRAY = new IASTPreprocessorStatement[0]; @@ -451,4 +450,15 @@ public class CPPASTTranslationUnit extends CPPASTNode implements visitor = new CPPVisitor( this ); return visitor; } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getFilePath() + */ + public String getFilePath() { + if (resolver == null) + return EMPTY_STRING; + return new String(resolver.getTranslationUnitPath()); + } }