Copyright (c) 2000, 2015 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation Stephan Herrmann - Contribution for bug 331649 - [compiler][null] consider null annotations for fields Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis Bug 458396 - NPE in CodeStream.invoke()
/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation * Stephan Herrmann - Contribution for * bug 331649 - [compiler][null] consider null annotations for fields * Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis * Bug 458396 - NPE in CodeStream.invoke() *******************************************************************************/
package org.eclipse.jdt.internal.compiler.lookup; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.Constant; public abstract class VariableBinding extends Binding { public int modifiers; public TypeBinding type; public char[] name; protected Constant constant; public int id; // for flow-analysis (position in flowInfo bit vector) public long tagBits; public VariableBinding(char[] name, TypeBinding type, int modifiers, Constant constant) { this.name = name; this.type = type; this.modifiers = modifiers; this.constant = constant; if (type != null) { this.tagBits |= (type.tagBits & TagBits.HasMissingType); } } public Constant constant() { return this.constant; }
Call this variant during resolve / analyse, so we can handle the case when a tentative lambda resolve triggers resolving of outside code.
/** * Call this variant during resolve / analyse, so we can handle the case * when a tentative lambda resolve triggers resolving of outside code. */
public Constant constant(Scope scope) { return constant(); } @Override public abstract AnnotationBinding[] getAnnotations(); public final boolean isBlankFinal(){ return (this.modifiers & ExtraCompilerModifiers.AccBlankFinal) != 0; } /* Answer true if the receiver is explicitly or implicitly final * and cannot be changed. Resources on try and multi catch variables are * marked as implicitly final. */ public final boolean isFinal() { return (this.modifiers & ClassFileConstants.AccFinal) != 0; } public final boolean isEffectivelyFinal() { return (this.tagBits & TagBits.IsEffectivelyFinal) != 0; }
Answer true if null annotations are enabled and this field is specified @NonNull
/** Answer true if null annotations are enabled and this field is specified @NonNull */
public boolean isNonNull() { return (this.tagBits & TagBits.AnnotationNonNull) != 0 || (this.type != null && (this.type.tagBits & TagBits.AnnotationNonNull) != 0); }
Answer true if null annotations are enabled and this field is specified @Nullable
/** Answer true if null annotations are enabled and this field is specified @Nullable */
public boolean isNullable() { return (this.tagBits & TagBits.AnnotationNullable) != 0 || (this.type != null && (this.type.tagBits & TagBits.AnnotationNullable) != 0); } @Override public char[] readableName() { return this.name; } public void setConstant(Constant constant) { this.constant = constant; } @Override public String toString() { StringBuffer output = new StringBuffer(10); ASTNode.printModifiers(this.modifiers, output); if ((this.modifiers & ExtraCompilerModifiers.AccUnresolved) != 0) { output.append("[unresolved] "); //$NON-NLS-1$ } output.append(this.type != null ? this.type.debugName() : "<no type>"); //$NON-NLS-1$ output.append(" "); //$NON-NLS-1$ output.append((this.name != null) ? new String(this.name) : "<no name>"); //$NON-NLS-1$ return output.toString(); } }