Java Code Examples for org.eclipse.jdt.core.compiler.CharOperation#splitOn()
The following examples show how to use
org.eclipse.jdt.core.compiler.CharOperation#splitOn() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: ClasspathEntry.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
/** * Decode some element tag containing a sequence of patterns into IPath[] */ private static IPath[] decodePatterns(NamedNodeMap nodeMap, String tag) { String sequence = removeAttribute(tag, nodeMap); if (!sequence.equals("")) { //$NON-NLS-1$ char[][] patterns = CharOperation.splitOn('|', sequence.toCharArray()); int patternCount; if ((patternCount = patterns.length) > 0) { IPath[] paths = new IPath[patternCount]; int index = 0; for (int j = 0; j < patternCount; j++) { char[] pattern = patterns[j]; if (pattern.length == 0) continue; // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=105581 paths[index++] = new Path(new String(pattern)); } if (index < patternCount) System.arraycopy(paths, 0, paths = new IPath[index], 0, index); return paths; } } return null; }
Example 2
Source File: IndexManager.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
private char[][] readJavaLikeNamesFile() { try { String pathName = getJavaPluginWorkingLocation().toOSString(); File javaLikeNamesFile = new File(pathName, "javaLikeNames.txt"); //$NON-NLS-1$ if (!javaLikeNamesFile.exists()) return null; char[] javaLikeNames = org.eclipse.jdt.internal.compiler.util.Util.getFileCharContent(javaLikeNamesFile, null); if (javaLikeNames.length > 0) { char[][] names = CharOperation.splitOn('\n', javaLikeNames); return names; } } catch (IOException ignored) { if (VERBOSE) Util.verbose("Failed to read javaLikeNames file"); //$NON-NLS-1$ } return null; }
Example 3
Source File: IndexManager.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
private void readIndexMap() { try { char[] indexMaps = org.eclipse.jdt.internal.compiler.util.Util.getFileCharContent(this.indexNamesMapFile, null); char[][] names = CharOperation.splitOn('\n', indexMaps); if (names.length >= 3) { // First line is DiskIndex signature (see writeIndexMapFile()) String savedSignature = DiskIndex.SIGNATURE; if (savedSignature.equals(new String(names[0]))) { for (int i = 1, l = names.length-1 ; i < l ; i+=2) { IndexLocation indexPath = IndexLocation.createIndexLocation(new URL(new String(names[i]))); if (indexPath == null) continue; this.indexLocations.put(new Path(new String(names[i+1])), indexPath ); this.indexStates.put(indexPath, REUSE_STATE); } } } } catch (IOException ignored) { if (VERBOSE) Util.verbose("Failed to read saved index file names"); //$NON-NLS-1$ } return; }
Example 4
Source File: IndexManager.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
private char[][] readIndexState(String dirOSString) { try { char[] savedIndexNames = org.eclipse.jdt.internal.compiler.util.Util.getFileCharContent(this.savedIndexNamesFile, null); if (savedIndexNames.length > 0) { char[][] names = CharOperation.splitOn('\n', savedIndexNames); if (names.length > 1) { // First line is DiskIndex signature + saved plugin working location (see writeSavedIndexNamesFile()) String savedSignature = DiskIndex.SIGNATURE + "+" + dirOSString; //$NON-NLS-1$ if (savedSignature.equals(new String(names[0]))) return names; } } } catch (IOException ignored) { if (VERBOSE) Util.verbose("Failed to read saved index file names"); //$NON-NLS-1$ } return null; }
Example 5
Source File: IndexManager.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
private void readParticipantsIndexNamesFile() { SimpleLookupTable containers = new SimpleLookupTable(3); try { char[] participantIndexNames = org.eclipse.jdt.internal.compiler.util.Util.getFileCharContent(this.participantIndexNamesFile, null); if (participantIndexNames.length > 0) { char[][] names = CharOperation.splitOn('\n', participantIndexNames); if (names.length >= 3) { // First line is DiskIndex signature (see writeParticipantsIndexNamesFile()) if (DiskIndex.SIGNATURE.equals(new String(names[0]))) { for (int i = 1, l = names.length-1 ; i < l ; i+=2) { IndexLocation indexLocation = new FileIndexLocation(new File(new String(names[i])), true); containers.put(indexLocation, new Path(new String(names[i+1]))); } } } } } catch (IOException ignored) { if (VERBOSE) Util.verbose("Failed to read participant index file names"); //$NON-NLS-1$ } this.participantsContainers = containers; return; }
Example 6
Source File: Main.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
private ReferenceBinding[] processClassNames(LookupEnvironment environment) { // check for .class file presence in case of apt processing int length = this.classNames.length; ReferenceBinding[] referenceBindings = new ReferenceBinding[length]; for (int i = 0; i < length; i++) { String currentName = this.classNames[i]; char[][] compoundName = null; if (currentName.indexOf('.') != -1) { // consider names with '.' as fully qualified names char[] typeName = currentName.toCharArray(); compoundName = CharOperation.splitOn('.', typeName); } else { compoundName = new char[][] { currentName.toCharArray() }; } ReferenceBinding type = environment.getType(compoundName); if (type != null && type.isValidBinding()) { if (type.isBinaryBinding()) { referenceBindings[i] = type; } } else { throw new IllegalArgumentException( this.bind("configure.invalidClassName", currentName));//$NON-NLS-1$ } } return referenceBindings; }
Example 7
Source File: LookupEnvironment.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 6 votes |
ReferenceBinding getTypeFromConstantPoolName(char[] signature, int start, int end, boolean isParameterized, char[][][] missingTypeNames, TypeAnnotationWalker walker) { if (end == -1) end = signature.length; char[][] compoundName = CharOperation.splitOn('/', signature, start, end); boolean wasMissingType = false; if (missingTypeNames != null) { for (int i = 0, max = missingTypeNames.length; i < max; i++) { if (CharOperation.equals(compoundName, missingTypeNames[i])) { wasMissingType = true; break; } } } ReferenceBinding binding = getTypeFromCompoundName(compoundName, isParameterized, wasMissingType); if (walker != TypeAnnotationWalker.EMPTY_ANNOTATION_WALKER) { binding = (ReferenceBinding) annotateType(binding, walker, missingTypeNames); } return binding; }
Example 8
Source File: ReferenceCollection.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
public static char[][][] internQualifiedNames(StringSet qualifiedStrings) { if (qualifiedStrings == null) return EmptyQualifiedNames; int length = qualifiedStrings.elementSize; if (length == 0) return EmptyQualifiedNames; char[][][] result = new char[length][][]; String[] strings = qualifiedStrings.values; for (int i = 0, l = strings.length; i < l; i++) if (strings[i] != null) result[--length] = CharOperation.splitOn('/', strings[i].toCharArray()); return internQualifiedNames(result, false); }
Example 9
Source File: ElementsImpl.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
@Override public TypeElement getTypeElement(CharSequence name) { LookupEnvironment le = _env.getLookupEnvironment(); final char[][] compoundName = CharOperation.splitOn('.', name.toString().toCharArray()); ReferenceBinding binding = le.getType(compoundName); // If we didn't find the binding, maybe it's a nested type; // try finding the top-level type and then working downwards. if (null == binding) { ReferenceBinding topLevelBinding = null; int topLevelSegments = compoundName.length; while (--topLevelSegments > 0) { char[][] topLevelName = new char[topLevelSegments][]; for (int i = 0; i < topLevelSegments; ++i) { topLevelName[i] = compoundName[i]; } topLevelBinding = le.getType(topLevelName); if (null != topLevelBinding) { break; } } if (null == topLevelBinding) { return null; } binding = topLevelBinding; for (int i = topLevelSegments; null != binding && i < compoundName.length; ++i) { binding = binding.getMemberType(compoundName[i]); } } if (null == binding) { return null; } return new TypeElementImpl(_env, binding, null); }
Example 10
Source File: BinaryTypeBinding.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
/** given an application of @NonNullByDefault convert the annotation argument (if any) into a bitvector a la {@link Binding#NullnessDefaultMASK} */ // pre: null annotation analysis is enabled int getNonNullByDefaultValue(IBinaryAnnotation annotation) { char[] annotationTypeName = annotation.getTypeName(); char[][] typeName = CharOperation.splitOn('/', annotationTypeName, 1, annotationTypeName.length-1); // cut of leading 'L' and trailing ';' IBinaryElementValuePair[] elementValuePairs = annotation.getElementValuePairs(); if (elementValuePairs == null || elementValuePairs.length == 0 ) { // no argument: apply default default ReferenceBinding annotationType = this.environment.getType(typeName); if (annotationType == null) return 0; if (annotationType.isUnresolvedType()) annotationType = ((UnresolvedReferenceBinding) annotationType).resolve(this.environment, false); MethodBinding[] annotationMethods = annotationType.methods(); if (annotationMethods != null && annotationMethods.length == 1) { Object value = annotationMethods[0].getDefaultValue(); return Annotation.nullTagBitsFromAnnotationValue(value); } } else if (elementValuePairs.length > 0) { // evaluate the contained EnumConstantSignatures: int nullness = 0; for (int i = 0; i < elementValuePairs.length; i++) nullness |= Annotation.nullTagBitsFromAnnotationValue(elementValuePairs[i].getValue()); return nullness; } else { // empty argument: cancel all defaults from enclosing scopes return NULL_UNSPECIFIED_BY_DEFAULT; } return 0; }
Example 11
Source File: SearchableEnvironmentRequestor.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
/** * @see IJavaElementRequestor */ public void acceptType(IType type) { try { if (this.unitToSkip != null && this.unitToSkip.equals(type.getCompilationUnit())){ return; } char[] packageName = type.getPackageFragment().getElementName().toCharArray(); boolean isBinary = type instanceof BinaryType; // determine associated access restriction AccessRestriction accessRestriction = null; if (this.checkAccessRestrictions && (isBinary || !type.getJavaProject().equals(this.project))) { PackageFragmentRoot root = (PackageFragmentRoot)type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); ClasspathEntry entry = (ClasspathEntry) this.nameLookup.rootToResolvedEntries.get(root); if (entry != null) { // reverse map always contains resolved CP entry AccessRuleSet accessRuleSet = entry.getAccessRuleSet(); if (accessRuleSet != null) { // TODO (philippe) improve char[] <-> String conversions to avoid performing them on the fly char[][] packageChars = CharOperation.splitOn('.', packageName); char[] fileWithoutExtension = type.getElementName().toCharArray(); accessRestriction = accessRuleSet.getViolatedRestriction(CharOperation.concatWith(packageChars, fileWithoutExtension, '/')); } } } this.requestor.acceptType(packageName, type.getElementName().toCharArray(), null, type.getFlags(), accessRestriction); } catch (JavaModelException jme) { // ignore } }
Example 12
Source File: NameLookup.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
private AccessRestriction getViolatedRestriction(String typeName, String packageName, IType type, AccessRestriction accessRestriction) { PackageFragmentRoot root = (PackageFragmentRoot) type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); ClasspathEntry entry = (ClasspathEntry) this.rootToResolvedEntries.get(root); if (entry != null) { // reverse map always contains resolved CP entry AccessRuleSet accessRuleSet = entry.getAccessRuleSet(); if (accessRuleSet != null) { // TODO (philippe) improve char[] <-> String conversions to avoid performing them on the fly char[][] packageChars = CharOperation.splitOn('.', packageName.toCharArray()); char[] typeChars = typeName.toCharArray(); accessRestriction = accessRuleSet.getViolatedRestriction(CharOperation.concatWith(packageChars, typeChars, '/')); } } return accessRestriction; }
Example 13
Source File: LookupEnvironment.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
public BinaryTypeBinding cacheBinaryType(IBinaryType binaryType, boolean needFieldsAndMethods, AccessRestriction accessRestriction) { char[][] compoundName = CharOperation.splitOn('/', binaryType.getName()); ReferenceBinding existingType = getCachedType(compoundName); if (existingType == null || existingType instanceof UnresolvedReferenceBinding) // only add the binary type if its not already in the cache return createBinaryTypeFrom(binaryType, computePackageFrom(compoundName, false /* valid pkg */), needFieldsAndMethods, accessRestriction); return null; // the type already exists & can be retrieved from the cache }
Example 14
Source File: ReferenceCollection.java From takari-lifecycle with Eclipse Public License 1.0 | 5 votes |
/** * Adds the fully-qualified type names of any new dependencies, each name is of the form "p1.p2.A.B". * * @see BuildContext#recordDependencies(String[]) */ public void addDependencies(Collection<String> typeNameDependencies) { // if each qualified type name is already known then all of its subNames can be skipped // and its expected that very few qualified names in typeNameDependencies need to be added // but could always take 'p1.p2.p3.X' and make all qualified names 'p1' 'p1.p2' 'p1.p2.p3' 'p1.p2.p3.X', then intern char[][][] qNames = new char[typeNameDependencies.size()][][]; Iterator<String> typeNameDependency = typeNameDependencies.iterator(); for (int i = 0; typeNameDependency.hasNext(); i++) { qNames[i] = CharOperation.splitOn('.', typeNameDependency.next().toCharArray()); } qNames = internQualifiedNames(qNames, false); next: for (int i = qNames.length; --i >= 0;) { char[][] qualifiedTypeName = qNames[i]; while (!includes(qualifiedTypeName)) { if (!includes(qualifiedTypeName[qualifiedTypeName.length - 1])) { this.simpleNameReferences.add(new String(qualifiedTypeName[qualifiedTypeName.length - 1])); } if (!insideRoot(qualifiedTypeName[0])) { this.rootReferences.add(new String(qualifiedTypeName[0])); } this.qualifiedNameReferences.add(CharOperation.toString(qualifiedTypeName)); qualifiedTypeName = CharOperation.subarray(qualifiedTypeName, 0, qualifiedTypeName.length - 1); char[][][] temp = internQualifiedNames(new char[][][] {qualifiedTypeName}, false); if (temp == EmptyQualifiedNames) continue next; // qualifiedTypeName is a well known name qualifiedTypeName = temp[0]; } } }
Example 15
Source File: PackageReferencePattern.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
public PackageReferencePattern(char[] pkgName, int matchRule) { this(matchRule); if (pkgName == null || pkgName.length == 0) { this.pkgName = null; this.segments = new char[][] {CharOperation.NO_CHAR}; this.mustResolve = false; } else { this.pkgName = (this.isCaseSensitive || this.isCamelCase) ? pkgName : CharOperation.toLowerCase(pkgName); this.segments = CharOperation.splitOn('.', this.pkgName); this.mustResolve = true; } }
Example 16
Source File: TypeDeclarationPattern.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 5 votes |
public void decodeIndexKey(char[] key) { int slash = CharOperation.indexOf(SEPARATOR, key, 0); this.simpleName = CharOperation.subarray(key, 0, slash); int start = ++slash; if (key[start] == SEPARATOR) { this.pkg = CharOperation.NO_CHAR; } else { slash = CharOperation.indexOf(SEPARATOR, key, start); this.pkg = internedPackageNames.add(CharOperation.subarray(key, start, slash)); } // Continue key read by the end to decode modifiers int last = key.length-1; this.secondary = key[last] == 'S'; if (this.secondary) { last -= 2; } this.modifiers = key[last-1] + (key[last]<<16); decodeModifiers(); // Retrieve enclosing type names start = slash + 1; last -= 2; // position of ending slash if (start == last) { this.enclosingTypeNames = CharOperation.NO_CHAR_CHAR; } else { if (last == (start+1) && key[start] == ZERO_CHAR) { this.enclosingTypeNames = ONE_ZERO_CHAR; } else { this.enclosingTypeNames = CharOperation.splitOn('.', key, start, last); } } }
Example 17
Source File: BinaryTypeBinding.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 4 votes |
private void scanTypeForNullDefaultAnnotation(IBinaryType binaryType, PackageBinding packageBinding, BinaryTypeBinding binaryBinding) { if (!isPrototype()) throw new IllegalStateException(); char[][] nonNullByDefaultAnnotationName = this.environment.getNonNullByDefaultAnnotationName(); if (nonNullByDefaultAnnotationName == null) return; // not well-configured to use null annotations IBinaryAnnotation[] annotations = binaryType.getAnnotations(); boolean isPackageInfo = CharOperation.equals(binaryBinding.sourceName(), TypeConstants.PACKAGE_INFO_NAME); boolean useTypeAnnotations = this.environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8; if (annotations != null) { long annotationBit = 0L; int nullness = NO_NULL_DEFAULT; int length = annotations.length; for (int i = 0; i < length; i++) { char[] annotationTypeName = annotations[i].getTypeName(); if (annotationTypeName[0] != Util.C_RESOLVED) continue; char[][] typeName = CharOperation.splitOn('/', annotationTypeName, 1, annotationTypeName.length-1); // cut of leading 'L' and trailing ';' if (CharOperation.equals(typeName, nonNullByDefaultAnnotationName)) { IBinaryElementValuePair[] elementValuePairs = annotations[i].getElementValuePairs(); if (!useTypeAnnotations) { if (elementValuePairs != null && elementValuePairs.length == 1) { Object value = elementValuePairs[0].getValue(); if (value instanceof BooleanConstant && !((BooleanConstant)value).booleanValue()) { // parameter is 'false': this means we cancel defaults from outer scopes: annotationBit = TagBits.AnnotationNullUnspecifiedByDefault; nullness = NULL_UNSPECIFIED_BY_DEFAULT; break; } } } else { // using NonNullByDefault we need to inspect the details of the value() attribute: nullness = getNonNullByDefaultValue(annotations[i]); if (nullness == NULL_UNSPECIFIED_BY_DEFAULT) { annotationBit = TagBits.AnnotationNullUnspecifiedByDefault; } else if (nullness != 0) { annotationBit = TagBits.AnnotationNonNullByDefault; } this.defaultNullness = nullness; break; } annotationBit = TagBits.AnnotationNonNullByDefault; nullness = NONNULL_BY_DEFAULT; break; } } if (annotationBit != 0L) { binaryBinding.tagBits |= annotationBit; if (isPackageInfo) packageBinding.defaultNullness = nullness; return; } } if (isPackageInfo) { // no default annotations found in package-info packageBinding.defaultNullness = Binding.NULL_UNSPECIFIED_BY_DEFAULT; return; } ReferenceBinding enclosingTypeBinding = binaryBinding.enclosingType; if (enclosingTypeBinding != null) { if (useTypeAnnotations) { binaryBinding.defaultNullness = enclosingTypeBinding.getNullDefault(); if (binaryBinding.defaultNullness != 0) { return; } } else { if ((enclosingTypeBinding.tagBits & TagBits.AnnotationNonNullByDefault) != 0) { binaryBinding.tagBits |= TagBits.AnnotationNonNullByDefault; return; } else if ((enclosingTypeBinding.tagBits & TagBits.AnnotationNullUnspecifiedByDefault) != 0) { binaryBinding.tagBits |= TagBits.AnnotationNullUnspecifiedByDefault; return; } } } // no annotation found on the type or its enclosing types // check the package-info for default annotation if not already done before if (packageBinding.defaultNullness == Binding.NO_NULL_DEFAULT && !isPackageInfo) { // this will scan the annotations in package-info ReferenceBinding packageInfo = packageBinding.getType(TypeConstants.PACKAGE_INFO_NAME); if (packageInfo == null) { packageBinding.defaultNullness = Binding.NULL_UNSPECIFIED_BY_DEFAULT; } } // no @NonNullByDefault at type level, check containing package: if (useTypeAnnotations) { binaryBinding.defaultNullness = packageBinding.defaultNullness; } else { switch (packageBinding.defaultNullness) { case Binding.NONNULL_BY_DEFAULT : binaryBinding.tagBits |= TagBits.AnnotationNonNullByDefault; break; case Binding.NULL_UNSPECIFIED_BY_DEFAULT : binaryBinding.tagBits |= TagBits.AnnotationNullUnspecifiedByDefault; break; } } }
Example 18
Source File: BindingKeyResolver.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 4 votes |
public void consumePackage(char[] pkgName) { this.compoundName = CharOperation.splitOn('/', pkgName); this.compilerBinding = new PackageBinding(this.compoundName, null, this.environment); }
Example 19
Source File: BinaryTypeBinding.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 4 votes |
/** * Standard constructor for creating binary type bindings from binary models (classfiles) * @param packageBinding * @param binaryType * @param environment * @param needFieldsAndMethods */ public BinaryTypeBinding(PackageBinding packageBinding, IBinaryType binaryType, LookupEnvironment environment, boolean needFieldsAndMethods) { this.prototype = this; this.compoundName = CharOperation.splitOn('/', binaryType.getName()); computeId(); this.tagBits |= TagBits.IsBinaryBinding; this.environment = environment; this.fPackage = packageBinding; this.fileName = binaryType.getFileName(); /* https://bugs.eclipse.org/bugs/show_bug.cgi?id=324850, even in a 1.4 project, we must internalize type variables and observe any parameterization of super class and/or super interfaces in order to be able to detect overriding in the presence of generics. */ char[] typeSignature = binaryType.getGenericSignature(); this.typeVariables = typeSignature != null && typeSignature.length > 0 && typeSignature[0] == Util.C_GENERIC_START ? null // is initialized in cachePartsFrom (called from LookupEnvironment.createBinaryTypeFrom())... must set to null so isGenericType() answers true : Binding.NO_TYPE_VARIABLES; this.sourceName = binaryType.getSourceName(); this.modifiers = binaryType.getModifiers(); if ((binaryType.getTagBits() & TagBits.HierarchyHasProblems) != 0) this.tagBits |= TagBits.HierarchyHasProblems; if (binaryType.isAnonymous()) { this.tagBits |= TagBits.AnonymousTypeMask; } else if (binaryType.isLocal()) { this.tagBits |= TagBits.LocalTypeMask; } else if (binaryType.isMember()) { this.tagBits |= TagBits.MemberTypeMask; } // need enclosing type to access type variables char[] enclosingTypeName = binaryType.getEnclosingTypeName(); if (enclosingTypeName != null) { // attempt to find the enclosing type if it exists in the cache (otherwise - resolve it when requested) this.enclosingType = environment.getTypeFromConstantPoolName(enclosingTypeName, 0, -1, true, null /* could not be missing */); // pretend parameterized to avoid raw this.tagBits |= TagBits.MemberTypeMask; // must be a member type not a top-level or local type this.tagBits |= TagBits.HasUnresolvedEnclosingType; if (enclosingType().isStrictfp()) this.modifiers |= ClassFileConstants.AccStrictfp; if (enclosingType().isDeprecated()) this.modifiers |= ExtraCompilerModifiers.AccDeprecatedImplicitly; } if (needFieldsAndMethods) cachePartsFrom(binaryType, true); }
Example 20
Source File: BinaryTypeBinding.java From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 | 4 votes |
private void scanFieldForNullAnnotation(IBinaryField field, FieldBinding fieldBinding, boolean isEnum) { if (!isPrototype()) throw new IllegalStateException(); if (this.environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8) { TypeBinding fieldType = fieldBinding.type; if (fieldType != null && !fieldType.isBaseType() && (fieldType.tagBits & TagBits.AnnotationNullMASK) == 0 && hasNonNullDefaultFor(DefaultLocationField, true)) { fieldBinding.type = this.environment.createAnnotatedType(fieldType, new AnnotationBinding[]{this.environment.getNonNullAnnotation()}); } return; // not using fieldBinding.tagBits when we have type annotations. } // global option is checked by caller char[][] nullableAnnotationName = this.environment.getNullableAnnotationName(); char[][] nonNullAnnotationName = this.environment.getNonNullAnnotationName(); if (nullableAnnotationName == null || nonNullAnnotationName == null) return; // not well-configured to use null annotations if (fieldBinding.type == null || fieldBinding.type.isBaseType()) return; // null annotations are only applied to reference types boolean explicitNullness = false; IBinaryAnnotation[] annotations = field.getAnnotations(); if (annotations != null) { for (int i = 0; i < annotations.length; i++) { char[] annotationTypeName = annotations[i].getTypeName(); if (annotationTypeName[0] != Util.C_RESOLVED) continue; char[][] typeName = CharOperation.splitOn('/', annotationTypeName, 1, annotationTypeName.length-1); // cut of leading 'L' and trailing ';' if (CharOperation.equals(typeName, nonNullAnnotationName)) { fieldBinding.tagBits |= TagBits.AnnotationNonNull; explicitNullness = true; break; } if (CharOperation.equals(typeName, nullableAnnotationName)) { fieldBinding.tagBits |= TagBits.AnnotationNullable; explicitNullness = true; break; } } } if (!explicitNullness && (this.tagBits & TagBits.AnnotationNonNullByDefault) != 0) { fieldBinding.tagBits |= TagBits.AnnotationNonNull; } if (isEnum) { if ((field.getModifiers() & ClassFileConstants.AccEnum) != 0) { fieldBinding.tagBits |= TagBits.AnnotationNonNull; } } }