From 2b758858a2a23322b64231897c4a425969b684e5 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 7 Mar 2005 18:35:39 +0000 Subject: [PATCH] Patch for Devin Steffler. This patch includes: - cleaned up style so that exceptions are not used to return a common result - added some selection tests - added a bandaid solution to bug 86993 (it does not fix the real problem though) --- .../ast2/AST2SelectionParseBaseTest.java | 36 + .../tests/ast2/AST2SelectionParseTest.java | 1537 +++++++++++++++++ .../ast/IASTPreprocessorSelectionResult.java | 24 + .../ASTPreprocessorSelectionResult.java | 47 + .../dom/parser/c/CASTTranslationUnit.java | 35 +- .../dom/parser/cpp/CPPASTTranslationUnit.java | 28 +- .../parser/scanner2/ILocationResolver.java | 4 +- .../core/parser/scanner2/LocationMap.java | 17 +- 8 files changed, 1694 insertions(+), 34 deletions(-) create mode 100644 core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java create mode 100644 core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorSelectionResult.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTPreprocessorSelectionResult.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java new file mode 100644 index 00000000000..4dc11ecfe5f --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2005 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 Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.parser.tests.ast2; + +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.internal.core.parser.ParserException; + +/** + * @author dsteffle + */ +public class AST2SelectionParseBaseTest extends AST2BaseTest { + + protected IASTNode parse(String code, ParserLanguage lang, int offset, int length) throws ParserException { + return parse(code, lang, false, false, offset, length); + } + + protected IASTNode parse(String code, ParserLanguage lang, int offset, int length, boolean expectedToPass) throws ParserException { + return parse(code, lang, false, expectedToPass, offset, length); + } + + protected IASTNode parse(String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems, int offset, int length) throws ParserException { + IASTTranslationUnit tu = parse(code, lang, useGNUExtensions, expectNoProblems); + return tu.selectNodeForLocation(tu.getFilePath(), offset, length); + } + +} diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java new file mode 100644 index 00000000000..b4910515d83 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java @@ -0,0 +1,1537 @@ +/******************************************************************************* + * Copyright (c) 2005 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 Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.parser.tests.ast2; + +import java.io.StringWriter; +import java.io.Writer; + +import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTIdExpression; +import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTPointer; +import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.ICompositeType; +import org.eclipse.cdt.core.dom.ast.IEnumeration; +import org.eclipse.cdt.core.dom.ast.IField; +import org.eclipse.cdt.core.dom.ast.IFunction; +import org.eclipse.cdt.core.dom.ast.IParameter; +import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.IVariable; +import org.eclipse.cdt.core.dom.ast.c.ICASTPointer; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.parser.ParserLanguage; + +/** + * @author dsteffle + */ +public class AST2SelectionParseTest extends AST2SelectionParseBaseTest { + public void testBaseCase_VariableReference() throws Exception + { + String code = "void f() { int x; x=3; }"; //$NON-NLS-1$ + int offset1 = code.indexOf( "x=" ); //$NON-NLS-1$ + int length = "x".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTIdExpression ); + assertEquals(((IASTIdExpression)node).getName().toString(), "x"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTIdExpression ); + assertEquals(((IASTIdExpression)node).getName().toString(), "x"); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testBaseCase_FunctionReference() throws Exception + { + String code = "int x(){x( );}"; //$NON-NLS-1$ + int offset1 = code.indexOf( "x( " ); //$NON-NLS-1$ + int length = "x".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTIdExpression ); + assertEquals(((IASTIdExpression)node).getName().toString(), "x"); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTIdExpression ); + assertEquals(((IASTIdExpression)node).getName().toString(), "x"); //$NON-NLS-1$ + name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testBaseCase_Error() throws Exception + { + String code = "int x() { y( ) }"; //$NON-NLS-1$ + int offset1 = code.indexOf( "y( " ); //$NON-NLS-1$ + int length = "y".length(); //$NON-NLS-1$ + assertNull( parse( code, ParserLanguage.C, offset1, length, false )); + assertNull( parse( code, ParserLanguage.CPP, offset1, length, false )); + } + + public void testBaseCase_FunctionDeclaration() throws Exception + { + String code = "int x(); x( );"; //$NON-NLS-1$ + int offset1 = code.indexOf( "x()" ); //$NON-NLS-1$ + int length = "x".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "x"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "x"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testBaseCase_FunctionDeclaration2() throws Exception + { + String code = "int printf( const char *, ... ); "; //$NON-NLS-1$ + int offset1 = code.indexOf( "printf" ); //$NON-NLS-1$ + int length = "printf".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "printf"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "printf"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "printf"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "printf"); //$NON-NLS-1$ + } + + public void testBaseCase_VariableDeclaration() throws Exception + { + String code = "int x = 3;"; //$NON-NLS-1$ + int offset1 = code.indexOf( "x" ); //$NON-NLS-1$ + int length = "x".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "x"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "x"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testBaseCase_Parameter() throws Exception + { + String code = "int main( int argc ) { int x = argc; }"; //$NON-NLS-1$ + int offset1 = code.indexOf( "argc;" ); //$NON-NLS-1$ + int length = "argc".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTInitializerExpression ); + assertEquals( ((IASTIdExpression)((IASTInitializerExpression)node).getExpression()).getName().toString(), "argc" ); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)((IASTInitializerExpression)node).getExpression()).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "argc"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset1, length ); + assertNotNull(node); + assertTrue( node instanceof IASTInitializerExpression ); + assertEquals( ((IASTIdExpression)((IASTInitializerExpression)node).getExpression()).getName().toString(), "argc" ); //$NON-NLS-1$ + name = ((IASTIdExpression)((IASTInitializerExpression)node).getExpression()).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "argc"); //$NON-NLS-1$ + } + + public void testBug57898() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class Gonzo { public: void playHorn(); };\n" ); //$NON-NLS-1$ + writer.write( "void Gonzo::playHorn() { return; }\n" ); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) { Gonzo gonzo; gonzo.playHorn(); }\n" ); //$NON-NLS-1$ + String code = writer.toString(); + for( int i = 0; i < 3; ++i ) + { + int start = -1, stop = -1; + switch( i ) + { + case 0: + start = code.indexOf( "void playHorn") + 5; //$NON-NLS-1$ + break; + case 1: + start = code.indexOf( "::playHorn") + 2; //$NON-NLS-1$ + break; + case 2: + start = code.indexOf( ".playHorn") + 1; //$NON-NLS-1$ + break; + } + stop = 8; + IASTNode node = parse( code, ParserLanguage.CPP, start, stop ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals( node.toString(), "playHorn" ); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "playHorn"); //$NON-NLS-1$ + } + } + + public void testConstructorDestructorDeclaration() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class Gonzo { Gonzo(); ~Gonzo(); };"); //$NON-NLS-1$ + String code = writer.toString(); + int offset = code.indexOf( " Gonzo()") + 1; //$NON-NLS-1$ + int length = "Gonzo".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, offset, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "Gonzo"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "Gonzo"); //$NON-NLS-1$ + offset = code.indexOf( " ~Gonzo") + 1; //$NON-NLS-1$ + length = "~Gonzo".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, offset, length ); + assertNotNull(node); + assertTrue( node instanceof IASTName ); + assertEquals(node.toString(), "~Gonzo"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "~Gonzo"); //$NON-NLS-1$ + + } + + public void testBug60264() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "namespace Muppets { int i; }\n" ); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) { Muppets::i = 1; }\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int index = code.indexOf( "Muppets::"); //$NON-NLS-1$ + int length = "Muppets".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Muppets"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPNamespace); + assertEquals(((ICPPNamespace)name.resolveBinding()).getName(), "Muppets"); //$NON-NLS-1$ + index = code.indexOf( "e Muppets") + 2; //$NON-NLS-1$ + length = "Muppets".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Muppets"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPNamespace); + assertEquals(((ICPPNamespace)name.resolveBinding()).getName(), "Muppets"); //$NON-NLS-1$ + + } + + public void testBug61613() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class Foo { // ** (A) **\n" ); //$NON-NLS-1$ + writer.write( " public:\n" ); //$NON-NLS-1$ + writer.write( "Foo() {};\n" ); //$NON-NLS-1$ + writer.write( "};\n" ); //$NON-NLS-1$ + writer.write( "int \n" ); //$NON-NLS-1$ + writer.write( "main(int argc, char **argv) {\n" ); //$NON-NLS-1$ + writer.write( "Foo foo; // ** (B) **\n" ); //$NON-NLS-1$ + writer.write( "}\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int index = code.indexOf( "class Foo") + 6; //$NON-NLS-1$ + int length = "Foo".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Foo"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPClassType); + assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "Foo"); //$NON-NLS-1$ + } + + public void testBug60038() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class Gonzo {\n"); //$NON-NLS-1$ + writer.write( "public:\n"); //$NON-NLS-1$ + writer.write( "Gonzo( const Gonzo & other ){}\n"); //$NON-NLS-1$ + writer.write( "Gonzo() {}\n"); //$NON-NLS-1$ + writer.write( "~Gonzo(){}\n"); //$NON-NLS-1$ + writer.write( "};\n"); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) {\n"); //$NON-NLS-1$ + writer.write( " Gonzo * g = new Gonzo();\n"); //$NON-NLS-1$ + writer.write( " Gonzo * g2 = new Gonzo( *g );\n"); //$NON-NLS-1$ + writer.write( " g->~Gonzo();\n"); //$NON-NLS-1$ + writer.write( " return (int) g2;\n"); //$NON-NLS-1$ + writer.write( "}\n"); //$NON-NLS-1$ + String code = writer.toString(); + for( int i = 0; i < 3; ++i ) + { + int startOffset = 0, length = 0; + switch( i ) + { + case 0: + startOffset = code.indexOf( "new Gonzo()") + 4; //$NON-NLS-1$ + length = 5; + break; + case 1: + startOffset = code.indexOf( "new Gonzo( ") + 4; //$NON-NLS-1$ + length = 5; + break; + default: + startOffset = code.indexOf( "->~") + 2; //$NON-NLS-1$ + length = 6; + } + IASTNode node = parse( code, ParserLanguage.CPP, startOffset, length ); + assertNotNull(node); + IASTName name = null; + switch( i ) + { + case 0: + case 1: + assertTrue(node instanceof IASTTypeId); + assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "Gonzo"); //$NON-NLS-1$ + name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "Gonzo"); //$NON-NLS-1$ + break; + default: + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "~Gonzo"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "~Gonzo"); //$NON-NLS-1$ + break; + + } + } + } + + public void testMethodReference() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class Sample { public:\n"); //$NON-NLS-1$ + writer.write( " int getAnswer() const;\n"); //$NON-NLS-1$ + writer.write( "};\n"); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) {\n" ); //$NON-NLS-1$ + writer.write( " Sample * s = new Sample();\n" ); //$NON-NLS-1$ + writer.write( " return s->getAnswer();\n" ); //$NON-NLS-1$ + writer.write( "}\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "->getAnswer") + 2; //$NON-NLS-1$ + int length = "getAnswer".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "getAnswer"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "getAnswer"); //$NON-NLS-1$ + } + + public void testConstructorDefinition() throws Exception + { + String code = "class ABC { public: ABC(); }; ABC::ABC(){}"; //$NON-NLS-1$ + int startIndex = code.indexOf( "::ABC") + 2; //$NON-NLS-1$ + int length = "ABC".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertEquals(node.toString(), "ABC"); //$NON-NLS-1$ + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "ABC"); //$NON-NLS-1$ + } + + public void testBug63966() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "void foo(int a) {}\n" ); //$NON-NLS-1$ + writer.write( "void foo(long a) {}\n" ); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) {\n" ); //$NON-NLS-1$ + writer.write( "foo(1); \n }" ); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "foo(1)"); //$NON-NLS-1$ + int length = "foo".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "foo"); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "foo"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "foo"); //$NON-NLS-1$ + name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "foo"); //$NON-NLS-1$ + } + + public void testBug66744() throws Exception + { + Writer writerCPP = new StringWriter(); + writerCPP.write( "enum EColours { RED, GREEN, BLUE }; \n" ); //$NON-NLS-1$ + writerCPP.write( "void foo() { EColours color = GREEN; } \n" ); //$NON-NLS-1$ + + Writer writerC = new StringWriter(); + writerC.write( "enum EColours { RED, GREEN, BLUE }; \n" ); //$NON-NLS-1$ + writerC.write( "void foo() { enum EColours color = GREEN; } \n" ); //$NON-NLS-1$ + + String codeCPP = writerCPP.toString(); + String codeC = writerC.toString(); + int startIndex = codeC.indexOf( "EColours color"); //$NON-NLS-1$ + int length = "EColours".length(); //$NON-NLS-1$ + IASTNode node = parse( codeC, ParserLanguage.C, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "EColours"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IEnumeration); + assertEquals(((IEnumeration)name.resolveBinding()).getName(), "EColours"); //$NON-NLS-1$ + startIndex = codeCPP.indexOf( "EColours color"); //$NON-NLS-1$ + node = parse( codeCPP, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTNamedTypeSpecifier); + assertEquals(((IASTNamedTypeSpecifier)node).getName().toString(), "EColours"); //$NON-NLS-1$ + name = ((IASTNamedTypeSpecifier)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IEnumeration); + assertEquals(((IEnumeration)name.resolveBinding()).getName(), "EColours"); //$NON-NLS-1$ + } + + + + public void testBug68527() throws Exception + { + Writer writer = new StringWriter(); + writer.write("struct X;\n"); //$NON-NLS-1$ + writer.write("struct X anA;"); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "X anA"); //$NON-NLS-1$ + int length = "X".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "X"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "X"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "X"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "X"); //$NON-NLS-1$ + } + + public void testBug60407() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "struct ZZZ { int x, y, z; };\n" ); //$NON-NLS-1$ + writer.write( "typedef struct ZZZ _FILE;\n" ); //$NON-NLS-1$ + writer.write( "typedef _FILE FILE;\n" ); //$NON-NLS-1$ + writer.write( "static void static_function(FILE * lcd){}\n" ); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) {\n" ); //$NON-NLS-1$ + writer.write( "FILE * file = 0;\n" ); //$NON-NLS-1$ + writer.write( "static_function( file );\n" ); //$NON-NLS-1$ + writer.write( "return 0;\n" ); //$NON-NLS-1$ + writer.write( "}\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "static_function( file )"); //$NON-NLS-1$ + int length = "static_function".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "static_function"); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "static_function"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "static_function"); //$NON-NLS-1$ + name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "static_function"); //$NON-NLS-1$ + } + + public void testBug61800() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class B {};\n"); //$NON-NLS-1$ + writer.write( "class ABCDEF {\n"); //$NON-NLS-1$ + writer.write( " static B stInt; };\n"); //$NON-NLS-1$ + writer.write( "B ABCDEF::stInt = 5;\n"); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "::stInt") + 2; //$NON-NLS-1$ + int length = "stInt".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "stInt"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "stInt"); //$NON-NLS-1$ + } + + public void testBug68739() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "int fprintf( int *, const char *, ... ); \n" ); //$NON-NLS-1$ + writer.write( "void boo( int * lcd ) { \n" ); //$NON-NLS-1$ + writer.write( " /**/fprintf( lcd, \"%c%s 0x%x\", ' ', \"bbb\", 2 ); \n" ); //$NON-NLS-1$ + writer.write( "} \n" ); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( "/**/fprintf") + 4; //$NON-NLS-1$ + int length = "fprintf".length(); //$NON-NLS-1$ + + IASTNode node = parse( code, ParserLanguage.C, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "fprintf"); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "fprintf"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "fprintf"); //$NON-NLS-1$ + name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "fprintf"); //$NON-NLS-1$ + } + + public void testBug72818() throws Exception + { + Writer writerCPP = new StringWriter(); + writerCPP.write( "union Squaw { int x; double u; };\n" ); //$NON-NLS-1$ + writerCPP.write( "int main(int argc, char **argv) {\n" ); //$NON-NLS-1$ + writerCPP.write( "return sizeof( Squaw );\n" ); //$NON-NLS-1$ + writerCPP.write( "}\n" ); //$NON-NLS-1$ + + Writer writerC = new StringWriter(); + writerC.write( "union Squaw { int x; double u; };\n" ); //$NON-NLS-1$ + writerC.write( "int main(int argc, char **argv) {\n" ); //$NON-NLS-1$ + writerC.write( "return sizeof( union Squaw );\n" ); //$NON-NLS-1$ + writerC.write( "}\n" ); //$NON-NLS-1$ + + String codeC = writerC.toString(); + String codeCPP = writerCPP.toString(); + int startIndex = codeC.indexOf( "sizeof( union ") + "sizeof( union ".length(); //$NON-NLS-1$ //$NON-NLS-2$ + int length = "Squaw".length(); //$NON-NLS-1$ + IASTNode node = parse( codeC, ParserLanguage.C, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Squaw"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "Squaw"); //$NON-NLS-1$ + startIndex = codeCPP.indexOf( "sizeof( ") + "sizeof( ".length(); //$NON-NLS-1$ //$NON-NLS-2$ + node = parse( codeCPP, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTTypeId); + assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "Squaw"); //$NON-NLS-1$ + name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPClassType); + assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "Squaw"); //$NON-NLS-1$ + } + + public void test72220() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "const int FOUND_ME = 1;\n" ); //$NON-NLS-1$ + writer.write( "class Test{\n" ); //$NON-NLS-1$ + writer.write( "public:\n" ); //$NON-NLS-1$ + writer.write( "const int findCode() const;\n" ); //$NON-NLS-1$ + writer.write( "};\n" ); //$NON-NLS-1$ + writer.write( "const int Test::findCode() const {\n" ); //$NON-NLS-1$ + writer.write( "return FOUND_ME;\n" ); //$NON-NLS-1$ + writer.write( "}\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "return ") + "return ".length(); //$NON-NLS-1$ //$NON-NLS-2$ + int length = "FOUND_ME".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "FOUND_ME"); //$NON-NLS-1$ + IASTName name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "FOUND_ME"); //$NON-NLS-1$ + } + + public void testBug72721() throws Exception{ + Writer writer = new StringWriter(); + writer.write(" class ABC { public: ABC(int); }; \n"); //$NON-NLS-1$ + writer.write("void f() { \n"); //$NON-NLS-1$ + writer.write(" int j = 1; \n"); //$NON-NLS-1$ + writer.write(" new ABC( j + 1 ); \n"); //$NON-NLS-1$ + writer.write("} \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( "ABC(" ); //$NON-NLS-1$ + int length = "ABC".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "ABC"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "ABC"); //$NON-NLS-1$ + } + + public void testBug72372() throws Exception{ + Writer writer = new StringWriter(); + writer.write("namespace B { \n"); //$NON-NLS-1$ + writer.write(" class SD_02 { void f_SD(); }; \n"); //$NON-NLS-1$ + writer.write("} \n"); //$NON-NLS-1$ + writer.write("using namespace B; \n"); //$NON-NLS-1$ + writer.write("void SD_02::f_SD(){} \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( ":f_SD" ) + 1; //$NON-NLS-1$ + int length = "f_SD".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "f_SD"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "f_SD"); //$NON-NLS-1$ + } + public void testBug72372_2() throws Exception{ + Writer writer = new StringWriter(); + writer.write("namespace A { \n"); //$NON-NLS-1$ + writer.write(" namespace B { \n"); //$NON-NLS-1$ + writer.write(" void f_SD(); \n"); //$NON-NLS-1$ + writer.write(" } \n"); //$NON-NLS-1$ + writer.write("} \n"); //$NON-NLS-1$ + writer.write("namespace C { \n"); //$NON-NLS-1$ + writer.write(" using namespace A; \n"); //$NON-NLS-1$ + writer.write("} \n"); //$NON-NLS-1$ + writer.write("void C::B::f_SD(){} \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( ":f_SD" ) + 1; //$NON-NLS-1$ + int length = "f_SD".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "f_SD"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "f_SD"); //$NON-NLS-1$ + } + + public void testBug72713() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "class Deck{ void initialize(); }; \n"); //$NON-NLS-1$ + writer.write( "void Deck::initialize(){} \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( ":initialize" ) + 1; //$NON-NLS-1$ + int length = "initialize".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "initialize"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "initialize"); //$NON-NLS-1$ + } + + public void testBug72712() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "class B{ public: B(); }; void f(){ B* b; b = new B(); }" ); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( "new B" ) + 4; //$NON-NLS-1$ + int length = "B".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTTypeId); + assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "B"); //$NON-NLS-1$ + IASTName name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "B"); //$NON-NLS-1$ + } + + public void testBug72712_2() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "class A {}; \n"); //$NON-NLS-1$ + writer.write( "class B{ public: B( A* ); }; \n"); //$NON-NLS-1$ + writer.write( "void f(){ B* b; b = new B( (A*)0 ); } \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( "(A*)" ) + 1; //$NON-NLS-1$ + int length = "A".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); + assertNotNull(node); + assertTrue(node instanceof IASTNamedTypeSpecifier); + assertEquals(((IASTNamedTypeSpecifier)node).getName().toString(), "A"); //$NON-NLS-1$ + IASTName name = ((IASTNamedTypeSpecifier)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPClassType); + assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "A"); //$NON-NLS-1$ + } + + // TODO no template support yet for new AST? +// public void testBug72814() throws Exception{ +// Writer writer = new StringWriter(); +// writer.write( "namespace N{ \n"); //$NON-NLS-1$ +// writer.write( " template < class T > class AAA { T _t };\n"); //$NON-NLS-1$ +// writer.write( "} \n"); //$NON-NLS-1$ +// writer.write( "N::AAA a; \n"); //$NON-NLS-1$ +// +// String code = writer.toString(); +// int startIndex = code.indexOf( "AAA" ); //$NON-NLS-1$ +// int length = "AAA".length(); //$NON-NLS-1$ +// IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length ); +// assertNotNull(node); +// +//// assertTrue( node instanceof IASTClassSpecifier ); +//// assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$ +// +// length = "AAA".length(); //$NON-NLS-1$ +// node = parse( code, ParserLanguage.CPP, startIndex, length ); +// assertNotNull(node); +// +//// assertTrue( node instanceof IASTClassSpecifier ); +//// assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$ +// } + + public void testBug72710() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class Card{\n" ); //$NON-NLS-1$ + writer.write( " Card( int rank );\n" ); //$NON-NLS-1$ + writer.write( " int rank;\n" ); //$NON-NLS-1$ + writer.write( "};\n" ); //$NON-NLS-1$ + writer.write( "Card::Card( int rank ) {\n" ); //$NON-NLS-1$ + writer.write( "this->rank = rank;\n" ); //$NON-NLS-1$ + writer.write( "}\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int index = code.indexOf( "this->rank") + 6; //$NON-NLS-1$ + int length = "rank".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + } + + + public void testBug75731() throws Exception + { + Writer writer = new StringWriter(); + writer.write("int rank() {\n"); //$NON-NLS-1$ + writer.write("return 5;\n}\n"); //$NON-NLS-1$ + writer.write("class Card{\n"); //$NON-NLS-1$ + writer.write("private:\n"); //$NON-NLS-1$ + writer.write("Card( int rank );\n"); //$NON-NLS-1$ + writer.write("int rank;\n"); //$NON-NLS-1$ + writer.write("public:\n"); //$NON-NLS-1$ + writer.write("int getRank();\n};\n"); //$NON-NLS-1$ + writer.write("Card::Card( int rank )\n{\n"); //$NON-NLS-1$ + writer.write("this->rank = ::rank();\n"); //$NON-NLS-1$ + writer.write("this->rank = this->rank;\n"); //$NON-NLS-1$ + writer.write("this->rank = rank;\n"); //$NON-NLS-1$ + writer.write("this->rank = Card::rank;\n"); //$NON-NLS-1$ + writer.write("this->rank = getRank();\n}\n"); //$NON-NLS-1$ + + String code = writer.toString(); + int index = code.indexOf( "int rank() {") + 4; //$NON-NLS-1$ + int length = "rank".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "class Card{") + 6; //$NON-NLS-1$ + length = "Card".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Card"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPClassType); + assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "Card"); //$NON-NLS-1$ + + index = code.indexOf( "Card( int rank );"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Card"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "Card"); //$NON-NLS-1$ + + index = code.indexOf( "Card( int rank );") + 10; //$NON-NLS-1$ + length = "rank".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "rank"); //$NON-NLS-1$ + name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "int rank;") + 4; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "rank"); //$NON-NLS-1$ + name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "int getRank();") + 4; //$NON-NLS-1$ + length = "getRank".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "getRank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "getRank"); //$NON-NLS-1$ + + index = code.indexOf( "Card::Card( int rank )"); //$NON-NLS-1$ + length = "Card".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Card"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPClassType); + assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "Card"); //$NON-NLS-1$ + + index = code.indexOf( "Card::Card( int rank )") + 6; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Card"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPConstructor); + assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "Card"); //$NON-NLS-1$ + + index = code.indexOf( "Card::Card( int rank )") + 16; //$NON-NLS-1$ + length = "rank".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "rank"); //$NON-NLS-1$ + name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = ::rank();") + 6; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = ::rank();") + 15; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IFunction); + assertEquals(((IFunction)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = this->rank;") + 6; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = this->rank;") + 19; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = rank;") + 6; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = rank;") + 13; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "rank"); //$NON-NLS-1$ + name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = Card::rank;") + 6; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = Card::rank;") + 19; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = getRank();") + 6; //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "rank"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPField); + assertEquals(((ICPPField)name.resolveBinding()).getName(), "rank"); //$NON-NLS-1$ + + index = code.indexOf( "this->rank = getRank();") + 13; //$NON-NLS-1$ + length = "getRank".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTIdExpression); + assertEquals(((IASTIdExpression)node).getName().toString(), "getRank"); //$NON-NLS-1$ + name = ((IASTIdExpression)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPMethod); + assertEquals(((ICPPMethod)name.resolveBinding()).getName(), "getRank"); //$NON-NLS-1$ + } + + public void testBug77989() throws Exception { + Writer writer = new StringWriter(); + writer.write("namespace N { /* A */\n"); //$NON-NLS-1$ + writer.write("class C{};\n}\n"); //$NON-NLS-1$ + writer.write("using namespace N; /* B */\n"); //$NON-NLS-1$ + writer.write("N::C c; /* C */\n"); //$NON-NLS-1$ + + String code = writer.toString(); + int index = code.indexOf( "using namespace N;") + 16; //$NON-NLS-1$ + int length = "N".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "N"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICPPNamespace); + assertEquals(((ICPPNamespace)name.resolveBinding()).getName(), "N"); //$NON-NLS-1$ + } + + public void testBug78435() throws Exception { + Writer writer = new StringWriter(); + writer.write("int itself; //A\n"); //$NON-NLS-1$ + writer.write("void f(int itself){} //B\n"); //$NON-NLS-1$ + + String code = writer.toString(); + int index = code.indexOf( "void f(int itself){}") + 11; //$NON-NLS-1$ + int length = "itself".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "itself"); //$NON-NLS-1$ + IASTName name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "itself"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "itself"); //$NON-NLS-1$ + name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + assertEquals(((IVariable)name.resolveBinding()).getName(), "itself"); //$NON-NLS-1$ + } + + public void testBug78231A() throws Exception { + Writer writer = new StringWriter(); + writer.write("struct Base {\n"); //$NON-NLS-1$ + writer.write("int Data; // 1\n"); //$NON-NLS-1$ + writer.write("struct Data; // 2\n};\n"); //$NON-NLS-1$ + + String code = writer.toString(); + int index = code.indexOf("struct Data;") + 7; //$NON-NLS-1$ + int length = "Data".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Data"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "Data"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Data"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "Data"); //$NON-NLS-1$ + } + + public void testBug78231B() throws Exception { + Writer writer = new StringWriter(); + writer.write("int Data;\n"); //$NON-NLS-1$ + writer.write("struct Base {\n"); //$NON-NLS-1$ + writer.write("int Data; // 1\n"); //$NON-NLS-1$ + writer.write("struct Data; // 2\n};\n"); //$NON-NLS-1$ + + String code = writer.toString(); + int index = code.indexOf("struct Data;") + 7; //$NON-NLS-1$ + int length = "Data".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Data"); //$NON-NLS-1$ + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "Data"); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + assertEquals(node.toString(), "Data"); //$NON-NLS-1$ + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ICompositeType); + assertEquals(((ICompositeType)name.resolveBinding()).getName(), "Data"); //$NON-NLS-1$ + } + + public void testSimpleKRCTest1() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "int f(char x);\n" ); //$NON-NLS-1$ + buffer.append( "int f(x) char x;\n" ); //$NON-NLS-1$ + buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("x;"); //$NON-NLS-1$ + int length = "x".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "x"); //$NON-NLS-1$ + IASTName name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testSimpleKRCTest2() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "int f();\n" ); //$NON-NLS-1$ + buffer.append( "int f(x) char x;\n" ); //$NON-NLS-1$ + buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("x;"); //$NON-NLS-1$ + int length = "x".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "x"); //$NON-NLS-1$ + IASTName name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testSimpleKRCTest3() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "int const *f();\n" ); //$NON-NLS-1$ + buffer.append( "int const *f(x) char x;\n" ); //$NON-NLS-1$ + buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("char x;"); //$NON-NLS-1$ + int length = "char x;".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTSimpleDeclaration); + assertEquals( ((IASTSimpleDeclaration)node).getDeclarators()[0].getName().toString(), "x" ); //$NON-NLS-1$ + IASTName name = ((IASTSimpleDeclaration)node).getDeclarators()[0].getName(); + assertNotNull(name.resolveBinding()); + assertTrue( name.resolveBinding() instanceof IParameter ); + assertEquals( ((IParameter)name.resolveBinding()).getName(), "x" ); //$NON-NLS-1$ + } + + public void testKRC_1() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "int isroot (x, y) /* comment */ \n" ); //$NON-NLS-1$ + buffer.append( "int x;\n" ); //$NON-NLS-1$ + buffer.append( "int y;\n" ); //$NON-NLS-1$ + buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("y;"); //$NON-NLS-1$ + int length = "y".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "y"); //$NON-NLS-1$ + IASTName name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "y"); //$NON-NLS-1$ + } + + public void testKRCWithTypes() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "typedef char c;\n" ); //$NON-NLS-1$ + buffer.append( "int isroot (c);\n" ); //$NON-NLS-1$ + buffer.append( "int isroot (x) \n" ); //$NON-NLS-1$ + buffer.append( "c x;\n" ); //$NON-NLS-1$ + buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("c x;"); //$NON-NLS-1$ + int length = "c".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTNamedTypeSpecifier); + assertEquals(((IASTNamedTypeSpecifier)node).getName().toString(), "c"); //$NON-NLS-1$ + IASTName name = ((IASTNamedTypeSpecifier)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof ITypedef); + assertEquals(((ITypedef)name.resolveBinding()).getName(), "c"); //$NON-NLS-1$ + + index = code.indexOf("x;"); //$NON-NLS-1$ + length = "x".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "x"); //$NON-NLS-1$ + name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "x"); //$NON-NLS-1$ + } + + public void testKRC_monop_cards1() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "#ifdef __STDC__\n" ); //$NON-NLS-1$ + buffer.append( "#define __P(x) x\n" ); //$NON-NLS-1$ + buffer.append( "#else\n" ); //$NON-NLS-1$ + buffer.append( "#define __P(x) ()\n" ); //$NON-NLS-1$ + buffer.append( "#endif\n" ); //$NON-NLS-1$ + buffer.append( "struct A_struct {\n" ); //$NON-NLS-1$ + buffer.append( "int a;\n" ); //$NON-NLS-1$ + buffer.append( "long *c;\n" ); //$NON-NLS-1$ + buffer.append( "};\n" ); //$NON-NLS-1$ + buffer.append( "typedef struct A_struct A;\n" ); //$NON-NLS-1$ + buffer.append( "static void f __P((A *));\n" ); //$NON-NLS-1$ + buffer.append( "static void\n" ); //$NON-NLS-1$ + buffer.append( "f(x)\n" ); //$NON-NLS-1$ + buffer.append( "A *x; {\n" ); //$NON-NLS-1$ + buffer.append( "x->a = 0;\n" ); //$NON-NLS-1$ + buffer.append( "x->c[1]=x->c[2];\n" ); //$NON-NLS-1$ + buffer.append( "}\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("*c;"); //$NON-NLS-1$ + int length = "*".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof ICASTPointer); + + + index = code.indexOf("*c;") + 1; //$NON-NLS-1$ + length = "c".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IField); + assertEquals(((IField)name.resolveBinding()).getName(), "c"); //$NON-NLS-1$ + + index = code.indexOf("c[2]"); //$NON-NLS-1$ + length = "c".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IField); + assertEquals(((IField)name.resolveBinding()).getName(), "c"); //$NON-NLS-1$ + } + + public void testKRC_monop_cards2() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "int\n" ); //$NON-NLS-1$ + buffer.append( "getinp(prompt, list)\n" ); //$NON-NLS-1$ + buffer.append( " const char *prompt, *const list[];\n" ); //$NON-NLS-1$ + buffer.append( "{\n *list[1] = 'a';\n}\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("list[]"); //$NON-NLS-1$ + int length = "list".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + IASTName name = (IASTName)node; + assertEquals(name.toString(), "list"); //$NON-NLS-1$ + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "list"); //$NON-NLS-1$ + + index = code.indexOf("[]"); //$NON-NLS-1$ + length = "[]".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTArrayModifier); + + index = code.indexOf("*const list[]"); //$NON-NLS-1$ + length = "*const".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTPointer); + } + + + public void testKRC_getParametersOrder() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "int f(a, b) int b,a;{}\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("b,a"); //$NON-NLS-1$ + int length = "b".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTDeclarator); + IASTName name = ((IASTDeclarator)node).getName(); + assertEquals(name.toString(), "b"); //$NON-NLS-1$ + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IParameter); + assertEquals(((IParameter)name.resolveBinding()).getName(), "b"); //$NON-NLS-1$ + } + + public void testKRC_Ethereal_1() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "struct symbol {\n" ); //$NON-NLS-1$ + buffer.append( "int lambda;\n};\n" ); //$NON-NLS-1$ + buffer.append( "struct lemon {\n" ); //$NON-NLS-1$ + buffer.append( "struct symbol **symbols;\n" ); //$NON-NLS-1$ + buffer.append( "int errorcnt;\n};\n" ); //$NON-NLS-1$ + buffer.append( "void f(lemp)\n" ); //$NON-NLS-1$ + buffer.append( "struct lemon *lemp;\n{\n" ); //$NON-NLS-1$ + buffer.append( "lemp->symbols[1]->lambda = 1;\n" ); //$NON-NLS-1$ + buffer.append( "lemp->errorcnt++;}\n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("**symbols"); //$NON-NLS-1$ + int length = "*".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTPointer); + + index = code.indexOf("**symbols") + 1; //$NON-NLS-1$ + length = "*".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTPointer); + + index = code.indexOf("**symbols") + 2; //$NON-NLS-1$ + length = "symbols".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IField); + assertEquals(((IField)name.resolveBinding()).getName(), "symbols"); //$NON-NLS-1$ + + index = code.indexOf("lemp->symbols") + 6; //$NON-NLS-1$ + length = "symbols".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IField); + assertEquals(((IField)name.resolveBinding()).getName(), "symbols"); //$NON-NLS-1$ + } + + public void testBug86698() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "struct C;\n"); //$NON-NLS-1$ + buffer.append( "void no_opt(C*);\n"); //$NON-NLS-1$ + buffer.append( "struct C {\n"); //$NON-NLS-1$ + buffer.append( "int c;\n"); //$NON-NLS-1$ + buffer.append( "C() : c(0) { no_opt(this); }\n"); //$NON-NLS-1$ + buffer.append( "};\n"); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = code.indexOf("c(0)"); //$NON-NLS-1$ + int length = "c".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue(node instanceof IASTName); + IASTName name = (IASTName)node; + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IField); + assertEquals(((IField)name.resolveBinding()).getName(), "c"); //$NON-NLS-1$ + + } + + public void testLittleThings() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("int a[3];\r\n"); //$NON-NLS-1$ + buffer.append("int *b;\r\n"); //$NON-NLS-1$ + buffer.append("int &c;\r\n"); //$NON-NLS-1$ + buffer.append("char d='e';\r\n"); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = 0; + int length = 0; + + IASTNode node = null; + ParserLanguage lang = null; + for(int i=0; i<2; i++) { + lang = i==0 ? ParserLanguage.C : ParserLanguage.CPP; + + index = code.indexOf("[3]"); //$NON-NLS-1$ + length = "[3]".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("3"); //$NON-NLS-1$ + length = "3".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("*"); //$NON-NLS-1$ + length = "*".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + if (lang != ParserLanguage.C) { + index = code.indexOf("&"); //$NON-NLS-1$ + length = "&".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("&c"); //$NON-NLS-1$ + length = "&c".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + } + + index = code.indexOf("int a"); //$NON-NLS-1$ + length = "int".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("int a[3];"); //$NON-NLS-1$ + length = "int a[3];".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("a[3]"); //$NON-NLS-1$ + length = "a[3]".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("*b"); //$NON-NLS-1$ + length = "*b".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("'e'"); //$NON-NLS-1$ + length = "'e'".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + } + } + + public void testSimpleWindowsPreprocessorSelections() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("#define ONE 1\r\n"); //$NON-NLS-1$ + buffer.append("#ifdef ONE\r\n"); //$NON-NLS-1$ + buffer.append("int x=0;\r\n"); //$NON-NLS-1$ + buffer.append("#else\r\n"); //$NON-NLS-1$ + buffer.append("char c='c';\r\n"); //$NON-NLS-1$ + buffer.append("#endif\r\n"); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = 0; + int length = 0; + + IASTNode node = null; + ParserLanguage lang = null; + for(int i=0; i<2; i++) { + lang = i==0 ? ParserLanguage.C : ParserLanguage.CPP; + + index = code.indexOf("#define ONE 1"); //$NON-NLS-1$ + length = "#define ONE 1".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + // TODO bug 87179 +// index = code.indexOf("#ifdef ONE"); //$NON-NLS-1$ +// length = "#ifdef ONE".length(); //$NON-NLS-1$ +// node = parse( code, lang, index, length ); +// assertNotNull(node); + + index = code.indexOf("int x=0;"); //$NON-NLS-1$ + length = "int x=0;".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("#else"); //$NON-NLS-1$ + length = "#else".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + + index = code.indexOf("#endif"); //$NON-NLS-1$ + length = "#endif".length(); //$NON-NLS-1$ + node = parse( code, lang, index, length ); + assertNotNull(node); + } + } + + public void testBug86993() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("#define _BEGIN_STD_C extern \"C\" {\r\n"); //$NON-NLS-1$ + buffer.append("#define _END_STD_C }\r\n"); //$NON-NLS-1$ + buffer.append("_BEGIN_STD_C\r\n"); //$NON-NLS-1$ + buffer.append("char c;\r\n"); //$NON-NLS-1$ + buffer.append("_END_STD_C\r\n"); //$NON-NLS-1$ + + String code = buffer.toString(); + int index = 0; + int length = 0; + + IASTNode node = null; + + index = code.indexOf("c;"); //$NON-NLS-1$ + length = "c".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.CPP, index, length ); + assertNotNull(node); + assertTrue( node instanceof IASTDeclarator); + assertEquals(((IASTDeclarator)node).getName().toString(), "c"); //$NON-NLS-1$ + IASTName name = ((IASTDeclarator)node).getName(); + assertNotNull(name.resolveBinding()); + assertTrue(name.resolveBinding() instanceof IVariable); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorSelectionResult.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorSelectionResult.java new file mode 100644 index 00000000000..a0f0aec61e4 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorSelectionResult.java @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (c) 2005 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; + +/** + * This interface is used to specify what the LocationMap has found when searching for IASTNodes + * corresponding to a selection from the preprocessor tree. + * + * @author dsteffle + */ +public interface IASTPreprocessorSelectionResult { + public IASTNode getSelectedNode(); + public void setSelectedNode(IASTNode selectedNode); + public int getGlobalOffset(); + public void setGlobalOffset(int globalOffset); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTPreprocessorSelectionResult.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTPreprocessorSelectionResult.java new file mode 100644 index 00000000000..25dad227503 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTPreprocessorSelectionResult.java @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2005 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.internal.core.dom.parser; + +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorSelectionResult; + +/** + * This class is used to wrap possible results from the ILocationResolver (when retrieving + * nodes from the preprocessor tree. + * @author dsteffle + */ +public class ASTPreprocessorSelectionResult implements IASTPreprocessorSelectionResult { + IASTNode selectedNode = null; + int globalOffset = 0; + + public ASTPreprocessorSelectionResult(IASTNode node, int offset) { + this.selectedNode = node; + this.globalOffset = offset; + } + + public IASTNode getSelectedNode() { + return selectedNode; + } + + public void setSelectedNode(IASTNode selectedNode) { + this.selectedNode = selectedNode; + } + + public int getGlobalOffset() { + return globalOffset; + } + + + public void setGlobalOffset(int globalOffset) { + this.globalOffset = globalOffset; + } + +} 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 8beca9b28e7..49c69e19adf 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 @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorSelectionResult; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTStatement; @@ -340,23 +341,29 @@ public class CASTTranslationUnit extends CASTNode implements */ public IASTNode selectNodeForLocation(String path, int realOffset, int realLength) { - IASTNode node = null; - + IASTNode node = null; + IASTPreprocessorSelectionResult result = null; + int globalOffset = 0; + try { - node = resolver.getPreprocessorNode(path, realOffset, realLength); + result = 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(); - } + globalOffset = ipne.getGlobalOffset(); } - - return node; + + if (result != null && result.getSelectedNode() != null) { + node = result.getSelectedNode(); + } else { + // use the globalOffset to get the node from the AST if it's valid + globalOffset = result == null ? globalOffset : result.getGlobalOffset(); + if (globalOffset >= 0) { + CFindNodeForOffsetAction nodeFinder = new CFindNodeForOffsetAction(globalOffset, realLength); + getVisitor().visitTranslationUnit(nodeFinder); + node = nodeFinder.getNode(); + } + } + + return node; } /* 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 4ef67bfeba1..0fe54ff193b 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 @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorSelectionResult; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTStatement; @@ -38,6 +39,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; @@ -203,7 +205,8 @@ public class CPPASTTranslationUnit extends CPPASTNode implements } // skip the rest of this node if the selection is outside of its bounds - if (node instanceof ASTNode && + // TODO take out fix below for bug 86993 check for: !(node instanceof ICPPASTLinkageSpecification) + if (node instanceof ASTNode && !(node instanceof ICPPASTLinkageSpecification) && offset > ((ASTNode)node).getOffset() + ((ASTNode)node).getLength()) return PROCESS_SKIP; @@ -215,7 +218,8 @@ public class CPPASTTranslationUnit extends CPPASTNode implements */ 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) + // TODO take out fix below for bug 86993 check for: !(declaration instanceof ICPPASTLinkageSpecification) + if (declaration instanceof ASTNode && !(declaration instanceof ICPPASTLinkageSpecification) && ((ASTNode)declaration).getOffset() > offset) return PROCESS_ABORT; return processNode(declaration); @@ -332,18 +336,26 @@ public class CPPASTTranslationUnit extends CPPASTNode implements */ public IASTNode selectNodeForLocation(String path, int realOffset, int realLength) { IASTNode node = null; + IASTPreprocessorSelectionResult result = null; + int globalOffset = 0; + + try { + result = resolver.getPreprocessorNode(path, realOffset, realLength); + } catch (InvalidPreprocessorNodeException ipne) { + globalOffset = ipne.getGlobalOffset(); + } - 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 (result != null && result.getSelectedNode() != null) { + node = result.getSelectedNode(); + } else { + // use the globalOffset to get the node from the AST if it's valid + globalOffset = result == null ? globalOffset : result.getGlobalOffset(); if (globalOffset >= 0) { CPPFindNodeForOffsetAction nodeFinder = new CPPFindNodeForOffsetAction(globalOffset, realLength); getVisitor().visitTranslationUnit(nodeFinder); node = nodeFinder.getNode(); } - } + } return node; } 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 d949b433093..7aa4420ec9c 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,10 +10,10 @@ **********************************************************************/ package org.eclipse.cdt.internal.core.parser.scanner2; -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.IASTPreprocessorSelectionResult; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; @@ -36,6 +36,6 @@ public interface ILocationResolver { public void cleanup(); - public IASTNode getPreprocessorNode( String path, int offset, int length ) throws InvalidPreprocessorNodeException; + public IASTPreprocessorSelectionResult getPreprocessorNode( String path, int offset, int length ) throws InvalidPreprocessorNodeException; } 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 8cb06621bd7..19c55589150 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 @@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorObjectStyleMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorSelectionResult; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorUndefStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; @@ -40,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; +import org.eclipse.cdt.internal.core.dom.parser.ASTPreprocessorSelectionResult; /** * @author jcamelon @@ -1713,7 +1715,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { return foundContext; } - private IASTNode getPreprocessorNode(int globalOffset, int length, _Context startContext) throws InvalidPreprocessorNodeException { + private IASTPreprocessorSelectionResult getPreprocessorNode(int globalOffset, int length, _Context startContext) throws InvalidPreprocessorNodeException { IASTNode result = null; if (!(startContext instanceof _CompositeContext)) throw new InvalidPreprocessorNodeException(NOT_VALID_MACRO, globalOffset); List contexts = ((_CompositeContext)startContext).getSubContexts(); @@ -1747,17 +1749,15 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } } - if (result == null) - throw new InvalidPreprocessorNodeException(NOT_VALID_MACRO, globalOffset); - - return result; + return new ASTPreprocessorSelectionResult(result, globalOffset); } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver#getPreprocessorNode(int, int) */ - public IASTNode getPreprocessorNode(String path, int offset, int length) throws InvalidPreprocessorNodeException { - IASTNode result = null; + public IASTPreprocessorSelectionResult getPreprocessorNode(String path, int offset, int length) throws InvalidPreprocessorNodeException { + IASTPreprocessorSelectionResult result = null; + int globalOffset = 0; _Context foundContext = tu; @@ -1776,9 +1776,6 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { result = getPreprocessorNode(globalOffset, length, foundContext); - if (result == null) - throw new InvalidPreprocessorNodeException(NOT_VALID_MACRO, globalOffset); - return result; }