From bfaf8b10ce651f5ef85de0696b497a91431cff06 Mon Sep 17 00:00:00 2001 From: Jesper Moller Date: Mon, 24 Feb 2014 10:37:23 -0600 Subject: Bug 427089 - [1.8] Debugger evaluations fail silently with lambdas or method references Change-Id: I761ce19790a11ee721436c7e1b3c1b9b7823f260 Signed-off-by: Jesper Moller --- .../debug/eval/ast/engine/ASTEvaluationEngine.java | 4 +- .../eval/ast/engine/ASTInstructionCompiler.java | 161 +++++++++------------ .../eval/ast/engine/EvaluationEngineMessages.java | 4 + .../ast/engine/EvaluationEngineMessages.properties | 4 + 4 files changed, 76 insertions(+), 97 deletions(-) diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java index c67ed9e89..dbe8c5bf1 100644 --- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java +++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java @@ -7,7 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation - * Jesper Steen Moller - bug 341232 + * Jesper Steen Moller - Bugs 341232, 427089 *******************************************************************************/ package org.eclipse.jdt.internal.debug.eval.ast.engine; @@ -330,7 +330,7 @@ public class ASTEvaluationEngine implements IAstEvaluationEngine { private CompilationUnit parseCompilationUnit(char[] source, String unitName, IJavaProject project) { - ASTParser parser = ASTParser.newParser(AST.JLS4); + ASTParser parser = ASTParser.newParser(AST.JLS8); parser.setSource(source); parser.setUnitName(unitName); parser.setProject(project); diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java index d69a91fe9..e72f99210 100644 --- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java +++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Jesper Steen Moller - Bug 427089 *******************************************************************************/ package org.eclipse.jdt.internal.debug.eval.ast.engine; @@ -21,101 +22,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.Signature; import org.eclipse.jdt.core.compiler.IProblem; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; -import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; -import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; -import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; -import org.eclipse.jdt.core.dom.ArrayAccess; -import org.eclipse.jdt.core.dom.ArrayCreation; -import org.eclipse.jdt.core.dom.ArrayInitializer; -import org.eclipse.jdt.core.dom.ArrayType; -import org.eclipse.jdt.core.dom.AssertStatement; -import org.eclipse.jdt.core.dom.Assignment; -import org.eclipse.jdt.core.dom.Block; -import org.eclipse.jdt.core.dom.BlockComment; -import org.eclipse.jdt.core.dom.BooleanLiteral; -import org.eclipse.jdt.core.dom.BreakStatement; -import org.eclipse.jdt.core.dom.CastExpression; -import org.eclipse.jdt.core.dom.CatchClause; -import org.eclipse.jdt.core.dom.CharacterLiteral; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ConditionalExpression; -import org.eclipse.jdt.core.dom.ConstructorInvocation; -import org.eclipse.jdt.core.dom.ContinueStatement; -import org.eclipse.jdt.core.dom.DoStatement; -import org.eclipse.jdt.core.dom.EmptyStatement; -import org.eclipse.jdt.core.dom.EnhancedForStatement; -import org.eclipse.jdt.core.dom.EnumConstantDeclaration; -import org.eclipse.jdt.core.dom.EnumDeclaration; -import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ExpressionStatement; -import org.eclipse.jdt.core.dom.FieldAccess; -import org.eclipse.jdt.core.dom.FieldDeclaration; -import org.eclipse.jdt.core.dom.ForStatement; -import org.eclipse.jdt.core.dom.IBinding; -import org.eclipse.jdt.core.dom.IMethodBinding; -import org.eclipse.jdt.core.dom.IPackageBinding; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.IVariableBinding; -import org.eclipse.jdt.core.dom.IfStatement; -import org.eclipse.jdt.core.dom.ImportDeclaration; -import org.eclipse.jdt.core.dom.InfixExpression; -import org.eclipse.jdt.core.dom.Initializer; -import org.eclipse.jdt.core.dom.InstanceofExpression; -import org.eclipse.jdt.core.dom.Javadoc; -import org.eclipse.jdt.core.dom.LabeledStatement; -import org.eclipse.jdt.core.dom.LineComment; -import org.eclipse.jdt.core.dom.MarkerAnnotation; -import org.eclipse.jdt.core.dom.MemberRef; -import org.eclipse.jdt.core.dom.MemberValuePair; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.MethodRef; -import org.eclipse.jdt.core.dom.MethodRefParameter; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; -import org.eclipse.jdt.core.dom.NormalAnnotation; -import org.eclipse.jdt.core.dom.NullLiteral; -import org.eclipse.jdt.core.dom.NumberLiteral; -import org.eclipse.jdt.core.dom.PackageDeclaration; -import org.eclipse.jdt.core.dom.ParameterizedType; -import org.eclipse.jdt.core.dom.ParenthesizedExpression; -import org.eclipse.jdt.core.dom.PostfixExpression; -import org.eclipse.jdt.core.dom.PrefixExpression; -import org.eclipse.jdt.core.dom.PrimitiveType; -import org.eclipse.jdt.core.dom.QualifiedName; -import org.eclipse.jdt.core.dom.QualifiedType; -import org.eclipse.jdt.core.dom.ReturnStatement; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.SimpleType; -import org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.eclipse.jdt.core.dom.SingleVariableDeclaration; -import org.eclipse.jdt.core.dom.Statement; -import org.eclipse.jdt.core.dom.StringLiteral; -import org.eclipse.jdt.core.dom.SuperConstructorInvocation; -import org.eclipse.jdt.core.dom.SuperFieldAccess; -import org.eclipse.jdt.core.dom.SuperMethodInvocation; -import org.eclipse.jdt.core.dom.SwitchCase; -import org.eclipse.jdt.core.dom.SwitchStatement; -import org.eclipse.jdt.core.dom.SynchronizedStatement; -import org.eclipse.jdt.core.dom.TagElement; -import org.eclipse.jdt.core.dom.TextElement; -import org.eclipse.jdt.core.dom.ThisExpression; -import org.eclipse.jdt.core.dom.ThrowStatement; -import org.eclipse.jdt.core.dom.TryStatement; -import org.eclipse.jdt.core.dom.Type; -import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.TypeDeclarationStatement; -import org.eclipse.jdt.core.dom.TypeLiteral; -import org.eclipse.jdt.core.dom.TypeParameter; -import org.eclipse.jdt.core.dom.VariableDeclarationExpression; -import org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import org.eclipse.jdt.core.dom.VariableDeclarationStatement; -import org.eclipse.jdt.core.dom.WhileStatement; -import org.eclipse.jdt.core.dom.WildcardType; +import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin; import org.eclipse.jdt.internal.debug.eval.ast.instructions.AndAssignmentOperator; import org.eclipse.jdt.internal.debug.eval.ast.instructions.AndOperator; @@ -2182,6 +2089,19 @@ public class ASTInstructionCompiler extends ASTVisitor { return false; } + /** + * @see ASTVisitor#visit(CreationReference) + */ + @Override + public boolean visit(CreationReference node) { + if (!isActive()) { + return true; + } + setHasError(true); + addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression); + return false; + } + /** * @see ASTVisitor#visit(DoStatement) */ @@ -2366,6 +2286,19 @@ public class ASTInstructionCompiler extends ASTVisitor { return false; } + /** + * @see ASTVisitor#visit(ExpressionMethodReference) + */ + @Override + public boolean visit(ExpressionMethodReference node) { + if (!isActive()) { + return true; + } + setHasError(true); + addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression); + return false; + } + /** * @see ASTVisitor#visit(ExpressionStatement) */ @@ -2864,6 +2797,18 @@ public class ASTInstructionCompiler extends ASTVisitor { return false; } + /** + * @see ASTVisitor#visit(LambdaExpression) + */ + @Override + public boolean visit(LambdaExpression node) { + if (!isActive()) { + return true; + } + setHasError(true); + addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Lambda_expressions_cannot_be_used_in_an_evaluation_expression); + return false; + } /* * (non-Javadoc) * @@ -3934,6 +3879,19 @@ public class ASTInstructionCompiler extends ASTVisitor { return false; } + /** + * @see ASTVisitor#visit(SuperMethodReference) + */ + @Override + public boolean visit(SuperMethodReference node) { + if (!isActive()) { + return true; + } + setHasError(true); + addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression); + return false; + } + /** * @see ASTVisitor#visit(SwitchCase) */ @@ -4196,6 +4154,19 @@ public class ASTInstructionCompiler extends ASTVisitor { return true; } + /** + * @see ASTVisitor#visit(TypeMethodReference) + */ + @Override + public boolean visit(TypeMethodReference node) { + if (!isActive()) { + return true; + } + setHasError(true); + addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression); + return false; + } + /** * @see ASTVisitor#visit(VariableDeclarationExpression) */ diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java index 43a9423ae..d28624bbd 100644 --- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java +++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java @@ -7,6 +7,7 @@ * * Contributors: * IBM - Initial API and implementation + * Jesper Steen Moller - 427089: [1.8] Change value in Variables view with lambda or method reference *******************************************************************************/ package org.eclipse.jdt.internal.debug.eval.ast.engine; @@ -56,6 +57,9 @@ public class EvaluationEngineMessages extends NLS { public static String ASTInstructionCompiler_4; public static String ASTInstructionCompiler_5; + public static String ASTInstructionCompiler_Lambda_expressions_cannot_be_used_in_an_evaluation_expression; + public static String ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression; + static { // load message values from bundle file NLS.initializeMessages(BUNDLE_NAME, EvaluationEngineMessages.class); diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties index d40620425..d87bc2e0c 100644 --- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties +++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties @@ -7,6 +7,7 @@ # # Contributors: # IBM Corporation - initial API and implementation +# Jesper Steen Moller - 427089: [1.8] Change value in Variables view with lambda or method reference ############################################################################### ASTInstructionCompiler_Anonymous_type_declaration_cannot_be_used_in_an_evaluation_expression_2=Anonymous type declaration cannot be used in an evaluation expression @@ -51,3 +52,6 @@ ASTInstructionCompiler_4=The ASTInstruction compiler failed to store instruction ASTInstructionCompiler_5=Unable to resolve binding for: {0} ASTEvaluationEngine_1=Unable to retrieve type for java.lang.Object ArrayRuntimeContext_0=Unable to retrieve type for java.lang.Object + +ASTInstructionCompiler_Lambda_expressions_cannot_be_used_in_an_evaluation_expression=Lambda expressions cannot be used in an evaluation expression +ASTInstructionCompiler_Reference_expressions_cannot_be_used_in_an_evaluation_expression=Reference expressions cannot be used in an evaluation expression \ No newline at end of file -- cgit v1.2.3