Bug 329294 - "Unable to resolve binding" error on inspect, display, or
watch of a variable
diff --git a/org.eclipse.jdt.debug.tests/testprograms/bug329294.java b/org.eclipse.jdt.debug.tests/testprograms/bug329294.java
new file mode 100644
index 0000000..c361502
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testprograms/bug329294.java
@@ -0,0 +1,33 @@
+//breaking line comment
+public class bug329294 {
+ public static void main(String[] args) {
+ Inner1 i1 = new Inner1();
+ Inner2 i2 = new Inner2(i1) {
+ boolean isTrue() {
+ return fInner1.innerBool;
+ }
+ };
+ i2.isTrue();
+ i2.isNotTrue();
+ i2 = new Inner2(i1);
+ i2.isTrue();
+ }
+ private static class Inner1 {
+ boolean innerBool;
+ }
+ //breaking line comment
+ private static class Inner2 {
+ Inner1 fInner1 = null;
+ Inner2(Inner1 inner) {
+ fInner1 = inner;
+ }
+
+ boolean isTrue() {
+ return fInner1.innerBool;
+ }
+
+ boolean isNotTrue() {
+ return !fInner1.innerBool;
+ }
+ }
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
index ef43203..0d4b5f0 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
@@ -74,6 +74,7 @@
import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
import org.eclipse.debug.ui.actions.ToggleBreakpointAction;
import org.eclipse.jdt.core.IAccessRule;
+import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
@@ -88,6 +89,7 @@
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.debug.core.IJavaClassPrepareBreakpoint;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
@@ -177,7 +179,8 @@
"org.eclipse.debug.tests.targets.ThreadStack", "org.eclipse.debug.tests.targets.HcrClass", "org.eclipse.debug.tests.targets.StepIntoSelectionClass",
"WatchItemTests", "ArrayTests", "ByteArrayTests", "PerfLoop", "Console80Chars", "ConsoleStackTrace", "ConsoleVariableLineLength", "StackTraces",
"ConsoleInput", "PrintConcatenation", "VariableDetails", "org.eclipse.debug.tests.targets.ArrayDetailTests", "ArrayDetailTestsDef", "ForceReturnTests",
- "ForceReturnTestsTwo", "LogicalStructures", "BreakpointListenerTest", "LaunchHistoryTest", "LaunchHistoryTest2", "RunnableAppletImpl", "java6.AllInstancesTests"};
+ "ForceReturnTestsTwo", "LogicalStructures", "BreakpointListenerTest", "LaunchHistoryTest", "LaunchHistoryTest2", "RunnableAppletImpl", "java6.AllInstancesTests",
+ "bug329294"};
/**
* the default timeout
@@ -362,6 +365,7 @@
cfgs.add(createLaunchConfiguration(jp, "a.b.c.IntegerAccess"));
cfgs.add(createLaunchConfiguration(jp, "a.b.c.StepIntoSelectionWithGenerics"));
cfgs.add(createLaunchConfiguration(jp, "a.b.c.ConditionalsNearGenerics"));
+ cfgs.add(createLaunchConfiguration(jp, "a.b.c.bug329294WithGenerics"));
loaded15 = true;
waitForBuild();
}
@@ -552,6 +556,20 @@
}
/**
+ * Sets the contents of the given {@link ICompilationUnit} to be the new contents provided
+ * @param unit
+ * @param contents the new {@link String} contents, cannot be <code>null</code>
+ * @throws JavaModelException
+ */
+ protected void setFileContents(ICompilationUnit unit, String contents) throws JavaModelException {
+ assertNotNull("You cannot set the new contents of an ICompilationUnit to null", contents);
+ IBuffer buffer = unit.getBuffer();
+ buffer.setContents(contents);
+ unit.save(null, true);
+ waitForBuild();
+ }
+
+ /**
* Sets the last relevant event set
*
* @param set event set
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
index a228b948..eaaba3c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
@@ -74,6 +74,7 @@
import org.eclipse.jdt.debug.tests.core.WatchExpressionTests;
import org.eclipse.jdt.debug.tests.core.WorkingDirectoryTests;
import org.eclipse.jdt.debug.tests.core.WorkspaceSourceContainerTests;
+import org.eclipse.jdt.debug.tests.eval.GeneralEvalTests;
import org.eclipse.jdt.debug.tests.eval.GenericsEvalTests;
import org.eclipse.jdt.debug.tests.launching.ConfigurationEncodingTests;
import org.eclipse.jdt.debug.tests.launching.ConfigurationResourceMappingTests;
@@ -303,7 +304,9 @@
// Open from Clipboard action tests - Need to use #suite() because the test has a custom setup
addTest(OpenFromClipboardTests.suite());
-
- //addTest(EvalTestSuite.suite());
+
+ //add the complete eval suite
+ addTest(new TestSuite(GeneralEvalTests.class));
+ addTest(EvalTestSuite.suite());
}
}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java
index e4921fc..e5cb2e7 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/MiscBreakpointsTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,8 +10,6 @@
*******************************************************************************/
package org.eclipse.jdt.debug.tests.breakpoints;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
@@ -29,6 +27,8 @@
private static final String COMPILE_ERROR_CONTENTS =
"public class CompileError {\npublic static void main(String[] args) {\nString foo = \"foo\" + bar;\n} \n}";
+ private static final String ORIGINAL_CONTENTS = "public class CompileError {\npublic static void main(String[] args) {\n}\n}";
+
/**
* Constructor
* @param name
@@ -72,10 +72,7 @@
IType type = get14Project().findType(typeName);
ICompilationUnit cu = type.getCompilationUnit();
- IBuffer buffer = cu.getBuffer();
- buffer.setContents(COMPILE_ERROR_CONTENTS);
- cu.save(new NullProgressMonitor(), true);
- waitForBuild();
+ setFileContents(cu, COMPILE_ERROR_CONTENTS);
IJavaThread javaThread = null;
try {
@@ -89,6 +86,8 @@
getPrefStore().setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, false);
terminateAndRemove(javaThread);
removeAllBreakpoints();
+ //restore the file to remove compile errors
+ setFileContents(cu, ORIGINAL_CONTENTS);
}
}
@@ -104,10 +103,7 @@
IType type = get14Project().findType(typeName);
ICompilationUnit cu = type.getCompilationUnit();
- IBuffer buffer = cu.getBuffer();
- buffer.setContents(COMPILE_ERROR_CONTENTS);
- cu.save(new NullProgressMonitor(), true);
- waitForBuild();
+ setFileContents(cu, COMPILE_ERROR_CONTENTS);
IJavaDebugTarget debugTarget = null;
try {
@@ -115,6 +111,7 @@
} finally {
terminateAndRemove(debugTarget);
removeAllBreakpoints();
+ setFileContents(cu, ORIGINAL_CONTENTS);
}
}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java
new file mode 100644
index 0000000..451025f
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GeneralEvalTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) Mar 6, 2013 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.eval;
+
+import org.eclipse.jdt.debug.core.IJavaThread;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+
+/**
+ * Tests that evaluations in non-generified source
+ *
+ * @since 3.8.100
+ */
+public class GeneralEvalTests extends AbstractDebugTest {
+
+
+ /**
+ * @param name
+ */
+ public GeneralEvalTests(String name) {
+ super(name);
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testInnerType1() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String typename = "bug329294";
+ createLineBreakpoint(22, typename);
+ thread = launchToBreakpoint(typename);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "inner";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testInnerType2() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String typename = "bug329294";
+ createLineBreakpoint(26, typename);
+ thread = launchToBreakpoint(typename);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "fInner1.innerBool";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testInnerType3() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String typename = "bug329294";
+ createLineBreakpoint(30, typename);
+ thread = launchToBreakpoint(typename);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "!fInner1.innerBool";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testInnerAnonymousType() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String typename = "bug329294";
+ createLineBreakpoint(7, typename);
+ thread = launchToBreakpoint(typename);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "fInner1.innerBool";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java
index 2ed3972..af8bd4a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEvalTests.java
@@ -261,4 +261,84 @@
terminateAndRemove(thread);
}
}
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testLineCommentEvalGenerics1() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String type = "a.b.c.bug329294WithGenerics";
+ createLineBreakpoint(8, type);
+ thread = launchToBreakpoint(type);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "fInner1.innerBool";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testLineCommentEvalGenerics2() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String type = "a.b.c.bug329294WithGenerics";
+ createLineBreakpoint(23, type);
+ thread = launchToBreakpoint(type);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "inner";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testLineCommentEvalGenerics3() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String type = "a.b.c.bug329294WithGenerics";
+ createLineBreakpoint(27, type);
+ thread = launchToBreakpoint(type);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "fInner1.innerBool";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
+
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=329294
+ * @throws Exception
+ */
+ public void testLineCommentEvalGenerics4() throws Exception {
+ IJavaThread thread = null;
+ try {
+ String type = "a.b.c.bug329294WithGenerics";
+ createLineBreakpoint(31, type);
+ thread = launchToBreakpoint(type);
+ assertNotNull("The program did not suspend", thread);
+ String snippet = "!fInner1.innerBool";
+ doEval(thread, snippet);
+ }
+ finally {
+ removeAllBreakpoints();
+ terminateAndRemove(thread);
+ }
+ }
}
diff --git a/org.eclipse.jdt.debug.tests/testsource-j2se-1.5/a/b/c/bug329294WithGenerics.java b/org.eclipse.jdt.debug.tests/testsource-j2se-1.5/a/b/c/bug329294WithGenerics.java
new file mode 100644
index 0000000..55fa081
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testsource-j2se-1.5/a/b/c/bug329294WithGenerics.java
@@ -0,0 +1,34 @@
+package a.b.c;
+//breaking line comment
+public class bug329294WithGenerics {
+ public static void main(String[] args) {
+ Inner1<String> i1 = new Inner1<String>();
+ Inner2<String> i2 = new Inner2<String>(i1) {
+ boolean isTrue() {
+ return fInner1.innerBool;
+ }
+ };
+ i2.isTrue();
+ i2.isNotTrue();
+ i2 = new Inner2<String>(i1);
+ i2.isTrue();
+ }
+ private static class Inner1<T> {
+ boolean innerBool;
+ }
+ //breaking line comment
+ private static class Inner2<T> {
+ Inner1<T> fInner1 = null;
+ Inner2(Inner1<T> inner) {
+ fInner1 = inner;
+ }
+
+ <E> boolean isTrue() {
+ return fInner1.innerBool;
+ }
+
+ boolean isNotTrue() {
+ return !fInner1.innerBool;
+ }
+ }
+}
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java
index d752a0f..127b636 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationSourceGenerator.java
@@ -188,7 +188,7 @@
options.put(key, JavaCore.IGNORE);
}
}
- options.put(JavaCore.COMPILER_TASK_TAGS, ""); //$NON-NLS-1$
+ options.remove(JavaCore.COMPILER_TASK_TAGS);
return options;
}
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java
index 837bac0..3037fb7 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/SourceBasedSourceGenerator.java
@@ -20,10 +20,10 @@
import java.util.Stack;
import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.SourceRange;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
@@ -309,12 +309,33 @@
* type name context, false otherwise
*/
private boolean isRightType(ASTNode node) {
- SourceRange range = new SourceRange(node.getStartPosition(),
- node.getLength());
- try {
- return fType.getSourceRange().equals(range);
- } catch (JavaModelException e) {
- JDIDebugPlugin.log(e.getStatus());
+ switch(node.getNodeType()) {
+ case ASTNode.ANNOTATION_TYPE_DECLARATION:
+ case ASTNode.ENUM_DECLARATION:
+ case ASTNode.TYPE_DECLARATION: {
+ AbstractTypeDeclaration decl = (AbstractTypeDeclaration) node;
+ if(fType.getElementName().equals(decl.getName().getIdentifier())) {
+ try {
+ return fType.getFlags() == decl.getModifiers();
+ }
+ catch(JavaModelException jme) {
+ return true;
+ }
+ }
+ break;
+ }
+ case ASTNode.CLASS_INSTANCE_CREATION: {
+ //we only get here when anonymous types are found
+ ClassInstanceCreation cic = (ClassInstanceCreation) node;
+ try {
+ ISourceRange name = fType.getNameRange();
+ return name.getOffset() >= cic.getStartPosition() &&
+ name.getOffset()+name.getLength() <= cic.getStartPosition()+cic.getLength();
+ } catch (JavaModelException e) {
+ JDIDebugPlugin.log(e.getStatus());
+ }
+ break;
+ }
}
return false;
}
@@ -1557,8 +1578,6 @@
*/
@Override
public boolean visit(MethodDeclaration node) {
- String name = node.getName().toString();
- System.out.println(name);
int firstLine = fCompilationUnit.getLineNumber(node.getStartPosition());
int lastLine = fCompilationUnit.getLineNumber(node.getStartPosition() + node.getLength());
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
index 6482c7f..f565bae 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
@@ -237,29 +237,20 @@
}
if (innerTypeName.length() > 0) {
try {
- Integer.parseInt(innerTypeName.substring(0, 1)); // throws
- // NFE
- // if
- // not
- // an
- // integer
-
+ Integer.parseInt(innerTypeName.substring(0, 1)); // throws NFE if not an integer
// perform expensive lookup for anonymous types:
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setResolveBindings(true);
parser.setSource(type.getTypeRoot());
- CompilationUnit cu = (CompilationUnit) parser
- .createAST(null);
+ CompilationUnit cu = (CompilationUnit) parser.createAST(null);
cu.accept(new ASTVisitor(false) {
@Override
public boolean visit(AnonymousClassDeclaration node) {
ITypeBinding binding = node.resolveBinding();
if (binding == null)
return false;
- if (qualifiedName.equals(binding
- .getBinaryName()))
- throw new ResultException((IType) binding
- .getJavaElement());
+ if (qualifiedName.equals(binding.getBinaryName()))
+ throw new ResultException((IType) binding.getJavaElement());
return true;
}
@@ -268,10 +259,8 @@
ITypeBinding binding = node.resolveBinding();
if (binding == null)
return false;
- if (qualifiedName.equals(binding
- .getBinaryName()))
- throw new ResultException((IType) binding
- .getJavaElement());
+ if (qualifiedName.equals(binding.getBinaryName()))
+ throw new ResultException((IType) binding.getJavaElement());
return true;
}
});