From fd46566d60ac6c121124a61c285392f0c27edec4 Mon Sep 17 00:00:00 2001 From: Alena Laskavaia Date: Fri, 23 Jul 2010 02:43:47 +0000 Subject: [PATCH] Bug 320575 incorrect type inference for add field, patch from Tomasz Wesolowski --- .../ui/quickfix/QuickFixCreateField.java | 2 +- .../quickfix/QuickFixCreateLocalVariable.java | 2 +- .../ui/quickfix/QuickFixCreateParameter.java | 2 +- .../cdt/codan/core/cxx/CxxAstUtils.java | 18 ++++++++---------- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateField.java b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateField.java index abdc9dfb70d..cdf48dfb5db 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateField.java +++ b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateField.java @@ -46,7 +46,7 @@ public class QuickFixCreateField extends AbstractAstRewriteQuickFix { return; } IASTDeclaration declaration = utils - .createDeclaration(astName, ast.getASTNodeFactory()); + .createDeclaration(astName, ast.getASTNodeFactory(), index); IASTCompositeTypeSpecifier targetCompositeType = utils .getEnclosingCompositeTypeSpecifier(astName); if (targetCompositeType == null) { diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateLocalVariable.java b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateLocalVariable.java index 507cc8fe3f0..234839b37f5 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateLocalVariable.java +++ b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateLocalVariable.java @@ -55,7 +55,7 @@ public class QuickFixCreateLocalVariable extends AbstractAstRewriteQuickFix { } ASTRewrite r = ASTRewrite.create(ast); INodeFactory factory = ast.getASTNodeFactory(); - IASTDeclaration declaration = utils.createDeclaration(astName, factory); + IASTDeclaration declaration = utils.createDeclaration(astName, factory, index); IASTDeclarationStatement newStatement = factory .newDeclarationStatement(declaration); IASTNode targetStatement = utils.getEnclosingStatement(astName); diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateParameter.java b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateParameter.java index 24d32350282..2bd7ccac8a9 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateParameter.java +++ b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateParameter.java @@ -55,7 +55,7 @@ public class QuickFixCreateParameter extends AbstractAstRewriteQuickFix { return; } IASTDeclaration declaration = CxxAstUtils.getInstance() - .createDeclaration(astName, baseAST.getASTNodeFactory()); + .createDeclaration(astName, baseAST.getASTNodeFactory(), index); // We'll need a FunctionParameterDeclaration later final IASTDeclSpecifier finalDeclSpec = (IASTDeclSpecifier) declaration .getChildren()[0]; diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java index 441d83f8b5b..4371c739f30 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java @@ -143,10 +143,11 @@ public final class CxxAstUtils { * a name for the declaration * @param factory * the factory + * @param index * @return */ public IASTDeclaration createDeclaration(IASTName astName, - INodeFactory factory) { + INodeFactory factory, IIndex index) { // Depending on context, either a type or a declaration is easier to // infer @@ -156,7 +157,7 @@ public final class CxxAstUtils { inferredType = tryInferTypeFromBinaryExpr(astName); if (inferredType == null) - declaration = tryInferTypeFromFunctionCall(astName, factory); + declaration = tryInferTypeFromFunctionCall(astName, factory, index); // After the inference, create the statement is needed @@ -208,11 +209,12 @@ public final class CxxAstUtils { /** * For a function call, tries to find a matching function declaration. * Checks the argument count. + * @param index * * @return a generated declaration or null if not suitable */ private IASTSimpleDeclaration tryInferTypeFromFunctionCall( - IASTName astName, INodeFactory factory) { + IASTName astName, INodeFactory factory, IIndex index) { if (astName.getParent() instanceof IASTIdExpression && astName.getParent().getParent() instanceof IASTFunctionCallExpression && astName.getParent().getPropertyInParent() == IASTFunctionCallExpression.ARGUMENT) { @@ -238,10 +240,6 @@ public final class CxxAstUtils { return null; } - IIndex index = astName.getTranslationUnit().getIndex(); - if (index == null) { - return null; - } IBinding[] bindings; { IBinding binding = funcname.resolveBinding(); @@ -311,9 +309,9 @@ public final class CxxAstUtils { } } catch (InterruptedException e) { - e.printStackTrace(); + // skip } catch (CoreException e) { - e.printStackTrace(); + Activator.log(e); } finally { index.releaseReadLock(); } @@ -403,7 +401,7 @@ public final class CxxAstUtils { } catch (InterruptedException e) { return PROCESS_ABORT; } catch (CoreException e) { - e.printStackTrace(); + Activator.log(e); return PROCESS_ABORT; } finally { index.releaseReadLock();