private String createUniqueStrForReference(Object reference) { String uniqueStr = null; if (reference instanceof TypeReference) { TypeReference type = (TypeReference) reference; String pathAndTypeStr = getPathAndTypeStr(type); if (pathAndTypeStr != null) { uniqueStr = "type|" + pathAndTypeStr; } } else if (reference instanceof MethodReference) { MethodReference method = (MethodReference) reference; String pathAndTypeStr = getPathAndTypeStr(method.getDeclaringType()); if (pathAndTypeStr != null) { uniqueStr = "method|" + pathAndTypeStr + "|" + method.getName() + "|" + method.getErasedSignature(); } } else if (reference instanceof FieldReference) { FieldReference field = (FieldReference) reference; String pathAndTypeStr = getPathAndTypeStr(field.getDeclaringType()); if (pathAndTypeStr != null) { uniqueStr = "field|" + pathAndTypeStr + "|" + field.getName(); } } return uniqueStr; }
@Override public boolean isEquivalentTo(final MemberReference member) { if (super.isEquivalentTo(member)) { return true; } if (member instanceof FieldReference) { final FieldReference field = (FieldReference) member; return StringUtilities.equals(field.getName(), this.getName()) && MetadataResolver.areEquivalent(field.getDeclaringType(), this.getDeclaringType()); } return false; }
@Override public boolean isEquivalentTo(final MemberReference member) { if (super.isEquivalentTo(member)) { return true; } if (member instanceof FieldReference) { final FieldReference field = (FieldReference) member; return StringUtilities.equals(field.getName(), this.getName()) && MetadataResolver.areEquivalent(field.getDeclaringType(), this.getDeclaringType()); } return false; }
private static boolean isAssertionStatusCheck(Expression expr) { if(expr.getCode() != AstCode.LogicalNot) return false; Expression arg = expr.getArguments().get(0); if(arg.getCode() != AstCode.GetStatic) return false; FieldReference fr = (FieldReference) arg.getOperand(); return fr.getName().startsWith("$assertions"); }
@Override public boolean isEquivalentTo(final MemberReference member) { if (super.isEquivalentTo(member)) { return true; } if (member instanceof FieldReference) { final FieldReference field = (FieldReference) member; return StringUtilities.equals(field.getName(), this.getName()) && MetadataResolver.areEquivalent(field.getDeclaringType(), this.getDeclaringType()); } return false; }
public int getFlags(FieldReference fr) { TypeFieldStats fs = get(fr.getDeclaringType()); return fs == null ? UNRESOLVED : fs.getFlags(fr.getName()); }
void link(MethodDefinition src, FieldReference fr, boolean isStatic, boolean write, boolean hadNull) { if(fieldRecords == null) return; int prevStatus = fieldRecords.getOrDefault(fr.getName(), 0); int curStatus = prevStatus; if(src.getDeclaringType().isEquivalentTo(fr.getDeclaringType())) { if(write && (src.isConstructor() && !isStatic || src.isTypeInitializer() && isStatic)) { curStatus |= WRITE_CONSTRUCTOR; } else { curStatus |= write ? WRITE_CLASS : READ_CLASS; } } else if(src.getDeclaringType().getPackageName().equals(fr.getDeclaringType().getPackageName())) { curStatus |= write ? WRITE_PACKAGE : READ_PACKAGE; } else { curStatus |= write ? WRITE_OUTSIDE : READ_OUTSIDE; } if(write && !hadNull) { curStatus |= WRITE_NONNULL; } if(prevStatus != curStatus) { fieldRecords.put(fr.getName(), curStatus); } } }
private void removeQualifiersWherePossible() { for (final AstNode candidate : _removeQualifierCandidates) { if (candidate instanceof MemberReferenceExpression) { final FieldReference field = (FieldReference) candidate.getUserData(Keys.MEMBER_REFERENCE); if (field != null) { final IdentifierExpression identifier = new IdentifierExpression(((Expression) candidate).getOffset(), field.getName()); identifier.copyUserDataFrom(candidate); candidate.replaceWith(identifier); } } } }
static FieldDefinition getField(final List<FieldDefinition> candidates, final FieldReference reference) { for (int i = 0, n = candidates.size(); i < n; i++) { final FieldDefinition candidate = candidates.get(i); if (StringComparator.Ordinal.equals(candidate.getName(), reference.getName())) { final TypeReference referenceType = reference.getFieldType(); final TypeReference candidateType = candidate.getFieldType(); if (areEquivalent(candidateType, referenceType)) { return candidate; } final TypeReference rawCandidateType = MetadataHelper.eraseRecursive(candidateType); final TypeReference rawReferenceType = MetadataHelper.eraseRecursive(referenceType); if ((rawCandidateType != candidateType || rawReferenceType != referenceType) && areEquivalent(rawCandidateType, rawReferenceType)) { return candidate; } } } return null; }
public static void writeField(final ITextOutput writer, final FieldReference field) { VerifyArgument.notNull(field, "field"); VerifyArgument.notNull(writer, "writer"); final Stack<TypeReference> typeStack = new Stack<>(); formatType(writer, field.getDeclaringType(), NameSyntax.DESCRIPTOR, false, typeStack); writer.writeDelimiter("."); writer.writeReference(field.getName(), field); writer.writeDelimiter(":"); formatType(writer, field.getFieldType(), NameSyntax.SIGNATURE, false, typeStack); }
static FieldDefinition getField(final List<FieldDefinition> candidates, final FieldReference reference) { for (int i = 0, n = candidates.size(); i < n; i++) { final FieldDefinition candidate = candidates.get(i); if (StringComparator.Ordinal.equals(candidate.getName(), reference.getName())) { final TypeReference referenceType = reference.getFieldType(); final TypeReference candidateType = candidate.getFieldType(); if (candidateType.isGenericParameter() && !referenceType.isGenericParameter()) { if (areEquivalent(MetadataHelper.getUpperBound(candidateType), referenceType)) { return candidate; } } else { if (areEquivalent(candidateType, referenceType)) { return candidate; } } } } return null; }
public static void writeField(final ITextOutput writer, final FieldReference field) { VerifyArgument.notNull(field, "field"); VerifyArgument.notNull(writer, "writer"); final Stack<TypeReference> typeStack = new Stack<>(); formatType(writer, field.getDeclaringType(), NameSyntax.DESCRIPTOR, false, typeStack); writer.writeDelimiter("."); writer.writeReference(field.getName(), field); writer.writeDelimiter(":"); formatType(writer, field.getFieldType(), NameSyntax.SIGNATURE, false, typeStack); }
public static void writeField(final ITextOutput writer, final FieldReference field) { VerifyArgument.notNull(field, "field"); VerifyArgument.notNull(writer, "writer"); final Stack<TypeReference> typeStack = new Stack<>(); formatType(writer, field.getDeclaringType(), NameSyntax.DESCRIPTOR, false, typeStack); writer.writeDelimiter("."); writer.writeReference(field.getName(), field); writer.writeDelimiter(":"); formatType(writer, field.getFieldType(), NameSyntax.SIGNATURE, false, typeStack); }
public FieldReferenceEntry getFieldReference(final FieldReference field) { final TypeInfoEntry typeInfo = getTypeInfo(field.getDeclaringType()); final NameAndTypeDescriptorEntry nameAndDescriptor = getNameAndTypeDescriptor( field.getName(), field.getErasedSignature() ); _lookupKey.set(Tag.FieldReference, typeInfo.index, nameAndDescriptor.index); Entry entry = _entryMap.get(_lookupKey); if (entry == null) { if (isFrozen()) { return null; } entry = new FieldReferenceEntry(this, typeInfo.index, nameAndDescriptor.index); } _lookupKey.clear(); return (FieldReferenceEntry) entry; }
private void checkRegexp(MethodContext mc, Expression regexExpr, int flags) { if((flags & Pattern.LITERAL) == 0) { if(regexExpr.getCode() == AstCode.GetStatic) { FieldReference fr = (FieldReference) regexExpr.getOperand(); if(fr.getName().equals("separator") && fr.getDeclaringType().getInternalName().equals("java/io/File")) { mc.report("RegexFileSeparator", 0, regexExpr); } } else if(regexExpr.getCode() == AstCode.InvokeVirtual) { MethodReference mr = (MethodReference)regexExpr.getOperand(); if(mr.getName().equals("getSeparator") && mr.getDeclaringType().getInternalName().equals("java/nio/file/FileSystem")) { mc.report("RegexFileSeparator", 0, regexExpr); } } } Object regexObj = Nodes.getConstant(regexExpr); if(!(regexObj instanceof String)) { return; } String regex = (String)regexObj; try { Pattern.compile(regex, flags); } catch (PatternSyntaxException e) { mc.report("RegexBadSyntax", 0, regexExpr, Roles.REGEXP.create(regex), ERROR_MESSAGE.create(e.getMessage())); } } }
static FieldDefinition getField(final List<FieldDefinition> candidates, final FieldReference reference) { for (int i = 0, n = candidates.size(); i < n; i++) { final FieldDefinition candidate = candidates.get(i); if (StringComparator.Ordinal.equals(candidate.getName(), reference.getName())) { final TypeReference referenceType = reference.getFieldType(); final TypeReference candidateType = candidate.getFieldType(); if (candidateType.isGenericParameter() && !referenceType.isGenericParameter()) { if (areEquivalent(MetadataHelper.getUpperBound(candidateType), referenceType)) { return candidate; } } else { if (areEquivalent(candidateType, referenceType)) { return candidate; } } } } return null; }
public FieldReferenceEntry getFieldReference(final FieldReference field) { final TypeInfoEntry typeInfo = getTypeInfo(field.getDeclaringType()); final NameAndTypeDescriptorEntry nameAndDescriptor = getNameAndTypeDescriptor( field.getName(), field.getErasedSignature() ); _lookupKey.set(Tag.FieldReference, typeInfo.index, nameAndDescriptor.index); Entry entry = _entryMap.get(_lookupKey); if (entry == null) { if (isFrozen()) { return null; } entry = new FieldReferenceEntry(this, typeInfo.index, nameAndDescriptor.index); } _lookupKey.clear(); return (FieldReferenceEntry) entry; }
public FieldReferenceEntry getFieldReference(final FieldReference field) { final TypeInfoEntry typeInfo = getTypeInfo(field.getDeclaringType()); final NameAndTypeDescriptorEntry nameAndDescriptor = getNameAndTypeDescriptor( field.getName(), field.getErasedSignature() ); _lookupKey.set(Tag.FieldReference, typeInfo.index, nameAndDescriptor.index); Entry entry = _entryMap.get(_lookupKey); if (entry == null) { if (isFrozen()) { return null; } entry = new FieldReferenceEntry(this, typeInfo.index, nameAndDescriptor.index); } _lookupKey.clear(); return (FieldReferenceEntry) entry; }
@Override public void run(final AstNode compilationUnit) { super.run(compilationUnit); for (final AstNode candidate : _addQualifierCandidates) { if (candidate instanceof SimpleType) { final SimpleType type = (SimpleType) candidate; TypeReference referencedType = type.getUserData(Keys.ANONYMOUS_BASE_TYPE_REFERENCE); if (referencedType == null) { referencedType = type.getUserData(Keys.TYPE_REFERENCE); } final String s = qualifyReference(candidate, referencedType); if (!StringUtilities.isNullOrEmpty(s)) { type.setIdentifier(s); } } } for (final AstNode candidate : _removeQualifierCandidates) { if (candidate instanceof MemberReferenceExpression) { final FieldReference field = (FieldReference) candidate.getUserData(Keys.MEMBER_REFERENCE); if (field != null) { final IdentifierExpression identifier = new IdentifierExpression(((Expression) candidate).getOffset(), field.getName()); identifier.copyUserDataFrom(candidate); candidate.replaceWith(identifier); } } } }
@Override public void run(final AstNode compilationUnit) { super.run(compilationUnit); for (final AstNode candidate : _addQualifierCandidates) { if (candidate instanceof SimpleType) { final SimpleType type = (SimpleType) candidate; TypeReference referencedType = type.getUserData(Keys.ANONYMOUS_BASE_TYPE_REFERENCE); if (referencedType == null) { referencedType = type.getUserData(Keys.TYPE_REFERENCE); } final String s = qualifyReference(candidate, referencedType); if (!StringUtilities.isNullOrEmpty(s)) { type.setIdentifier(s); } } } for (final AstNode candidate : _removeQualifierCandidates) { if (candidate instanceof MemberReferenceExpression) { final FieldReference field = (FieldReference) candidate.getUserData(Keys.MEMBER_REFERENCE); if (field != null) { final IdentifierExpression identifier = new IdentifierExpression(((Expression) candidate).getOffset(), field.getName()); identifier.copyUserDataFrom(candidate); candidate.replaceWith(identifier); } } } }