From ac3d4db76bba1dd5e06b532abc8a0bc57c49087e Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 23 Oct 2007 12:47:10 +0000 Subject: [PATCH] Test cases and fixes for the location map --- .../tests/scanner/LocationMapTests.java | 78 +++++++++++++++++-- .../core/parser/tests/scanner/TestMacro.java | 4 +- .../parser/scanner/ASTPreprocessorName.java | 13 +--- .../parser/scanner/IPreprocessorMacro.java | 21 ----- .../parser/scanner/ImageLocationInfo.java | 2 +- .../core/parser/scanner/LocationCtx.java | 16 ++-- .../core/parser/scanner/LocationMap.java | 24 +++--- .../parser/scanner/PreprocessorMacro.java | 3 +- 8 files changed, 101 insertions(+), 60 deletions(-) delete mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/IPreprocessorMacro.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LocationMapTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LocationMapTests.java index 2f6d576c3bc..2bddc6ea32e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LocationMapTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LocationMapTests.java @@ -38,21 +38,30 @@ 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.dom.ast.IMacroBinding; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit; import org.eclipse.cdt.internal.core.parser.scanner.ILocationCtx; -import org.eclipse.cdt.internal.core.parser.scanner.IPreprocessorMacro; +import org.eclipse.cdt.internal.core.parser.scanner.ImageLocationInfo; import org.eclipse.cdt.internal.core.parser.scanner.LocationMap; public class LocationMapTests extends BaseTestCase { private static final String FN = "filename"; private static final int ROLE_DEFINITION = IASTNameOwner.r_definition; private static final int ROLE_UNCLEAR = IASTNameOwner.r_unclear; + private static final int ROLE_REFERENCE = IASTNameOwner.r_reference; private static final ASTNodeProperty PROP_PST = IASTTranslationUnit.PREPROCESSOR_STATEMENT; final static char[] DIGITS= "0123456789abcdef".toCharArray(); + final static char[] LONGDIGITS= new char[1024]; + static { + for (int i = 0; i < LONGDIGITS.length; i++) { + LONGDIGITS[i]= (char) i; + } + } private LocationMap fLocationMap; private CPPASTTranslationUnit fTu; @@ -227,7 +236,7 @@ public class LocationMapTests extends BaseTestCase { checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive); } - private void checkMacroDefinition(IASTPreprocessorMacroDefinition macro, IBinding binding, String image, String name, + private void checkMacroDefinition(IASTPreprocessorMacroDefinition macro, IMacroBinding binding, String image, String name, String nameImage, String expansion, String[] parameters, String filename, int offset, int length, int line, int nameOffset, int nameLength) { assertEquals(expansion, macro.getExpansion()); @@ -243,6 +252,12 @@ public class LocationMapTests extends BaseTestCase { checkASTNode(mp, fd, IASTPreprocessorFunctionStyleMacroDefinition.PARAMETER, filename, -1, 0, -1, 0, null); } } + int expectCount= offset >= 0 ? 1 : 0; + IASTName[] decls= fLocationMap.getDeclarations(binding); + assertEquals(expectCount, decls.length); + if (expectCount > 0) { + assertSame(macro.getName(), decls[0]); + } } private void checkMacroUndef(IASTPreprocessorStatement s, IBinding binding, String image, String name, String nameImage, @@ -394,9 +409,9 @@ public class LocationMapTests extends BaseTestCase { } public void testIndexDefine() { - IPreprocessorMacro macro1= new TestMacro("n1", "exp1", null); + IMacroBinding macro1= new TestMacro("n1", "exp1", null); final String[] params = new String[]{"p1", "p2"}; - IPreprocessorMacro macro2= new TestMacro("n2", "exp2", params); + IMacroBinding macro2= new TestMacro("n2", "exp2", params); init(DIGITS); fLocationMap.registerMacroFromIndex(macro1, "fidx1", 0, 0, 0); fLocationMap.registerMacroFromIndex(macro2, "fidx2", 1, 4, 8); @@ -407,7 +422,7 @@ public class LocationMapTests extends BaseTestCase { } public void testUndefine() { - IPreprocessorMacro macro1= new TestMacro("n1", "exp1", null); + IMacroBinding macro1= new TestMacro("n1", "exp1", null); init(DIGITS); fLocationMap.encounterPoundUndef(null, 0, 0, 0, 0, "n1".toCharArray()); @@ -418,6 +433,36 @@ public class LocationMapTests extends BaseTestCase { checkMacroUndef(prep[1], macro1, new String(DIGITS), "n2", "3456", FN, 0, 16, 1, 3, 4); } + public void testMacroExpansion() { + ImageLocationInfo ili= new ImageLocationInfo(); + IMacroBinding macro1= new TestMacro("n1", "exp1", null); + IMacroBinding macro2= new TestMacro("n2", "exp2", null); + IMacroBinding macro3= new TestMacro("n3", "exp3", null); + init(LONGDIGITS); + assertEquals(1, fLocationMap.getCurrentLineNumber('\n')); + assertEquals(2, fLocationMap.getCurrentLineNumber('\n'+1)); + fLocationMap.registerPredefinedMacro(macro1); + fLocationMap.registerMacroFromIndex(macro2, "ifile", 2, 12, 32); + fLocationMap.encounterPoundDefine(3, 13, 33, 63, 103, macro3); + IASTName name1= fLocationMap.encounterImplicitMacroExpansion(macro1, ili); + IASTName name2= fLocationMap.encounterImplicitMacroExpansion(macro2, ili); + fLocationMap.pushMacroExpansion(110, 115, 125, 30, macro3, new IASTName[]{name1, name2}, new ImageLocationInfo[0]); + fLocationMap.encounteredComment(12, 23, false); + checkComment(fLocationMap.getComments()[0], new String(LONGDIGITS, 110, 15), false, FN, 110, 15, 2, 2); + + IASTName[] refs= fLocationMap.getReferences(macro1); + assertEquals(1, refs.length); + checkName(refs[0], macro1, "n1", fTu, IASTTranslationUnit.EXPANSION_NAME, ROLE_REFERENCE, FN, 110, 15, 2, 2, new String(LONGDIGITS, 110, 15)); + + refs= fLocationMap.getReferences(macro2); + assertEquals(1, refs.length); + checkName(refs[0], macro2, "n2", fTu, IASTTranslationUnit.EXPANSION_NAME, ROLE_REFERENCE, FN, 110, 15, 2, 2, new String(LONGDIGITS, 110, 15)); + + refs= fLocationMap.getReferences(macro3); + assertEquals(1, refs.length); + checkName(refs[0], macro3, "n3", fTu, IASTTranslationUnit.EXPANSION_NAME, ROLE_REFERENCE, FN, 110, 5, 2, 2, new String(LONGDIGITS, 110, 5)); + } + public void testContexts() { init(DIGITS); assertEquals(FN, fLocationMap.getTranslationUnitPath()); @@ -485,5 +530,28 @@ public class LocationMapTests extends BaseTestCase { checkLocation(fLocationMap.getMappedFileLocation(36, 0), "pre2", 0, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(45, 0), "pre2", 9, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(46, 0), FN, 0, 0, 1, 1); + + checkLocation(fLocationMap.getMappedFileLocation(0, 7), FN, 0, 0, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(6, 10), "pre1", 0, 9, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(6, 20), "pre1", 0, 10, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(15, 11), "pre1", 6, 4, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(25, 2), FN, 0, 0, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(26, 5), FN, 0, 0, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(30, 7), FN, 0, 0, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(36, 11), FN, 0, 0, 1, 1); + checkLocation(fLocationMap.getMappedFileLocation(46, 5), FN, 0, 1, 1, 1); + + IDependencyTree tree= fLocationMap.getDependencyTree(); + assertEquals(FN, tree.getTranslationUnitPath()); + IASTInclusionNode[] inclusions= tree.getInclusions(); + assertEquals(2, inclusions.length); + checkInclude(inclusions[0].getIncludeDirective(), "", "", "pre1", "pre1", false, true, FN, 0, 0, 1, 0, 0); + checkInclude(inclusions[1].getIncludeDirective(), "", "", "pre2", "pre2", false, true, FN, 0, 0, 1, 0, 0); + assertEquals(0, inclusions[1].getNestedInclusions().length); + + inclusions= inclusions[0].getNestedInclusions(); + assertEquals(1, inclusions.length); + checkInclude(inclusions[0].getIncludeDirective(), "b4b", "4", "pre11", "pre11", false, true, "pre1", 6, 3, 1, 7, 1); + assertEquals(0, inclusions[0].getNestedInclusions().length); } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/TestMacro.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/TestMacro.java index cd82552ce68..de99af2b453 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/TestMacro.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/TestMacro.java @@ -12,11 +12,11 @@ package org.eclipse.cdt.core.parser.tests.scanner; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.internal.core.parser.scanner.IPreprocessorMacro; import org.eclipse.core.runtime.CoreException; -final class TestMacro implements IPreprocessorMacro { +final class TestMacro implements IMacroBinding { private String fName; private String fExpansion; private String[] fParams; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java index 11f7db3bbfe..6d2ffcb23de 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.internal.core.dom.Linkage; /** @@ -127,16 +128,8 @@ class ASTBuiltinName extends ASTPreprocessorDefinition { } class ASTMacroReferenceName extends ASTPreprocessorName { - public ASTMacroReferenceName(IASTNode parent, IPreprocessorMacro macro, ImageLocationInfo imgLocationInfo) { - super(parent, IASTTranslationUnit.EXPANSION_NAME, 0, 0, macro.getNameCharArray(), macro); - } - - public String getContainingFilename() { - return getTranslationUnit().getContainingFilename(); - } - - public String getRawSignature() { - return toString(); + public ASTMacroReferenceName(IASTNode parent, int offset, int endOffset, IMacroBinding macro, ImageLocationInfo imgLocationInfo) { + super(parent, IASTTranslationUnit.EXPANSION_NAME, offset, endOffset, macro.getNameCharArray(), macro); } public boolean isReference() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/IPreprocessorMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/IPreprocessorMacro.java deleted file mode 100644 index 4f0e24f78de..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/IPreprocessorMacro.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * 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.parser.scanner; - -import org.eclipse.cdt.core.dom.ast.IMacroBinding; - -/** - * Interface for the location map when using the macros from the preprocessor. - * @since 5.0 - */ -public interface IPreprocessorMacro extends ILocationCtx, IMacroBinding { - -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ImageLocationInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ImageLocationInfo.java index 980ed341097..5066a405018 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ImageLocationInfo.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ImageLocationInfo.java @@ -16,6 +16,6 @@ package org.eclipse.cdt.internal.core.parser.scanner; * * @since 5.0 */ -class ImageLocationInfo { +public class ImageLocationInfo { } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtx.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtx.java index fc98e29a52e..067ebc4276b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtx.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationCtx.java @@ -203,13 +203,15 @@ class ContainerLocationCtx extends LocationCtx { } public void getInclusions(ArrayList result) { - for (Iterator iterator = fChildren.iterator(); iterator.hasNext();) { - LocationCtx ctx= (LocationCtx) iterator.next(); - if (ctx.getInclusionStatement() != null) { - result.add(new ASTInclusionNode(ctx)); - } - else { - ctx.getInclusions(result); + if (fChildren != null) { + for (Iterator iterator = fChildren.iterator(); iterator.hasNext();) { + LocationCtx ctx= (LocationCtx) iterator.next(); + if (ctx.getInclusionStatement() != null) { + result.add(new ASTInclusionNode(ctx)); + } + else { + ctx.getInclusions(result); + } } } } 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 6a613cb3e13..f3807021269 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 @@ -59,7 +59,7 @@ public class LocationMap implements ILocationResolver { registerPredefinedMacro(macro, null, -1, -1, -1); } - public void registerMacroFromIndex(IPreprocessorMacro macro, String filename, int nameOffset, int nameEndOffset, int expansionOffset) { + public void registerMacroFromIndex(IMacroBinding macro, String filename, int nameOffset, int nameEndOffset, int expansionOffset) { registerPredefinedMacro(macro, filename, nameOffset, nameEndOffset, expansionOffset); } @@ -131,13 +131,12 @@ public class LocationMap implements ILocationResolver { * @param macro the macro that has been expanded * @param imageLocationInfo the image-location for the name of the macro. */ - public IASTName encounterImplicitMacroExpansion(IPreprocessorMacro macro, ImageLocationInfo imageLocationInfo) { - return new ASTMacroReferenceName(fTranslationUnit, macro, imageLocationInfo); + public IASTName encounterImplicitMacroExpansion(IMacroBinding macro, ImageLocationInfo imageLocationInfo) { + return new ASTMacroReferenceName(fTranslationUnit, 0, 0, macro, imageLocationInfo); } /** * Creates a new context for the result of a (recursive) macro-expansion. - * @param startOffset offset within the current context where macro-expansion starts. * @param nameOffset offset within the current context where the name for the macro-expansion starts. * @param nameEndOffset offset within the current context where the name for the macro-expansion ends. * @param endOffset offset within the current context where the entire macro-expansion ends. @@ -145,31 +144,30 @@ public class LocationMap implements ILocationResolver { * @param implicitMacroReferences an array of implicit macro-expansions. * @param imageLocations an array of image-locations for the new context. */ - public ILocationCtx pushMacroExpansion(int startOffset, int nameOffset, int nameEndOffset, int endOffset, int contextLength, - IPreprocessorMacro macro, IASTName[] implicitMacroReferences, ImageLocationInfo[] imageLocations) { + public ILocationCtx pushMacroExpansion(int nameOffset, int nameEndOffset, int endOffset, int contextLength, + IMacroBinding macro, IASTName[] implicitMacroReferences, ImageLocationInfo[] imageLocations) { assert fCurrentContext instanceof ContainerLocationCtx; - int startNumber= getSequenceNumberForOffset(startOffset); int nameNumber= getSequenceNumberForOffset(nameOffset); int nameEndNumber= getSequenceNumberForOffset(nameEndOffset); int endNumber= getSequenceNumberForOffset(endOffset); + final int length= endNumber-nameNumber; for (int i = 0; i < implicitMacroReferences.length; i++) { ASTMacroReferenceName name = (ASTMacroReferenceName) implicitMacroReferences[i]; - name.setOffsetAndLength(startNumber, endNumber); - addExpansion((IPreprocessorMacro) name.getBinding(), name); + name.setOffsetAndLength(nameNumber, length); + addExpansion((IMacroBinding) name.getBinding(), name); } - ASTPreprocessorName expansion= new ASTPreprocessorName(fTranslationUnit, IASTTranslationUnit.EXPANSION_NAME, - nameNumber, nameEndNumber, macro.getNameCharArray(), macro); + ASTMacroReferenceName expansion= new ASTMacroReferenceName(fTranslationUnit, nameNumber, nameEndNumber, macro, null); addExpansion(macro, expansion); - fCurrentContext= new MacroExpansionCtx((ContainerLocationCtx) fCurrentContext, startOffset, endOffset, endNumber, contextLength, imageLocations, expansion); + fCurrentContext= new MacroExpansionCtx((ContainerLocationCtx) fCurrentContext, nameOffset, endOffset, endNumber, contextLength, imageLocations, expansion); fLastChildInsertionOffset= 0; return fCurrentContext; } - private void addExpansion(IPreprocessorMacro macro, ASTPreprocessorName name) { + private void addExpansion(IMacroBinding macro, ASTPreprocessorName name) { List list= (List) fMacroExpansions.get(macro); if (list == null) { list= new ArrayList(); 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 2cc60a27764..7d950fc5912 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 @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.parser.scanner; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.core.parser.util.CharArrayUtils; @@ -20,7 +21,7 @@ import org.eclipse.cdt.internal.core.dom.Linkage; * Models macros used by the preprocessor * @since 5.0 */ -abstract class PreprocessorMacro implements IPreprocessorMacro { +abstract class PreprocessorMacro implements IMacroBinding { final private char[] fName; public PreprocessorMacro(char[] name) {