diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMParserTestSuite.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMParserTestSuite.java index 140baf93b41..5dc60ec2650 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMParserTestSuite.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMParserTestSuite.java @@ -35,6 +35,7 @@ public class DOMParserTestSuite extends TestCase { suite.addTest( CompleteParser2Tests.suite() ); suite.addTest( DOMLocationTests.suite() ); suite.addTestSuite( DOMLocationMacroTests.class ); + suite.addTest (ImageLocationTests.suite()); suite.addTest( DOMLocationInclusionTests.suite() ); suite.addTestSuite( AST2KnRTests.class ); suite.addTestSuite( AST2UtilTests.class ); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ImageLocationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ImageLocationTests.java new file mode 100644 index 00000000000..b3c890aa6e5 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ImageLocationTests.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * 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 (Wind River Systems) + *******************************************************************************/ +package org.eclipse.cdt.core.parser.tests.ast2; + +import junit.framework.Test; + +import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTImageLocation; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.parser.ParserLanguage; + +/** + * @author jcamelon + */ +public class ImageLocationTests extends AST2BaseTest { + + private static final int CODE = IASTImageLocation.REGULAR_CODE; + private static final int MACRO = IASTImageLocation.MACRO_DEFINITION; + private static final int MACRO_ARG = IASTImageLocation.ARGUMENT_TO_MACRO_EXPANSION; + + public static Test suite() { + return suite(ImageLocationTests.class); + } + + public ImageLocationTests() { + } + + public ImageLocationTests(String name) { + setName(name); + } + + // int a; + public void testFileLocation() throws Exception { + String code= getContents(1)[0].toString(); + IASTTranslationUnit tu = parse(code, ParserLanguage.CPP); + + IASTDeclaration declaration = tu.getDeclarations()[0]; + IASTName name= getName(declaration); + IASTImageLocation loc= name.getImageLocation(); + assertLocation(CODE, code, "a", 0, loc); + } + + // #define M result1 + // #define F() result2 + // int M; + // int F(); + public void testMacroLocation() throws Exception { + String code= getContents(1)[0].toString(); + IASTTranslationUnit tu = parse(code, ParserLanguage.CPP); + + IASTDeclaration declaration = tu.getDeclarations()[0]; + IASTName name= getName(declaration); + IASTImageLocation loc= name.getImageLocation(); + assertLocation(MACRO, code, "result1", 0, loc); + + declaration = tu.getDeclarations()[1]; + name= getName(declaration); + loc= name.getImageLocation(); + assertLocation(MACRO, code, "result2", 0, loc); + } + + // #define M result + // #define F() M + // int F(); + public void testIndirectMacroLocation() throws Exception { + String code= getContents(1)[0].toString(); + IASTTranslationUnit tu = parse(code, ParserLanguage.CPP); + + IASTDeclaration declaration = tu.getDeclarations()[0]; + IASTName name= getName(declaration); + IASTImageLocation loc= name.getImageLocation(); + assertLocation(MACRO, code, "result", 0, loc); + } + + + // #define M result1 + // #define F(x) x + // int F(result2); + // int F(M); + public void testMacroArgumentLocation() throws Exception { + String code= getContents(1)[0].toString(); + IASTTranslationUnit tu = parse(code, ParserLanguage.CPP); + + IASTDeclaration declaration = tu.getDeclarations()[0]; + IASTName name= getName(declaration); + IASTImageLocation loc= name.getImageLocation(); + assertLocation(MACRO_ARG, code, "result2", 0, loc); + + declaration = tu.getDeclarations()[1]; + name= getName(declaration); + loc= name.getImageLocation(); + assertLocation(MACRO, code, "result1", 0, loc); + } + + private void assertLocation(int kind, String code, String name, int extra, IASTImageLocation loc) { + assertNotNull(loc); + assertEquals(kind, loc.getLocationKind()); + assertEquals(code.indexOf(name), loc.getNodeOffset()); + assertEquals(name.length()-extra, loc.getNodeLength()); + } + + private IASTName getName(IASTNode node) { + final IASTName[] result= {null}; + node.accept(new ASTVisitor() { + { + shouldVisitNames= true; + } + public int visit(IASTName name) { + result[0]= name; + return PROCESS_ABORT; + } + }); + return result[0]; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java index f0716b831d3..871303f0c78 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java @@ -245,7 +245,7 @@ public class MacroExpander { private ImageLocationInfo createImageLocationInfo(Token t) { final Object s= t.fSource; if (s instanceof ObjectStyleMacro) { - return new MacroImageLocationInfo((ObjectStyleMacro) s, fEndOffset, fEndOffset); + return new MacroImageLocationInfo((ObjectStyleMacro) s, t.getOffset(), t.getEndOffset()); } else if (s instanceof CPreprocessor) { int sequenceNumber= fLocationMap.getSequenceNumberForOffset(t.getOffset()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/PreprocessorMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/PreprocessorMacro.java index 7dd0edb64b2..1cac776b61a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/PreprocessorMacro.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/PreprocessorMacro.java @@ -136,8 +136,10 @@ class ObjectStyleMacro extends PreprocessorMacro { } private void setSource(Token t) { + final int shift= -fExpansionOffset; while (t != null) { t.fSource= this; + t.shiftOffset(shift); t= (Token) t.getNext(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Token.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Token.java index 4fdd9ab4bd5..7d9917f36ca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Token.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Token.java @@ -65,6 +65,11 @@ public class Token implements IToken, Cloneable { fEndOffset= endOffset; } + public void shiftOffset(int shift) { + fOffset+= shift; + fEndOffset+= shift; + } + public char[] getCharImage() { return TokenUtil.getImage(getType()); }