/******************************************************************************* * Copyright (c) 2000, 2011 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.che.ide.ext.java.jdt.core.dom; import org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.BlockScope; import org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.CompilationUnitScope; import org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.ElementValuePair; import org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.LookupEnvironment; /** * A binding resolver is an internal mechanism for figuring out the binding for a major declaration, type, or name reference. This * also handles the creation and mapping between annotations and the ast nodes that define them. * <p> * The default implementation serves as the default binding resolver that does no resolving whatsoever. Internal subclasses do all * the real work. * </p> * * @see AST#getBindingResolver */ public class BindingResolver { /** Creates a binding resolver. */ BindingResolver() { // default implementation: do nothing } /** * Finds the corresponding AST node from which the given binding originated. Returns <code>null</code> if the binding does not * correspond to any node in the compilation unit. * <p> * The following table indicates the expected node type for the various different kinds of bindings: * <ul> * <li></li> * <li>package - a <code>PackageDeclaration</code></li> * <li>class or interface - a <code>TypeDeclaration</code> or a <code>ClassInstanceCreation</code> (for anonymous classes)</li> * <li>primitive type - none</li> * <li>array type - none</li> * <li>field - a <code>VariableDeclarationFragment</code> in a <code>FieldDeclaration</code></li> * <li>local variable - a <code>SingleVariableDeclaration</code>, or a <code>VariableDeclarationFragment</code> in a * <code>VariableDeclarationStatement</code> or <code>VariableDeclarationExpression</code></li> * <li>method - a <code>MethodDeclaration</code></li> * <li>constructor - a <code>MethodDeclaration</code></li> * <li>annotation type - an <code>AnnotationTypeDeclaration</code> * <li>annotation type member - an <code>AnnotationTypeMemberDeclaration</code> * </ul> * </p> * <p> * The implementation of <code>CompilationUnit.findDeclaringNode</code> forwards to this method. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param binding * the binding * @return the corresponding node where the bindings is declared, or <code>null</code> if none */ ASTNode findDeclaringNode(IBinding binding) { return null; } /** * Finds the corresponding AST node from which the given binding key originated. * <p/> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. </p> * * @param bindingKey * the binding key * @return the corresponding node where the bindings is declared, or <code>null</code> if none */ ASTNode findDeclaringNode(String bindingKey) { return null; } /** * Finds the corresponding AST node from which the given annotation instance originated. * <p/> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. </p> * * @param instance * the dom annotation * @return the corresponding node where the bindings is declared, or <code>null</code> if none */ ASTNode findDeclaringNode(IAnnotationBinding instance) { return null; } /** * Allows the user to get information about the given old/new pair of AST nodes. * <p> * The default implementation of this method does nothing. Subclasses may reimplement. * </p> * * @param currentNode * the new node * @return org.eclipse.jdt.internal.compiler.ast.ASTNode */ org.eclipse.che.ide.ext.java.jdt.internal.compiler.ast.ASTNode getCorrespondingNode(ASTNode currentNode) { return null; } /** * Returns the new method binding corresponding to the given old method binding. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param methodBinding * the old method binding * @return the new method binding */ IMethodBinding getMethodBinding(org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.MethodBinding methodBinding) { return null; } /** * Returns the new member value pair binding corresponding to the given old value pair binding. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param valuePair * the old value pair binding * @return the new member value pair binding */ IMemberValuePairBinding getMemberValuePairBinding(ElementValuePair valuePair) { return null; } /** * Returns the new package binding corresponding to the given old package binding. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param packageBinding * the old package binding * @return the new package binding */ IPackageBinding getPackageBinding(org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.PackageBinding packageBinding) { return null; } /** * Returns the new type binding corresponding to the given old type binding. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param referenceBinding * the old type binding * @return the new type binding */ public ITypeBinding getTypeBinding(org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.TypeBinding referenceBinding) { return null; } /** * Returns the new type binding corresponding to the given variableDeclaration. This is used for recovered binding only. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param variableDeclaration * the given variable declaration * @return the new type binding */ ITypeBinding getTypeBinding(VariableDeclaration variableDeclaration) { return null; } /** * Returns the new type binding corresponding to the given type. This is used for recovered binding only. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param type * the given type * @return the new type binding */ ITypeBinding getTypeBinding(Type type) { return null; } /** * Returns the new type binding corresponding to the given recovered type binding. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param recoveredTypeBinding * the recovered type binding * @param dimensions * the dimensions to add the to given type binding dimensions * @return the new type binding */ ITypeBinding getTypeBinding(RecoveredTypeBinding recoveredTypeBinding, int dimensions) { return null; } /** * Returns the new variable binding corresponding to the given old variable binding. * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param binding * the old variable binding * @return the new variable binding */ IVariableBinding getVariableBinding(org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.VariableBinding binding) { return null; } /** * Return the new annotation corresponding to the given old annotation * <p> * The default implementation of this method returns <code>null</code> Subclasses may reimplement. * </p> * * @param instance * the old annotation * @return the new DOM annotation */ IAnnotationBinding getAnnotationInstance(org.eclipse.che.ide.ext.java.jdt.internal.compiler.lookup.AnnotationBinding instance) { return null; } boolean isResolvedTypeInferredFromExpectedType(MethodInvocation methodInvocation) { return false; } boolean isResolvedTypeInferredFromExpectedType(SuperMethodInvocation methodInvocation) { return false; } boolean isResolvedTypeInferredFromExpectedType(ClassInstanceCreation classInstanceCreation) { return false; } /** * Returns the compiler lookup environment used by this binding resolver. Returns <code>null</code> if none. * * @return the lookup environment used by this resolver, or <code>null</code> if none. */ LookupEnvironment lookupEnvironment() { return null; } /** * This method is used to record the scope and its corresponding node. * <p> * The default implementation of this method does nothing. Subclasses may reimplement. * </p> * * @param astNode */ void recordScope(ASTNode astNode, BlockScope blockScope) { // default implementation: do nothing } /** * Returns whether this expression node is the site of a boxing conversion (JLS3 5.1.7). This information is available only * when bindings are requested when the AST is being built. * * @return <code>true</code> if this expression is the site of a boxing conversion, or <code>false</code> if either no boxing * conversion is involved or if bindings were not requested when the AST was created * @since 3.1 */ boolean resolveBoxing(Expression expression) { return false; } /** * Returns whether this expression node is the site of an unboxing conversion (JLS3 5.1.8). This information is available only * when bindings are requested when the AST is being built. * * @return <code>true</code> if this expression is the site of an unboxing conversion, or <code>false</code> if either no * unboxing conversion is involved or if bindings were not requested when the AST was created * @since 3.1 */ boolean resolveUnboxing(Expression expression) { return false; } /** * Resolves and returns the compile-time constant expression value as specified in JLS2 15.28, if this expression has one. * Constant expression values are unavailable unless bindings are requested when the AST is being built. If the type of the * value is a primitive type, the result is the boxed equivalent (i.e., int returned as an <code>Integer</code>); if the type * of the value is <code>String</code>, the result is the string itself. If the expression does not have a compile-time * constant expression value, the result is <code>null</code>. * <p> * Resolving constant expressions takes into account the value of simple and qualified names that refer to constant variables * (JLS2 4.12.4). * </p> * <p> * Note 1: enum constants are not considered constant expressions either. The result is always <code>null</code> for these. * </p> * <p> * Note 2: Compile-time constant expressions cannot denote <code>null</code>. So technically {@link NullLiteral} nodes are not * constant expressions. The result is <code>null</code> for these nonetheless. * </p> * * @return the constant expression value, or <code>null</code> if this expression has no constant expression value or if * bindings were not requested when the AST was created * @since 3.1 */ Object resolveConstantExpressionValue(Expression expression) { return null; } /** * Resolves and returns the binding for the constructor being invoked. * <p> * The implementation of <code>ClassInstanceCreation.resolveConstructor</code> forwards to this method. Which constructor is * invoked is often a function of the context in which the expression node is embedded as well as the expression subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param expression * the expression of interest * @return the binding for the constructor being invoked, or <code>null</code> if no binding is available */ IMethodBinding resolveConstructor(ClassInstanceCreation expression) { return null; } /** * Resolves and returns the binding for the constructor being invoked. * <p> * The implementation of <code>ConstructorInvocation.resolveConstructor</code> forwards to this method. Which constructor is * invoked is often a function of the context in which the expression node is embedded as well as the expression subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param expression * the expression of interest * @return the binding for the constructor being invoked, or <code>null</code> if no binding is available */ IMethodBinding resolveConstructor(ConstructorInvocation expression) { return null; } /** * Resolves and returns the binding for the constructor being invoked. * <p> * The implementation of <code>ConstructorInvocation.resolveConstructor</code> forwards to this method. Which constructor is * invoked is often a function of the context in which the expression node is embedded as well as the expression subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param enumConstantDeclaration * the enum constant declaration of interest * @return the binding for the constructor being invoked, or <code>null</code> if no binding is available */ IMethodBinding resolveConstructor(EnumConstantDeclaration enumConstantDeclaration) { return null; } /** * Resolves and returns the binding for the constructor being invoked. * <p> * The implementation of <code>SuperConstructorInvocation.resolveConstructor</code> forwards to this method. Which constructor * is invoked is often a function of the context in which the expression node is embedded as well as the expression subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param expression * the expression of interest * @return the binding for the constructor being invoked, or <code>null</code> if no binding is available */ IMethodBinding resolveConstructor(SuperConstructorInvocation expression) { return null; } /** * Resolves the type of the given expression and returns the type binding for it. * <p> * The implementation of <code>Expression.resolveTypeBinding</code> forwards to this method. The result is often a function of * the context in which the expression node is embedded as well as the expression subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param expression * the expression whose type is of interest * @return the binding for the type of the given expression, or <code>null</code> if no binding is available */ ITypeBinding resolveExpressionType(Expression expression) { return null; } /** * Resolves the given field access and returns the binding for it. * <p> * The implementation of <code>FieldAccess.resolveFieldBinding</code> forwards to this method. How the field resolves is often * a function of the context in which the field access node is embedded as well as the field access subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param fieldAccess * the field access of interest * @return the binding for the given field access, or <code>null</code> if no binding is available */ IVariableBinding resolveField(FieldAccess fieldAccess) { return null; } /** * Resolves the given super field access and returns the binding for it. * <p> * The implementation of <code>SuperFieldAccess.resolveFieldBinding</code> forwards to this method. How the field resolves is * often a function of the context in which the super field access node is embedded as well as the super field access subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param fieldAccess * the super field access of interest * @return the binding for the given field access, or <code>null</code> if no binding is available */ IVariableBinding resolveField(SuperFieldAccess fieldAccess) { return null; } /** * Resolves the given import declaration and returns the binding for it. * <p> * The implementation of <code>ImportDeclaration.resolveBinding</code> forwards to this method. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param importDeclaration * the import declaration of interest * @return the binding for the given package declaration, or the package binding (for on-demand imports) or type binding (for * single-type imports), or <code>null</code> if no binding is available */ IBinding resolveImport(ImportDeclaration importDeclaration) { return null; } /** * Resolves the given annotation type declaration and returns the binding for it. * <p> * The implementation of <code>AnnotationTypeMemberDeclaration.resolveBinding</code> forwards to this method. How the * declaration resolves is often a function of the context in which the declaration node is embedded as well as the declaration * subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param member * the annotation type member declaration of interest * @return the binding for the given annotation type member declaration, or <code>null</code> if no binding is available * @since 3.0 */ IMethodBinding resolveMember(AnnotationTypeMemberDeclaration member) { return null; } /** * Resolves the given method declaration and returns the binding for it. * <p> * The implementation of <code>MethodDeclaration.resolveBinding</code> forwards to this method. How the method resolves is * often a function of the context in which the method declaration node is embedded as well as the method declaration subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param method * the method or constructor declaration of interest * @return the binding for the given method declaration, or <code>null</code> if no binding is available */ IMethodBinding resolveMethod(MethodDeclaration method) { return null; } /** * Resolves the given method invocation and returns the binding for it. * <p> * The implementation of <code>MethodInvocation.resolveMethodBinding</code> forwards to this method. How the method resolves is * often a function of the context in which the method invocation node is embedded as well as the method invocation subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param method * the method invocation of interest * @return the binding for the given method invocation, or <code>null</code> if no binding is available */ IMethodBinding resolveMethod(MethodInvocation method) { return null; } /** * Resolves the given method invocation and returns the binding for it. * <p> * The implementation of <code>MethodInvocation.resolveMethodBinding</code> forwards to this method. How the method resolves is * often a function of the context in which the method invocation node is embedded as well as the method invocation subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param method * the method invocation of interest * @return the binding for the given method invocation, or <code>null</code> if no binding is available */ IMethodBinding resolveMethod(SuperMethodInvocation method) { return null; } /** * Resolves the given name and returns the type binding for it. * <p> * The implementation of <code>Name.resolveBinding</code> forwards to this method. How the name resolves is often a function of * the context in which the name node is embedded as well as the name itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param name * the name of interest * @return the binding for the name, or <code>null</code> if no binding is available */ IBinding resolveName(Name name) { return null; } /** * Resolves the given package declaration and returns the binding for it. * <p> * The implementation of <code>PackageDeclaration.resolveBinding</code> forwards to this method. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param pkg * the package declaration of interest * @return the binding for the given package declaration, or <code>null</code> if no binding is available */ IPackageBinding resolvePackage(PackageDeclaration pkg) { return null; } /** * Resolves the given reference and returns the binding for it. * <p> * The implementation of <code>MemberRef.resolveBinding</code> forwards to this method. How the name resolves is often a * function of the context in which the name node is embedded as well as the name itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param ref * the reference of interest * @return the binding for the reference, or <code>null</code> if no binding is available * @since 3.0 */ IBinding resolveReference(MemberRef ref) { return null; } /** * Resolves the given member value pair and returns the binding for it. * <p> * The implementation of <code>MemberValuePair.resolveMemberValuePairBinding</code> forwards to this method. How the name * resolves is often a function of the context in which the name node is embedded as well as the name itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param memberValuePair * the member value pair of interest * @return the binding for the member value pair, or <code>null</code> if no binding is available * @since 3.2 */ IMemberValuePairBinding resolveMemberValuePair(MemberValuePair memberValuePair) { return null; } /** * Resolves the given reference and returns the binding for it. * <p> * The implementation of <code>MethodRef.resolveBinding</code> forwards to this method. How the name resolves is often a * function of the context in which the name node is embedded as well as the name itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param ref * the reference of interest * @return the binding for the reference, or <code>null</code> if no binding is available * @since 3.0 */ IBinding resolveReference(MethodRef ref) { return null; } /** * Resolves the given annotation type declaration and returns the binding for it. * <p> * The implementation of <code>AnnotationTypeDeclaration.resolveBinding</code> forwards to this method. How the declaration * resolves is often a function of the context in which the declaration node is embedded as well as the declaration subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param type * the annotation type declaration of interest * @return the binding for the given annotation type declaration, or <code>null</code> if no binding is available * @since 3.0 */ ITypeBinding resolveType(AnnotationTypeDeclaration type) { return null; } /** * Resolves the given anonymous class declaration and returns the binding for it. * <p> * The implementation of <code>AnonymousClassDeclaration.resolveBinding</code> forwards to this method. How the declaration * resolves is often a function of the context in which the declaration node is embedded as well as the declaration subtree * itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param type * the anonymous class declaration of interest * @return the binding for the given class declaration, or <code>null</code> if no binding is available */ ITypeBinding resolveType(AnonymousClassDeclaration type) { return null; } /** * Resolves the given enum declaration and returns the binding for it. * <p> * The implementation of <code>EnumDeclaration.resolveBinding</code> forwards to this method. How the enum declaration resolves * is often a function of the context in which the declaration node is embedded as well as the enum declaration subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param type * the enum declaration of interest * @return the binding for the given enum declaration, or <code>null</code> if no binding is available * @since 3.0 */ ITypeBinding resolveType(EnumDeclaration type) { return null; } /** * Resolves the given type and returns the type binding for it. * <p> * The implementation of <code>Type.resolveBinding</code> forwards to this method. How the type resolves is often a function of * the context in which the type node is embedded as well as the type subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param type * the type of interest * @return the binding for the given type, or <code>null</code> if no binding is available */ ITypeBinding resolveType(Type type) { return null; } /** * Resolves the given class or interface declaration and returns the binding for it. * <p> * The implementation of <code>TypeDeclaration.resolveBinding</code> (and <code>TypeDeclarationStatement.resolveBinding</code>) * forwards to this method. How the type declaration resolves is often a function of the context in which the type declaration * node is embedded as well as the type declaration subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param type * the class or interface declaration of interest * @return the binding for the given type declaration, or <code>null</code> if no binding is available */ ITypeBinding resolveType(TypeDeclaration type) { return null; } /** * Resolves the given type parameter and returns the type binding for the type parameter. * <p> * The implementation of <code>TypeParameter.resolveBinding</code> forwards to this method. How the declaration resolves is * often a function of the context in which the declaration node is embedded as well as the declaration subtree itself. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param typeParameter * the type paramter of interest * @return the binding for the given type parameter, or <code>null</code> if no binding is available * @since 3.1 */ ITypeBinding resolveTypeParameter(TypeParameter typeParameter) { return null; } /** * Resolves the given enum constant declaration and returns the binding for the field. * <p> * The implementation of <code>EnumConstantDeclaration.resolveVariable</code> forwards to this method. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param enumConstant * the enum constant declaration of interest * @return the field binding for the given enum constant declaration, or <code>null</code> if no binding is available * @since 3.0 */ IVariableBinding resolveVariable(EnumConstantDeclaration enumConstant) { return null; } /** * Resolves the given variable declaration and returns the binding for it. * <p> * The implementation of <code>VariableDeclaration.resolveBinding</code> forwards to this method. How the variable declaration * resolves is often a function of the context in which the variable declaration node is embedded as well as the variable * declaration subtree itself. VariableDeclaration declarations used as local variable, formal parameter and exception * variables resolve to local variable bindings; variable declarations used to declare fields resolve to field bindings. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param variable * the variable declaration of interest * @return the binding for the given variable declaration, or <code>null</code> if no binding is available */ IVariableBinding resolveVariable(VariableDeclaration variable) { return null; } /** * Resolves the given well known type by name and returns the type binding for it. * <p> * The implementation of <code>AST.resolveWellKnownType</code> forwards to this method. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param name * the name of a well known type * @return the corresponding type binding, or <code>null<code> if the * named type is not considered well known or if no binding can be found * for it */ ITypeBinding resolveWellKnownType(String name) { return null; } /** * Resolves the given annotation instance and returns the DOM representation for it. * <p> * The implementation of {@link Annotation#resolveAnnotationBinding()} forwards to this method. * </p> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param annotation * the annotation ast node of interest * @return the DOM annotation representation for the given ast node, or <code>null</code> if none is available */ IAnnotationBinding resolveAnnotation(Annotation annotation) { return null; } /** * Answer an array type binding with the given type binding and the given dimensions. * <p/> * <p> * If the given type binding is an array binding, then the resulting dimensions is the given dimensions plus the existing * dimensions of the array binding. Otherwise the resulting dimensions is the given dimensions. * </p> * <p/> * <p> * The default implementation of this method returns <code>null</code>. Subclasses may reimplement. * </p> * * @param typeBinding * the given type binding * @param dimensions * the given dimensions * @return an array type binding with the given type binding and the given dimensions * @throws IllegalArgumentException * if the type binding represents the <code>void</code> type binding */ ITypeBinding resolveArrayType(ITypeBinding typeBinding, int dimensions) { return null; } /** * Returns the compilation unit scope used by this binding resolver. Returns <code>null</code> if none. * * @return the compilation unit scope by this resolver, or <code>null</code> if none. */ public CompilationUnitScope scope() { return null; } /** * Allows the user to store information about the given old/new pair of AST nodes. * <p> * The default implementation of this method does nothing. Subclasses may reimplement. * </p> * * @param newNode * the new AST node * @param oldASTNode * the old AST node */ void store(ASTNode newNode, org.eclipse.che.ide.ext.java.jdt.internal.compiler.ast.ASTNode oldASTNode) { // default implementation: do nothing } /** * Allows the user to update information about the given old/new pair of AST nodes. * <p> * The default implementation of this method does nothing. Subclasses may reimplement. * </p> * * @param node * the old AST node * @param newNode * the new AST node */ void updateKey(ASTNode node, ASTNode newNode) { // default implementation: do nothing } }