[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Applied [1_2 & HEAD] Constructor X-Ref Parser fix w/ 1 Preprocessor fix
|
CORE
Fixed Bug 44838 : exception when resolving parameter references in
a constructor
Fixed Bug 46165 : fields referenced in constructor chains are not
called back upon
Fixed Bug 45551 : Macro replacement in #include <file.h>
directives
TESTS
Added CompleteParseASTTest::testBug44838().
Added CompleteParseASTTest::testBug46165().
Added ScannerTestCase::testBug45551().
JohnC
Index: parser/org/eclipse/cdt/internal/core/parser/Scanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java,v
retrieving revision 1.64
diff -u -r1.64 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java 5 Nov 2003 23:35:28 -0000 1.64
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java 6 Nov 2003 04:47:12 -0000
@@ -1473,6 +1473,8 @@
contextStack.getCurrentContext());
default :
ungetChar(c);
+ if( forInclusion )
+ temporarilyReplaceDefinitionsMap();
return newToken(IToken.tLT, "<", contextStack.getCurrentContext());
}
case '>' :
@@ -1500,6 +1502,8 @@
contextStack.getCurrentContext());
default :
ungetChar(c);
+ if( forInclusion )
+ restoreDefinitionsMap();
return newToken(IToken.tGT, ">", contextStack.getCurrentContext());
}
case '.' :
@@ -2000,6 +2004,7 @@
new NullSourceElementRequestor(),
mode,
language, log );
+ helperScanner.setForInclusion( true );
IToken t = null;
try {
@@ -2091,6 +2096,31 @@
}
else
handleInclusion(f.trim(), useIncludePath, startOffset, beginningOffset, endOffset);
+ }
+
+ protected static final Hashtable emptyMap = new Hashtable();
+ protected Hashtable holderMap = null;
+
+ protected void temporarilyReplaceDefinitionsMap()
+ {
+ holderMap = definitions;
+ definitions = emptyMap;
+ }
+
+ protected void restoreDefinitionsMap()
+ {
+ definitions = holderMap;
+ holderMap = null;
+ }
+
+
+ protected boolean forInclusion = false;
+ /**
+ * @param b
+ */
+ protected void setForInclusion(boolean b)
+ {
+ forInclusion = b;
}
protected void poundDefine(int beginning) throws ScannerException, EndOfFile {
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTConstructorMemberInitializer.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTConstructorMemberInitializer.java,v
retrieving revision 1.1
diff -u -r1.1 ASTConstructorMemberInitializer.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTConstructorMemberInitializer.java 13 Aug 2003 23:54:05 -0000 1.1
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTConstructorMemberInitializer.java 6 Nov 2003 04:47:12 -0000
@@ -23,17 +23,21 @@
public class ASTConstructorMemberInitializer
implements IASTConstructorMemberInitializer
{
- private final String name;
+ private final int nameOffset;
+ private final boolean requireNameResolution;
+ private final String name;
private final IASTExpression expression;
- private final ASTReferenceStore store;
+ private final List references;
/**
*
*/
- public ASTConstructorMemberInitializer( IASTExpression expression, String name, List references )
+ public ASTConstructorMemberInitializer( IASTExpression expression, String name, int nameOffset, List references, boolean requireNameResolution )
{
this.expression = expression;
- this.name = name;
- store = new ASTReferenceStore( references );
+ this.name = name;
+ this.nameOffset = nameOffset;
+ this.references = references;
+ this.requireNameResolution = requireNameResolution;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTConstructorMemberInitializer#getExpressionList()
@@ -54,6 +58,7 @@
*/
public void acceptElement(ISourceElementRequestor requestor)
{
+ ASTReferenceStore store = new ASTReferenceStore( references );
store.processReferences( requestor );
}
/* (non-Javadoc)
@@ -68,4 +73,27 @@
public void exitScope(ISourceElementRequestor requestor)
{
}
+ /**
+ * @return
+ */
+ public boolean requiresNameResolution()
+ {
+ return requireNameResolution;
+ }
+
+ /**
+ * @return
+ */
+ public List getReferences()
+ {
+ return references;
+ }
+ /**
+ * @return
+ */
+ public int getNameOffset()
+ {
+ return nameOffset;
+ }
+
}
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java,v
retrieving revision 1.55
diff -u -r1.55 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 3 Nov 2003 14:00:24 -0000 1.55
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 6 Nov 2003 04:47:15 -0000
@@ -666,7 +666,8 @@
{
return new ASTFieldReference( offset, string, (IASTField)symbol.getASTExtension().getPrimaryDeclaration());
}
- else if( symbol.getContainingSymbol().getType() == TypeInfo.t_function &&
+ else if( ( symbol.getContainingSymbol().getType() == TypeInfo.t_function ||
+ symbol.getContainingSymbol().getType() == TypeInfo.t_constructor ) &&
symbol.getContainingSymbol() instanceof IParameterizedSymbol &&
((IParameterizedSymbol)symbol.getContainingSymbol()).getParameterList() != null &&
((IParameterizedSymbol)symbol.getContainingSymbol()).getParameterList().contains( symbol ) )
@@ -1327,11 +1328,25 @@
List references = new ArrayList();
IContainerSymbol scopeSymbol = scopeToSymbol(scope);
+
+ boolean requireReferenceResolution = false;
if( duple != null )
- lookupQualifiedName( scopeSymbol, duple, references, false );
+ {
+ try
+ {
+ lookupQualifiedName( scopeSymbol, duple, references, true );
+ } catch( ASTSemanticException ase )
+ {
+ requireReferenceResolution = true;
+ }
+ }
getExpressionReferences( expressionList, references );
- return new ASTConstructorMemberInitializer( expressionList, duple == null ? "" : duple.toString(), references );
+ return new ASTConstructorMemberInitializer(
+ expressionList,
+ duple == null ? "" : duple.toString(),
+ duple == null ? 0 : duple.getFirstToken().getOffset(),
+ references, requireReferenceResolution );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createSimpleTypeSpecifier(org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type, org.eclipse.cdt.core.parser.ITokenDuple, boolean, boolean, boolean, boolean, boolean)
@@ -1829,6 +1844,7 @@
throw new ASTSemanticException();
}
+ resolveLeftoverConstructorInitializerMembers( symbol, constructorChain );
ASTMethod method = new ASTMethod( symbol, nameEndOffset, parameters, returnType, exception, startOffset, nameOffset, ownerTemplate, references, previouslyDeclared, isConstructor, isDestructor, isPureVirtual, visibility, constructorChain, hasFunctionTryBlock );
try
@@ -1842,6 +1858,53 @@
return method;
}
/**
+ * @param symbol
+ * @param constructorChain
+ */
+ protected void resolveLeftoverConstructorInitializerMembers(IParameterizedSymbol symbol, List constructorChain)
+ {
+ if( constructorChain != null )
+ {
+ Iterator initializers = constructorChain.iterator();
+ while( initializers.hasNext())
+ {
+ IASTConstructorMemberInitializer initializer = (IASTConstructorMemberInitializer)initializers.next();
+ if( !initializer.getName().equals( "") &&
+ initializer instanceof ASTConstructorMemberInitializer &&
+ ((ASTConstructorMemberInitializer)initializer).requiresNameResolution() )
+ {
+ ASTConstructorMemberInitializer realInitializer = ((ASTConstructorMemberInitializer)initializer);
+ try
+ {
+ lookupQualifiedName( symbol, initializer.getName(), realInitializer.getNameOffset(), realInitializer.getReferences(), false );
+ }
+ catch( ASTSemanticException ase )
+ {
+ }
+ }
+
+ // TODO try and resolve parameter references now in the expression list
+
+ }
+ }
+
+
+ }
+
+ /**
+ * @param symbol
+ * @param string
+ * @param i
+ * @param list
+ * @param b
+ * @return
+ */
+ protected ISymbol lookupQualifiedName(IParameterizedSymbol startingScope, String name, int nameOffset, List references, boolean throwOnError) throws ASTSemanticException
+ {
+ return lookupQualifiedName(startingScope, name, TypeInfo.t_any, null, nameOffset, references, throwOnError);
+ }
+
+ /**
* @param symbol
* @param isConst
* @param isVolatile
Index: parser/org/eclipse/cdt/core/parser/tests/BaseScannerTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/BaseScannerTest.java,v
retrieving revision 1.10
diff -u -r1.10 BaseScannerTest.java
--- parser/org/eclipse/cdt/core/parser/tests/BaseScannerTest.java 5 Nov 2003 23:35:21 -0000 1.10
+++ parser/org/eclipse/cdt/core/parser/tests/BaseScannerTest.java 6 Nov 2003 04:47:54 -0000
@@ -17,6 +17,7 @@
import org.eclipse.cdt.core.parser.EndOfFile;
import org.eclipse.cdt.core.parser.IScanner;
+import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.NullSourceElementRequestor;
import org.eclipse.cdt.core.parser.ParserFactory;
@@ -41,14 +42,20 @@
protected void initializeScanner( String input, ParserMode mode ) throws ParserFactoryException
{
- scanner= ParserFactory.createScanner( new StringReader(input),"TEXT", new ScannerInfo(), mode, ParserLanguage.CPP, new NullSourceElementRequestor( mode ), null );
+ initializeScanner( input, mode, new NullSourceElementRequestor( mode ));
}
+ protected void initializeScanner( String input, ParserMode mode, ISourceElementRequestor requestor ) throws ParserFactoryException
+ {
+ scanner= ParserFactory.createScanner( new StringReader(input),"TEXT", new ScannerInfo(), mode, ParserLanguage.CPP, requestor, null );
+ }
protected void initializeScanner(String input) throws ParserFactoryException
{
initializeScanner( input, ParserMode.COMPLETE_PARSE );
}
+
+
public int fullyTokenize() throws Exception
{
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java,v
retrieving revision 1.40
diff -u -r1.40 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java 3 Nov 2003 14:00:13 -0000 1.40
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java 6 Nov 2003 04:47:55 -0000
@@ -32,6 +32,7 @@
import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification;
import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
+import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTReference;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
@@ -1011,4 +1012,34 @@
assertAllReferences( 2, createTaskList( new Task( MyClass ), new Task( MyEnum ) ) );
}
+
+ public void testBug44838() throws Exception
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append( "class A { int myX; A( int x ); };\n");
+ buffer.append( "A::A( int x ) : myX( x ) { if( x == 5 ) myX++; }\n");
+ Iterator i = parse( buffer.toString() ).getDeclarations();
+ IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTField myX = (IASTField)getDeclarations( classA ).next();
+ IASTMethod constructor = (IASTMethod)i.next();
+ IASTParameterDeclaration parmX = (IASTParameterDeclaration)constructor.getParameters().next();
+ assertTrue( constructor.isConstructor());
+ assertFalse(i.hasNext());
+ }
+
+ public void testBug46165() throws Exception
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append( "class A { int myX; A( int x ); };\n");
+ buffer.append( "A::A( int x ) : myX( x ) { if( x == 5 ) myX++; }\n");
+ Iterator i = parse( buffer.toString() ).getDeclarations();
+ IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTField myX = (IASTField)getDeclarations( classA ).next();
+ IASTMethod constructor = (IASTMethod)i.next();
+ IASTParameterDeclaration parmX = (IASTParameterDeclaration)constructor.getParameters().next();
+ assertTrue( constructor.isConstructor());
+ assertAllReferences( 4, createTaskList( new Task( classA ), new Task( myX, 2 ), new Task( parmX )));
+ assertFalse(i.hasNext());
+ }
+
}
Index: parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java,v
retrieving revision 1.12
diff -u -r1.12 ScannerTestCase.java
--- parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java 5 Nov 2003 23:35:21 -0000 1.12
+++ parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java 6 Nov 2003 04:47:56 -0000
@@ -2,15 +2,19 @@
import java.io.StringWriter;
import java.io.Writer;
+import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.parser.EndOfFile;
import org.eclipse.cdt.core.parser.IMacroDescriptor;
import org.eclipse.cdt.core.parser.IProblem;
+import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.IToken;
+import org.eclipse.cdt.core.parser.NullSourceElementRequestor;
import org.eclipse.cdt.core.parser.ParserFactoryException;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerException;
+import org.eclipse.cdt.core.parser.ast.IASTInclusion;
import org.eclipse.cdt.internal.core.parser.Token;
/**
@@ -1260,7 +1264,6 @@
writer.write( "# define foo 2\n");
writer.write( "#endif\n");
writer.write( "foo\n");
-
initializeScanner( writer.toString() );
validateInteger( "2" );
validateEOF();
@@ -1483,5 +1486,47 @@
buffer.append( "#define SUMXY X + Y");
initializeScanner(buffer.toString());
validateEOF();
+ }
+
+
+ protected static class Callback extends NullSourceElementRequestor implements ISourceElementRequestor
+ {
+ public List inclusions = new ArrayList();
+ public List problems = new ArrayList();
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion)
+ */
+ public void enterInclusion(IASTInclusion inclusion)
+ {
+ inclusions.add( inclusion.getName() );
+ }
+
+ public boolean acceptProblem( IProblem p )
+ {
+ problems.add( p );
+ return super.acceptProblem(p);
+ }
+ /**
+ * @param mode
+ */
+ public Callback(ParserMode mode)
+ {
+ super( mode );
+ }
+
+ }
+
+ public void testBug45551() throws Exception
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append( "#define stdio someNonExistantIncludeFile\n" );
+ buffer.append( "#include <stdio.h>\n" );
+
+ Callback callback = new Callback( ParserMode.QUICK_PARSE );
+ initializeScanner( buffer.toString(), ParserMode.QUICK_PARSE, callback );
+ validateEOF();
+ assertEquals( callback.problems.size(), 0 );
+ assertEquals( callback.inclusions.size(), 1 );
+ assertEquals( callback.inclusions.get(0), "stdio.h");
}
}