From ae4dff5290df2931328adf6ed1a65d66200a548a Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 25 Jan 2005 20:42:19 +0000 Subject: [PATCH] Implemented IASTTranslationUnit#getIncludeDirectives() for both C & C++. Implemented IASTTranslationUnit#getMacroDefinitions() for both C & C++. --- .../tests/ast2/DOMLocationInclusionTests.java | 9 + .../parser/tests/ast2/DOMLocationTests.java | 16 + ...a => IASTFunctionStyleMacroParameter.java} | 7 +- .../cdt/core/dom/ast/IASTMacroExpansion.java | 2 +- ...processorFunctionStyleMacroDefinition.java | 21 + .../ast/IASTPreprocessorIncludeStatement.java | 2 + ...a => IASTPreprocessorMacroDefinition.java} | 2 +- ...eprocessorObjectStyleMacroDefinition.java} | 2 +- .../cdt/core/dom/ast/IASTTranslationUnit.java | 108 +++-- .../dom/parser/c/CASTTranslationUnit.java | 32 +- .../dom/parser/cpp/CPPASTTranslationUnit.java | 35 +- .../core/parser/scanner2/BaseScanner.java | 8 + .../core/parser/scanner2/DOMScanner.java | 8 +- .../parser/scanner2/ILocationResolver.java | 9 +- .../scanner2/IScannerPreprocessorLog.java | 11 +- .../core/parser/scanner2/LocationMap.java | 438 +++++++++++++++--- 16 files changed, 548 insertions(+), 162 deletions(-) rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/{IASTFunctionStyleMacroDefinition.java => IASTFunctionStyleMacroParameter.java} (77%) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorFunctionStyleMacroDefinition.java rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/{IASTMacroDefinition.java => IASTPreprocessorMacroDefinition.java} (91%) rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/{IASTObjectStyleMacroDefinition.java => IASTPreprocessorObjectStyleMacroDefinition.java} (84%) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java index 3004b7212ee..86ebaba9d54 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; @@ -145,6 +146,10 @@ public class DOMLocationInclusionTests extends FileBasePluginTest { assertSoleFileLocation(FOO, "foo.h", foo.indexOf("int"), foo.indexOf(";") + 1); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + IASTPreprocessorIncludeStatement [] incs = tu.getIncludeDirectives(); + assertNotNull( incs ); + assertEquals( incs.length, 1 ); + assertSoleFileLocation( incs[0], "code.cpp", code.indexOf( "#inc"), code.indexOf( ".h\"\n") + ".h\"".length() - code.indexOf( "#inc") ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ } } @@ -168,6 +173,10 @@ public class DOMLocationInclusionTests extends FileBasePluginTest { assertSoleFileLocation(FOO, "foo.h", foo.indexOf("int"), foo.indexOf(";") + 1 - foo.indexOf( "int")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ assertSoleFileLocation( byob, "code.cpp", code.indexOf( "float"), code.indexOf( "b;") + 2 - code.indexOf( "float") ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + IASTPreprocessorIncludeStatement [] incs = tu.getIncludeDirectives(); + assertNotNull( incs ); + assertEquals( incs.length, 1 ); + assertSoleFileLocation( incs[0], "code.cpp", code.indexOf( "#inc"), code.indexOf( ".h\"\n") + ".h\"".length() - code.indexOf( "#inc") ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java index 5358b40bbaa..5de013abbfd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.parser.ParserLanguage; @@ -88,6 +89,21 @@ public class DOMLocationTests extends AST2BaseTest { } } + + public void testSimpleMacroDefinition() throws Exception { + String code ="/* hi */\n#define FOOT 0x01\n\n"; //$NON-NLS-1$ + for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP + : null) { + IASTTranslationUnit tu = parse(code, p); + IASTDeclaration[] declarations = tu.getDeclarations(); + assertEquals(declarations.length, 0); + IASTPreprocessorMacroDefinition [] macros = tu.getMacroDefinitions(); + assertNotNull( macros ); + assertEquals( macros.length, 1 ); + assertSoleLocation( macros[0], code.indexOf( "#"), code.indexOf( "0x01") + 4 - code.indexOf( "#")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + } /** * @param declarator * @param offset diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFunctionStyleMacroDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFunctionStyleMacroParameter.java similarity index 77% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFunctionStyleMacroDefinition.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFunctionStyleMacroParameter.java index 5863c8d69d3..b64a6865116 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFunctionStyleMacroDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFunctionStyleMacroParameter.java @@ -13,8 +13,9 @@ package org.eclipse.cdt.core.dom.ast; /** * @author jcamelon */ -public interface IASTFunctionStyleMacroDefinition extends IASTMacroDefinition { +public interface IASTFunctionStyleMacroParameter extends IASTNode { - public String [] getParameters(); - public void addParameter( String parm ); + public String getParameter(); + public void setParameter( String value ); + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroExpansion.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroExpansion.java index 9e105d8583f..5eb52323d1b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroExpansion.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroExpansion.java @@ -20,7 +20,7 @@ public interface IASTMacroExpansion extends IASTNodeLocation { * * @return */ - public IASTMacroDefinition getMacroDefinition(); + public IASTPreprocessorMacroDefinition getMacroDefinition(); /** * The source locations for for the macro expansion. These are the locations diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorFunctionStyleMacroDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorFunctionStyleMacroDefinition.java new file mode 100644 index 00000000000..ab6b7e1c748 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorFunctionStyleMacroDefinition.java @@ -0,0 +1,21 @@ +/********************************************************************** + * Copyright (c) 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM - Initial API and implementation + **********************************************************************/ +package org.eclipse.cdt.core.dom.ast; + +/** + * @author jcamelon + */ +public interface IASTPreprocessorFunctionStyleMacroDefinition extends IASTPreprocessorMacroDefinition { + + public IASTFunctionStyleMacroParameter [] getParameters(); + public void addParameter( IASTFunctionStyleMacroParameter parm ); + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorIncludeStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorIncludeStatement.java index 808357117c5..6180919586c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorIncludeStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorIncludeStatement.java @@ -15,5 +15,7 @@ package org.eclipse.cdt.core.dom.ast; */ public interface IASTPreprocessorIncludeStatement extends IASTPreprocessorStatement { + + public String getPath(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java similarity index 91% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroDefinition.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java index b6bf622c7da..edb357d7db6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTMacroDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java @@ -15,7 +15,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTMacroDefinition extends IASTPreprocessorStatement { +public interface IASTPreprocessorMacroDefinition extends IASTPreprocessorStatement { public static final ASTNodeProperty MACRO_NAME = new ASTNodeProperty( "Macro Name"); //$NON-NLS-1$ public IASTName getName(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTObjectStyleMacroDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorObjectStyleMacroDefinition.java similarity index 84% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTObjectStyleMacroDefinition.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorObjectStyleMacroDefinition.java index 71270b4755e..fbb7333facb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTObjectStyleMacroDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorObjectStyleMacroDefinition.java @@ -13,6 +13,6 @@ package org.eclipse.cdt.core.dom.ast; /** * @author jcamelon */ -public interface IASTObjectStyleMacroDefinition extends IASTMacroDefinition { +public interface IASTPreprocessorObjectStyleMacroDefinition extends IASTPreprocessorMacroDefinition { } 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 4b6cd5d8b58..6071afec35d 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 @@ -10,61 +10,69 @@ **********************************************************************/ package org.eclipse.cdt.core.dom.ast; - /** * The translation unit represents a compilable unit of source. - * + * * @author Doug Schaefer */ public interface IASTTranslationUnit extends IASTNode { - public static final ASTNodeProperty OWNED_DECLARATION = new ASTNodeProperty( "Owned" ); //$NON-NLS-1$ - public static final ASTNodeProperty SCANNER_PROBLEM = new ASTNodeProperty( "Scanner Problem"); //$NON-NLS-1$ + public static final ASTNodeProperty OWNED_DECLARATION = new ASTNodeProperty( + "Owned"); //$NON-NLS-1$ + public static final ASTNodeProperty SCANNER_PROBLEM = new ASTNodeProperty( + "Scanner Problem"); //$NON-NLS-1$ + public static final ASTNodeProperty PREPROCESSOR_STATEMENT = new ASTNodeProperty( + "Inclusion"); //$NON-NLS-1$ - /** - * A translation unit contains an ordered sequence of declarations. - * - * @return List of IASTDeclaration - */ - public IASTDeclaration[] getDeclarations(); - - public void addDeclaration( IASTDeclaration declaration ); - - /** - * This returns the global scope for the translation unit. - * - * @return the global scope - */ - public IScope getScope(); - - /** - * Returns the list of declarations in this translation unit for the given - * binding. The list contains the IASTName nodes that declare the binding. - * - * @param binding - * @return List of IASTName nodes for the binding's declaration - */ - public IASTName[] getDeclarations(IBinding binding); + /** + * A translation unit contains an ordered sequence of declarations. + * + * @return List of IASTDeclaration + */ + public IASTDeclaration[] getDeclarations(); - /** - * Returns the list of references in this translation unit to the given - * binding. This list contains the IASTName nodes that represent a use of - * the binding. - * - * @param binding - * @return List of IASTName nodes representing uses of the binding - */ - public IASTName[] getReferences(IBinding binding); - - public IASTNodeLocation getLocationInfo( int offset ); - public IASTNodeLocation [] getLocationInfo( int offset, int length ); - - public IASTNode[] selectNodesForLocation( String path, int offset, int length ); - public IASTNode[] selectNodesForLocation( int offset, int length ); - - public IASTMacroDefinition [] getMacroDefinitions(); - public IASTPreprocessorIncludeStatement [] getIncludeDirectives(); - public IASTPreprocessorStatement [] getAllPreprocessorStatements(); - public IASTProblem [] getPreprocesorProblems(); - -} + public void addDeclaration(IASTDeclaration declaration); + + /** + * This returns the global scope for the translation unit. + * + * @return the global scope + */ + public IScope getScope(); + + /** + * Returns the list of declarations in this translation unit for the given + * binding. The list contains the IASTName nodes that declare the binding. + * + * @param binding + * @return List of IASTName nodes for the binding's declaration + */ + public IASTName[] getDeclarations(IBinding binding); + + /** + * Returns the list of references in this translation unit to the given + * binding. This list contains the IASTName nodes that represent a use of the + * binding. + * + * @param binding + * @return List of IASTName nodes representing uses of the binding + */ + public IASTName[] getReferences(IBinding binding); + + public IASTNodeLocation getLocationInfo(int offset); + + public IASTNodeLocation[] getLocationInfo(int offset, int length); + + public IASTNode[] selectNodesForLocation(String path, int offset, int length); + + public IASTNode[] selectNodesForLocation(int offset, int length); + + public IASTPreprocessorMacroDefinition[] getMacroDefinitions(); + + public IASTPreprocessorIncludeStatement[] getIncludeDirectives(); + + public IASTPreprocessorStatement[] getAllPreprocessorStatements(); + + public IASTProblem[] getPreprocesorProblems(); + +} \ 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 5a6817ae1ed..de2f1a91e20 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 @@ -10,8 +10,9 @@ package org.eclipse.cdt.internal.core.dom.parser.c; +import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; @@ -39,7 +40,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit 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 IASTMacroDefinition[] EMPTY_PREPROCESSOR_MACRODEF_ARRAY = new IASTMacroDefinition[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]; @@ -142,9 +143,11 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getMacroDefinitions() */ - public IASTMacroDefinition[] getMacroDefinitions() { + public IASTPreprocessorMacroDefinition[] getMacroDefinitions() { if( resolver == null ) return EMPTY_PREPROCESSOR_MACRODEF_ARRAY; - return resolver.getMacroDefinitions(this); + IASTPreprocessorMacroDefinition [] result = resolver.getMacroDefinitions(); + setParentRelationship( result, IASTTranslationUnit.PREPROCESSOR_STATEMENT ); + return result; } @@ -153,16 +156,31 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit */ public IASTPreprocessorIncludeStatement[] getIncludeDirectives() { if( resolver == null ) return EMPTY_PREPROCESSOR_INCLUSION_ARRAY; - return resolver.getIncludeDirectives(this); + IASTPreprocessorIncludeStatement [] result = resolver.getIncludeDirectives(); + setParentRelationship( result, IASTTranslationUnit.PREPROCESSOR_STATEMENT ); + return result; } - /* (non-Javadoc) + /** + * @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; - return resolver.getAllPreprocessorStatements(this); + return resolver.getAllPreprocessorStatements(); } 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 c8e00d345ec..7529be8b27a 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 @@ -10,8 +10,9 @@ **********************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; @@ -50,7 +51,7 @@ public class CPPASTTranslationUnit extends CPPASTNode implements private static final IASTNodeLocation[] EMPTY_PREPROCESSOR_LOCATION_ARRAY = new IASTNodeLocation[0]; - private static final IASTMacroDefinition[] EMPTY_PREPROCESSOR_MACRODEF_ARRAY = new IASTMacroDefinition[0]; + private static final IASTPreprocessorMacroDefinition[] EMPTY_PREPROCESSOR_MACRODEF_ARRAY = new IASTPreprocessorMacroDefinition[0]; private static final IASTPreprocessorIncludeStatement[] EMPTY_PREPROCESSOR_INCLUSION_ARRAY = new IASTPreprocessorIncludeStatement[0]; @@ -168,10 +169,11 @@ public class CPPASTTranslationUnit extends CPPASTNode implements * * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getMacroDefinitions() */ - public IASTMacroDefinition[] getMacroDefinitions() { - if (resolver == null) - return EMPTY_PREPROCESSOR_MACRODEF_ARRAY; - return resolver.getMacroDefinitions(this); + public IASTPreprocessorMacroDefinition[] getMacroDefinitions() { + if( resolver == null ) return EMPTY_PREPROCESSOR_MACRODEF_ARRAY; + IASTPreprocessorMacroDefinition [] result = resolver.getMacroDefinitions(); + setParentRelationship( result, IASTTranslationUnit.PREPROCESSOR_STATEMENT ); + return result; } /* @@ -180,9 +182,22 @@ public class CPPASTTranslationUnit extends CPPASTNode implements * @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getIncludeDirectives() */ public IASTPreprocessorIncludeStatement[] getIncludeDirectives() { - if (resolver == null) - return EMPTY_PREPROCESSOR_INCLUSION_ARRAY; - return resolver.getIncludeDirectives(this); + 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 ); + } } /* @@ -193,7 +208,7 @@ public class CPPASTTranslationUnit extends CPPASTNode implements public IASTPreprocessorStatement[] getAllPreprocessorStatements() { if (resolver == null) return EMPTY_PREPROCESSOR_STATEMENT_ARRAY; - return resolver.getAllPreprocessorStatements(this); + return resolver.getAllPreprocessorStatements(); } /* diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index ccfeef13c54..68fe0bb47e6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -4301,6 +4301,14 @@ abstract class BaseScanner implements IScanner { protected ParserLanguage getLanguage() { return language; } + + protected CodeReader getMainReader() + { + if (bufferData != null && bufferData[0] != null + && bufferData[0] instanceof CodeReader) + return ((CodeReader) bufferData[0]); + return null; + } public char[] getMainFilename() { if (bufferData != null && bufferData[0] != null diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java index 7f69bd48814..1e62deb3a17 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java @@ -114,10 +114,10 @@ public class DOMScanner extends BaseScanner { int textEnd, int endingLine, IMacro macro) { if (macro instanceof ObjectStyleMacro) locationMap.defineObjectStyleMacro((ObjectStyleMacro) macro, - startingLineNumber, idstart, idend, textEnd); + startingOffset, idstart, idend, textEnd); else if (macro instanceof FunctionStyleMacro) locationMap.defineFunctionStyleMacro((FunctionStyleMacro) macro, - startingLineNumber, idstart, idend, textEnd); + startingOffset, idstart, idend, textEnd); } @@ -146,7 +146,7 @@ public class DOMScanner extends BaseScanner { } DOMInclusion inc = ((DOMInclusion) ((InclusionData) data).inclusion); globalCounter += getCurrentOffset(); - locationMap.startInclusion(inc.pt, inc.o, globalCounter); + locationMap.startInclusion(((InclusionData)data).reader, inc.o, globalCounter); contextDelta = 0; } super.pushContext(buffer, data); @@ -263,7 +263,7 @@ public class DOMScanner extends BaseScanner { */ protected void postConstructorSetup(CodeReader reader, IScannerInfo info) { super.postConstructorSetup(reader, info); - locationMap.startTranslationUnit(getMainFilename()); + locationMap.startTranslationUnit(getMainReader()); } /* diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ILocationResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ILocationResolver.java index c13b2446358..199767e2201 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ILocationResolver.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ILocationResolver.java @@ -10,8 +10,7 @@ **********************************************************************/ package org.eclipse.cdt.internal.core.parser.scanner2; -import org.eclipse.cdt.core.dom.ast.IASTMacroDefinition; -import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; @@ -22,9 +21,9 @@ import org.eclipse.cdt.core.dom.ast.IASTProblem; */ public interface ILocationResolver { - public IASTMacroDefinition [] getMacroDefinitions(IASTNode parent); - public IASTPreprocessorIncludeStatement [] getIncludeDirectives(IASTNode parent); - public IASTPreprocessorStatement [] getAllPreprocessorStatements(IASTNode parent); + public IASTPreprocessorMacroDefinition [] getMacroDefinitions(); + public IASTPreprocessorIncludeStatement [] getIncludeDirectives(); + public IASTPreprocessorStatement [] getAllPreprocessorStatements(); public IASTNodeLocation [] getLocations( int offset, int length ); public IASTNodeLocation getLocation( int offset ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java index 7db444a4353..3fc9e7c87da 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java @@ -11,16 +11,17 @@ package org.eclipse.cdt.internal.core.parser.scanner2; import org.eclipse.cdt.core.dom.ast.IASTProblem; +import org.eclipse.cdt.core.parser.CodeReader; /** * @author jcamelon */ public interface IScannerPreprocessorLog { - public void startTranslationUnit( char [] filename ); + public void startTranslationUnit( CodeReader tu_reader ); public void endTranslationUnit(int offset); - public void startInclusion(char[] includePath, int offset, int endOffset); + public void startInclusion(CodeReader reader, int offset, int endOffset); public void endInclusion(int offset); public void enterObjectStyleMacroExpansion(char[] name, char[] expansion, @@ -36,13 +37,13 @@ public interface IScannerPreprocessorLog { public void defineFunctionStyleMacro(FunctionStyleMacro m, int startOffset, int nameOffset, int nameEndOffset, int endOffset); - public void encounterPoundIf(int startOffset, int endOffset); + public void encounterPoundIf(int startOffset, int endOffset, boolean taken); public void encounterPoundPragma(int startOffset, int endOffset); public void encounterPoundError(int startOffset, int endOffset); - public void encounterPoundIfdef(int startOffset, int endOffset); + public void encounterPoundIfdef(int startOffset, int endOffset, boolean taken); public void encounterPoundUndef(int startOffset, int endOffset); public void encounterPoundElse(int startOffset, int endOffset); - public void encounterPoundElif(int startOffset, int endOffset); + public void encounterPoundElif(int startOffset, int endOffset, boolean taken); public void encounterPoundEndIf(int startOffset, int endOffset); public void encounterProblem( IASTProblem problem ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java index b0f2e2f28b2..a976cee5c7f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java @@ -14,19 +14,218 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; -import org.eclipse.cdt.core.dom.ast.IASTMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorFunctionStyleMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorObjectStyleMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.parser.CodeReader; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; /** * @author jcamelon */ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { + /** + * @author jcamelon + */ + protected static class _InclusionStatement extends ScannerASTNode implements + IASTPreprocessorIncludeStatement { + + private final char[] path; + + /** + * @param cs + */ + public _InclusionStatement(char[] cs) { + this.path = cs; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement#getPath() + */ + public String getPath() { + return new String( path ); + } + + } + /** + * @author jcamelon + */ + public static class ASTFunctionMacro extends ScannerASTNode implements + IASTPreprocessorFunctionStyleMacroDefinition { + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroDefinition#getParameters() + */ + public IASTFunctionStyleMacroParameter[] getParameters() { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroDefinition#addParameter(org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter) + */ + public void addParameter(IASTFunctionStyleMacroParameter parm) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#getName() + */ + public IASTName getName() { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#setName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public void setName(IASTName name) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#getExpansion() + */ + public String getExpansion() { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#setExpansion(java.lang.String) + */ + public void setExpansion(String exp) { + // TODO Auto-generated method stub + + } + + } + public static class ScannerASTNode extends ASTNode + { + private IASTNode parent; + private ASTNodeProperty property; + + public IASTNode getParent() { + return parent; + } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNode#getPropertyInParent() + */ + public ASTNodeProperty getPropertyInParent() { + return property; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNode#setParent(org.eclipse.cdt.core.dom.ast.IASTNode) + */ + public void setParent(IASTNode parent) { + this.parent = parent; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNode#setPropertyInParent(org.eclipse.cdt.core.dom.ast.IASTNodeProperty) + */ + public void setPropertyInParent(ASTNodeProperty property) { + this.property = property; + } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNode#getTranslationUnit() + */ + public IASTTranslationUnit getTranslationUnit() { + if( this instanceof IASTTranslationUnit ) return (IASTTranslationUnit) this; + IASTNode node = getParent(); + while( ! (node instanceof IASTTranslationUnit ) && node != null ) + { + node = node.getParent(); + } + return (IASTTranslationUnit) node; + } + + + } + /** + * @author jcamelon + */ + public static class ScannerASTName extends ScannerASTNode implements IASTName { + private final char[] name; + + public ScannerASTName( char [] n ) + { + this.name = n; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding() + */ + public IBinding resolveBinding() { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTName#toCharArray() + */ + public char[] toCharArray() { + return name; + } + } + /** + * @author jcamelon + */ + public static class ASTObjectMacro extends ScannerASTNode implements + IASTPreprocessorObjectStyleMacroDefinition { + + private IASTName name; + private String expansion; + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#getName() + */ + public IASTName getName() { + return name; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#setName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public void setName(IASTName name) { + this.name = name; + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#getExpansion() + */ + public String getExpansion() { + return expansion; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTMacroDefinition#setExpansion(java.lang.String) + */ + public void setExpansion(String exp) { + this.expansion = exp; + } + + } public static class Location implements IASTNodeLocation { private final int nodeOffset; private final int nodeLength; @@ -60,9 +259,6 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } - /** - * @author jcamelon - */ public static class FileLocation extends Location implements IASTFileLocation { @@ -89,34 +285,32 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } } - - private static final IASTProblem[] EMPTY_PROBLEMS_ARRAY = new IASTProblem[0]; - private static final IASTNodeLocation[] EMPTY_LOCATION_ARRAY = new IASTNodeLocation[0]; - - public static class Context { + + protected static class _Context { /** * @param startOffset * @param endOffset */ - public Context(CompositeContext parent, int startOffset, int endOffset) { + public _Context(_CompositeContext parent, int startOffset, int endOffset) { this.context_directive_start = startOffset; this.context_directive_end = endOffset; + this.context_ends = endOffset; this.parent = parent; } public final int context_directive_start; public final int context_directive_end; - public int context_ends = -1; - private final CompositeContext parent; + public int context_ends; + private final _CompositeContext parent; - public CompositeContext getParent() { + public _CompositeContext getParent() { return parent; } } - public static class CompositeContext extends Context { + protected static class _CompositeContext extends _Context { - public CompositeContext(CompositeContext parent, int startOffset, + public _CompositeContext(_CompositeContext parent, int startOffset, int endOffset) { super(parent, startOffset, endOffset); } @@ -129,7 +323,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { return subContexts; } - public void addSubContext(Context c) { + public void addSubContext(_Context c) { if (subContexts == Collections.EMPTY_LIST) subContexts = new ArrayList(DEFAULT_SUBCONTEXT_ARRAY_SIZE); subContexts.add(c); @@ -144,30 +338,83 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } - public static class Inclusion extends CompositeContext { - public final char[] path; + protected static class _Inclusion extends _CompositeContext { + public final CodeReader reader; - public Inclusion(CompositeContext parent, char[] path, int startOffset, + public _Inclusion(_CompositeContext parent, CodeReader reader, int startOffset, int endOffset) { super(parent, startOffset, endOffset); - this.path = path; + this.reader = reader; } } - public static class TranslationUnit extends CompositeContext { - public final char[] path; + protected static class _TranslationUnit extends _CompositeContext { + public final CodeReader reader; /** * @param startOffset * @param endOffset */ - public TranslationUnit(char[] path) { + public _TranslationUnit(CodeReader reader) { super(null, 0, 0); - this.path = path; + this.reader = reader; } } + + protected static class _MacroDefinition extends _Context + { - public static class Problem extends Context { + /** + * @param parent + * @param startOffset + * @param endOffset + * @param nameOffset TODO + */ + public _MacroDefinition(_CompositeContext parent, int startOffset, int endOffset, char[] name, int nameOffset, char[] expansion) { + super(parent, startOffset, endOffset); + this.name = name; + this.expansion = expansion; + this.nameOffset = nameOffset; + } + + public final char [] name; + public final char [] expansion; + public final int nameOffset; + } + + protected static class _ObjectMacroDefinition extends _MacroDefinition + { + /** + * @param parent + * @param startOffset + * @param endOffset + * @param name TODO + * @param expansion TODO + */ + public _ObjectMacroDefinition(_CompositeContext parent, int startOffset, int endOffset, char[] name, int nameOffset, char[] expansion) { + super(parent, startOffset, endOffset, name, nameOffset, expansion); + } + + } + + protected static class _FunctionMacroDefinition extends _MacroDefinition + { + + public final char [] [] parms; + /** + * @param parent + * @param startOffset + * @param endOffset + * @param parameters + */ + public _FunctionMacroDefinition(_CompositeContext parent, int startOffset, int endOffset, char [] name, int nameOffset, char [] expansion, char[][] parameters ) { + super(parent, startOffset, endOffset, name, nameOffset, expansion); + this.parms = parameters; + } + } + + + protected static class _Problem extends _Context { public final IASTProblem problem; /** @@ -175,7 +422,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @param startOffset * @param endOffset */ - public Problem(CompositeContext parent, int startOffset, int endOffset, + public _Problem(_CompositeContext parent, int startOffset, int endOffset, IASTProblem problem) { super(parent, startOffset, endOffset); this.problem = problem; @@ -183,8 +430,9 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } - protected TranslationUnit tu; - protected CompositeContext currentContext; + protected _TranslationUnit tu; + protected _CompositeContext currentContext; + /** * @@ -192,25 +440,63 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { public LocationMap() { } + private static final IASTProblem[] EMPTY_PROBLEMS_ARRAY = new IASTProblem[0]; + private static final IASTNodeLocation[] EMPTY_LOCATION_ARRAY = new IASTNodeLocation[0]; + private static final IASTPreprocessorMacroDefinition[] EMPTY_MACRO_DEFINITIONS_ARRAY = new IASTPreprocessorMacroDefinition[0]; + private static final IASTPreprocessorIncludeStatement[] EMPTY_INCLUDES_ARRAY = new IASTPreprocessorIncludeStatement[0]; + /* * (non-Javadoc) * * @see org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver#getMacroDefinitions() */ - public IASTMacroDefinition[] getMacroDefinitions(IASTNode parent) { - // TODO Auto-generated method stub - return null; - } + public IASTPreprocessorMacroDefinition[] getMacroDefinitions() { + List contexts = new ArrayList(8); + LocationMap.collectContexts(V_MACRODEFS, tu, contexts); + if (contexts.isEmpty()) + return EMPTY_MACRO_DEFINITIONS_ARRAY; + IASTPreprocessorMacroDefinition[] result = new IASTPreprocessorMacroDefinition[contexts.size()]; + for (int i = 0; i < contexts.size(); ++i) + { + _MacroDefinition d = (_MacroDefinition) contexts.get(i); + IASTPreprocessorMacroDefinition r = null; + if( d instanceof _ObjectMacroDefinition ) + r = new ASTObjectMacro(); + else if ( d instanceof _FunctionMacroDefinition ) + { + IASTPreprocessorFunctionStyleMacroDefinition f = new ASTFunctionMacro(); + //TODO parms + r = f; + } + + IASTName name = new ScannerASTName( d.name ); + name.setPropertyInParent( IASTPreprocessorMacroDefinition.MACRO_NAME ); + name.setParent( r ); + r.setName( name ); + r.setExpansion( new String( ((_ObjectMacroDefinition)d).expansion ) ); + ((ScannerASTNode)r).setOffsetAndLength( d.context_directive_start, d.context_directive_end - d.context_directive_start ); + result[i] = r; + } + + return result; } /* * (non-Javadoc) * * @see org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver#getIncludeDirectives() */ - public IASTPreprocessorIncludeStatement[] getIncludeDirectives( - IASTNode newParam) { - // TODO Auto-generated method stub - return null; + public IASTPreprocessorIncludeStatement[] getIncludeDirectives() { + List contexts = new ArrayList(8); + collectContexts( V_INCLUSIONS, tu, contexts ); + if( contexts.isEmpty() ) return EMPTY_INCLUDES_ARRAY; + IASTPreprocessorIncludeStatement [] result = new IASTPreprocessorIncludeStatement[ contexts.size() ]; + for( int i = 0; i < contexts.size(); ++i ) + { + _Inclusion inc = ((_Inclusion)contexts.get(i)); + result[i] = new _InclusionStatement( inc.reader.filename ); + ((ScannerASTNode)result[i]).setOffsetAndLength( inc.context_directive_start, inc.context_directive_end - inc.context_directive_start ); + } + return result; } /* @@ -218,8 +504,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * * @see org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver#getAllPreprocessorStatements() */ - public IASTPreprocessorStatement[] getAllPreprocessorStatements( - IASTNode newParam) { + public IASTPreprocessorStatement[] getAllPreprocessorStatements() { // TODO Auto-generated method stub return null; } @@ -233,7 +518,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { public IASTNodeLocation[] getLocations(int offset, int length) { if (tu == null) return EMPTY_LOCATION_ARRAY; - Context c = findContextForOffset(offset); + _Context c = findContextForOffset(offset); if (c.context_ends >= offset + length) return createSoleLocation(c, offset, length); @@ -246,17 +531,17 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @param length * @return */ - protected IASTNodeLocation[] createSoleLocation(Context c, int offset, + protected IASTNodeLocation[] createSoleLocation(_Context c, int offset, int length) { IASTNodeLocation[] result = new IASTNodeLocation[1]; - if (c instanceof TranslationUnit) { - result[0] = new FileLocation(((TranslationUnit) c).path, reconcileOffset( c, offset ), + if (c instanceof _TranslationUnit) { + result[0] = new FileLocation(((_TranslationUnit) c).reader.filename, reconcileOffset( c, offset ), length); return result; } - if( c instanceof Inclusion ) + if( c instanceof _Inclusion ) { - result[0] = new FileLocation(((Inclusion) c).path, reconcileOffset( c, offset ), + result[0] = new FileLocation(((_Inclusion) c).reader.filename, reconcileOffset( c, offset ), length); return result; } @@ -268,14 +553,14 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @param offset * @return */ - protected static int reconcileOffset(Context c, int offset) { + protected static int reconcileOffset(_Context c, int offset) { int subtractOff = 0; - if( c instanceof CompositeContext ) + if( c instanceof _CompositeContext ) { - List subs = ((CompositeContext)c).getSubContexts(); + List subs = ((_CompositeContext)c).getSubContexts(); for( int i = 0; i < subs.size(); ++i ) { - Context subC = (Context) subs.get(i); + _Context subC = (_Context) subs.get(i); if( subC.context_ends < offset ) subtractOff += subC.context_ends - subC.context_directive_end; else @@ -289,11 +574,11 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @param offset * @return */ - protected Context findContextForOffset(int offset) { + protected _Context findContextForOffset(int offset) { return findContextForOffset(tu, offset); } - protected static Context findContextForOffset(CompositeContext context, + protected static _Context findContextForOffset(_CompositeContext context, int offset) { if (!context.hasSubContexts() ) { @@ -303,12 +588,12 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } List subContexts = context.getSubContexts(); //check first - Context bestContext = (Context) subContexts.get(0); + _Context bestContext = (_Context) subContexts.get(0); if (bestContext.context_directive_end > offset) return context; for (int i = 1; i < subContexts.size(); ++i) { - Context nextContext = (Context) subContexts.get(i); + _Context nextContext = (_Context) subContexts.get(i); if (nextContext.context_directive_end < offset) bestContext = nextContext; else @@ -318,8 +603,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { if ( bestContext.context_ends < offset ) return context; - if (bestContext instanceof CompositeContext) - return findContextForOffset((CompositeContext) bestContext, offset); + if (bestContext instanceof _CompositeContext) + return findContextForOffset((_CompositeContext) bestContext, offset); return bestContext; } @@ -338,8 +623,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#startTranslationUnit() */ - public void startTranslationUnit(char[] filename) { - tu = new TranslationUnit(filename); + public void startTranslationUnit(CodeReader tu_reader) { + tu = new _TranslationUnit(tu_reader); currentContext = tu; } @@ -358,8 +643,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#startInclusion(char[], * int) */ - public void startInclusion(char[] includePath, int offset, int endOffset) { - Inclusion i = new Inclusion(currentContext, includePath, offset, + public void startInclusion(CodeReader reader, int offset, int endOffset) { + _Inclusion i = new _Inclusion(currentContext, reader, offset, endOffset); currentContext.addSubContext(i); currentContext = i; @@ -372,7 +657,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * int) */ public void endInclusion(int offset) { - ((Inclusion) currentContext).context_ends = offset; + ((_Inclusion) currentContext).context_ends = offset; currentContext = currentContext.getParent(); } @@ -430,8 +715,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { */ public void defineObjectStyleMacro(ObjectStyleMacro m, int startOffset, int nameOffset, int nameEndOffset, int endOffset) { - // TODO Auto-generated method stub - + currentContext.addSubContext(new _ObjectMacroDefinition( currentContext, startOffset, endOffset, m.name, nameOffset, m.expansion )); } /* @@ -442,8 +726,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { */ public void defineFunctionStyleMacro(FunctionStyleMacro m, int startOffset, int nameOffset, int nameEndOffset, int endOffset) { - // TODO Auto-generated method stub - + currentContext.addSubContext(new _FunctionMacroDefinition( currentContext, startOffset, endOffset, m.name, nameOffset, m.expansion, m.arglist )); } /* @@ -452,7 +735,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#encounterPoundIf(int, * int) */ - public void encounterPoundIf(int startOffset, int endOffset) { + public void encounterPoundIf(int startOffset, int endOffset, boolean taken) { // TODO Auto-generated method stub } @@ -485,7 +768,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#encounterPoundIfdef(int, * int) */ - public void encounterPoundIfdef(int startOffset, int endOffset) { + public void encounterPoundIfdef(int startOffset, int endOffset, boolean taken) { // TODO Auto-generated method stub } @@ -518,7 +801,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#encounterPoundElif(int, * int) */ - public void encounterPoundElif(int startOffset, int endOffset) { + public void encounterPoundElif(int startOffset, int endOffset, boolean taken) { // TODO Auto-generated method stub } @@ -540,7 +823,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver#getTranslationUnitPath() */ public String getTranslationUnitPath() { - return new String(tu.path); + return new String(tu.reader.filename); } /* @@ -564,7 +847,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { return EMPTY_PROBLEMS_ARRAY; IASTProblem[] result = new IASTProblem[contexts.size()]; for (int i = 0; i < contexts.size(); ++i) - result[i] = ((Problem) contexts.get(i)).problem; + result[i] = ((_Problem) contexts.get(i)).problem; return result; } @@ -576,7 +859,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { */ public void encounterProblem(IASTProblem problem) { ScannerASTProblem p = (ScannerASTProblem) problem; - Problem pr = new Problem(currentContext, p.getOffset(), p.getOffset() + _Problem pr = new _Problem(currentContext, p.getOffset(), p.getOffset() + p.getLength(), problem); pr.context_ends = p.getOffset() + p.getLength(); } @@ -584,25 +867,30 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { protected static final int V_ALL = 1; protected static final int V_INCLUSIONS = 2; protected static final int V_PROBLEMS = 3; + protected static final int V_MACRODEFS = 4; - protected static void collectContexts(int key, Context source, List result) { + protected static void collectContexts(int key, _Context source, List result) { switch (key) { case V_ALL: result.add(source); break; case V_INCLUSIONS: - if (source instanceof Inclusion) + if (source instanceof _Inclusion) result.add(source); break; case V_PROBLEMS: - if (source instanceof Problem) + if (source instanceof _Problem) + result.add(source); + break; + case V_MACRODEFS: + if( source instanceof _MacroDefinition ) result.add(source); break; } - if (source instanceof CompositeContext) { - List l = ((CompositeContext) source).getSubContexts(); + if (source instanceof _CompositeContext) { + List l = ((_CompositeContext) source).getSubContexts(); for (int i = 0; i < l.size(); ++i) - collectContexts(key, (Context) l.get(i), result); + collectContexts(key, (_Context) l.get(i), result); } }