### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java,v retrieving revision 1.166 diff -u -r1.166 DefaultBindingResolver.java --- dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java 16 Jul 2008 16:47:48 -0000 1.166 +++ dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java 6 Apr 2009 15:21:02 -0000 @@ -550,7 +550,7 @@ */ boolean resolveBoxing(Expression expression) { org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(expression); - if (node != null && (node instanceof org.eclipse.jdt.internal.compiler.ast.Expression)) { + if (node instanceof org.eclipse.jdt.internal.compiler.ast.Expression) { org.eclipse.jdt.internal.compiler.ast.Expression compilerExpression = (org.eclipse.jdt.internal.compiler.ast.Expression) node; return (compilerExpression.implicitConversion & TypeIds.BOXING) != 0; } @@ -562,7 +562,7 @@ */ boolean resolveUnboxing(Expression expression) { org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(expression); - if (node != null && (node instanceof org.eclipse.jdt.internal.compiler.ast.Expression)) { + if (node instanceof org.eclipse.jdt.internal.compiler.ast.Expression) { org.eclipse.jdt.internal.compiler.ast.Expression compilerExpression = (org.eclipse.jdt.internal.compiler.ast.Expression) node; return (compilerExpression.implicitConversion & TypeIds.UNBOXING) != 0; } @@ -574,7 +574,7 @@ */ Object resolveConstantExpressionValue(Expression expression) { org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(expression); - if (node != null && (node instanceof org.eclipse.jdt.internal.compiler.ast.Expression)) { + if (node instanceof org.eclipse.jdt.internal.compiler.ast.Expression) { org.eclipse.jdt.internal.compiler.ast.Expression compilerExpression = (org.eclipse.jdt.internal.compiler.ast.Expression) node; Constant constant = compilerExpression.constant; if (constant != null && constant != Constant.NotAConstant) { @@ -662,7 +662,7 @@ if (typeBinding != null) { return typeBinding; } - } else { + } else if (astNode instanceof AllocationExpression) { // should be an AllocationExpression AllocationExpression allocationExpression = (AllocationExpression) astNode; return this.getTypeBinding(allocationExpression.resolvedType); @@ -704,7 +704,10 @@ case ASTNode.CHARACTER_LITERAL : case ASTNode.NUMBER_LITERAL : Literal literal = (Literal) this.newAstToOldAst.get(expression); - return this.getTypeBinding(literal.literalType(null)); + if (literal != null) { + return this.getTypeBinding(literal.literalType(null)); + } + break; case ASTNode.THIS_EXPRESSION : ThisReference thisReference = (ThisReference) this.newAstToOldAst.get(expression); BlockScope blockScope = (BlockScope) this.astNodesToBlockScope.get(expression); @@ -1302,7 +1305,7 @@ } } } - } + } } } else if (node instanceof QualifiedSuperReference) { QualifiedSuperReference qualifiedSuperReference = (QualifiedSuperReference) node; @@ -1398,8 +1401,7 @@ org.eclipse.jdt.internal.compiler.ast.Expression expression = (org.eclipse.jdt.internal.compiler.ast.Expression) this.newAstToOldAst.get(ref); if (expression instanceof TypeReference) { return getTypeBinding(expression.resolvedType); - } - else if (expression instanceof JavadocFieldReference) { + } else if (expression instanceof JavadocFieldReference) { JavadocFieldReference fieldRef = (JavadocFieldReference) expression; if (fieldRef.methodBinding != null) { return getMethodBinding(fieldRef.methodBinding); @@ -1415,7 +1417,10 @@ */ synchronized IMemberValuePairBinding resolveMemberValuePair(org.eclipse.jdt.core.dom.MemberValuePair memberValuePair) { MemberValuePair valuePair = (MemberValuePair) this.newAstToOldAst.get(memberValuePair); - return getMemberValuePairBinding(valuePair.compilerElementPair); + if (valuePair != null) { + return getMemberValuePairBinding(valuePair.compilerElementPair); + } + return null; } /* (non-Javadoc) @@ -1503,29 +1508,29 @@ org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(type); org.eclipse.jdt.internal.compiler.lookup.TypeBinding binding = null; if (node != null) { - if (node instanceof ParameterizedQualifiedTypeReference) { + if (node instanceof ParameterizedQualifiedTypeReference) { ParameterizedQualifiedTypeReference typeReference = (ParameterizedQualifiedTypeReference) node; - org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding = typeReference.resolvedType; - int index; - if (type.isQualifiedType()) { - index = ((QualifiedType) type).index; - } else if (type.isParameterizedType()) { - index = ((ParameterizedType) type).index; - } else { - index = 1; - } - final int numberOfTypeArgumentsNotNull = getTypeArguments(typeReference); - if (index != numberOfTypeArgumentsNotNull) { - int i = numberOfTypeArgumentsNotNull; - while (i != index) { - typeBinding = typeBinding.enclosingType(); - i --; - } - binding = typeBinding; - } else { + org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding = typeReference.resolvedType; + int index; + if (type.isQualifiedType()) { + index = ((QualifiedType) type).index; + } else if (type.isParameterizedType()) { + index = ((ParameterizedType) type).index; + } else { + index = 1; + } + final int numberOfTypeArgumentsNotNull = getTypeArguments(typeReference); + if (index != numberOfTypeArgumentsNotNull) { + int i = numberOfTypeArgumentsNotNull; + while (i != index) { + typeBinding = typeBinding.enclosingType(); + i --; + } binding = typeBinding; - } - } else if (node instanceof TypeReference) { + } else { + binding = typeBinding; + } + } else if (node instanceof TypeReference) { TypeReference typeReference = (TypeReference) node; binding = typeReference.resolvedType; } else if (node instanceof SingleNameReference && ((SingleNameReference)node).isTypeReference()) { #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java,v retrieving revision 1.281 diff -u -r1.281 ASTConverter15Test.java --- src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java 22 Jan 2009 11:22:52 -0000 1.281 +++ src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java 6 Apr 2009 15:21:03 -0000 @@ -46,7 +46,7 @@ } static { -// TESTS_NUMBERS = new int[] { 323 }; +// TESTS_NUMBERS = new int[] { 324 }; // TESTS_RANGE = new int[] { 308, -1 }; // TESTS_NAMES = new String[] {"test0204"}; } @@ -10491,4 +10491,53 @@ ); assertNotNull("No node", buildAST(contents, this.workingCopy, false, true, true)); } + + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=270367 + public void test0324() throws JavaModelException { + String contents = "package test0324;\n" + + "public class X {\n" + + " public void someMethod() {\n" + + " int i = /*start*/(new Integer(getId())).intValue()/*end*/;\n" + + " }\n" + + " public String getId() {\n" + + " return null;\n" + + " }\n" + + "}"; + this.workingCopy = getWorkingCopy("/Converter15/src/test0324/X.java", contents, true/*resolve*/ + ); + MethodInvocation methodCall = (MethodInvocation) buildAST(contents, this.workingCopy, false, true, true); + ParenthesizedExpression intValueReceiver = (ParenthesizedExpression) methodCall.getExpression(); + ParenthesizedExpression newParenthesizedExpression = (ParenthesizedExpression) ASTNode.copySubtree( + intValueReceiver.getAST(), intValueReceiver); + replaceNodeInParent(methodCall, newParenthesizedExpression); + + // copied node + ClassInstanceCreation constructorCall = (ClassInstanceCreation) newParenthesizedExpression.getExpression(); + constructorCall.resolveTypeBinding(); + IMethodBinding constructorBinding = constructorCall.resolveConstructorBinding(); + assertNull("Not null constructor binding", constructorBinding); + + // original node + constructorCall = (ClassInstanceCreation) intValueReceiver.getExpression(); + constructorCall.resolveTypeBinding(); // This should not throw a NPE + constructorBinding = constructorCall.resolveConstructorBinding(); + assertNotNull("Null constructor binding", constructorBinding); + } + + // Utility method to replace "node" by "replacement" + private void replaceNodeInParent(Expression node, Expression replacement) { + StructuralPropertyDescriptor loc = node.getLocationInParent(); + if (loc.isChildProperty()) { + node.getParent().setStructuralProperty(loc, replacement); + } + else { + List l = (List) node.getParent().getStructuralProperty(loc); + for (int i = 0; i < l.size(); i++) { + if (node.equals(l.get(i))) { + l.set(i, replacement); + break; + } + } + } + } } \ No newline at end of file