private void sortMethods(List<MethodDefinition> declMethods) { declMethods.sort(Comparator.comparingInt(md -> md.isTypeInitializer() ? 0 : md.isConstructor() ? 1 : 2)); int start = -1, end = declMethods.size(); for (int i = 0; i < end; i++) { if(start == -1) { if(declMethods.get(i).isConstructor()) start = i; } else if(!declMethods.get(i).isConstructor()) { end = i; } } if(start >= 0) { sortConstructors(declMethods.subList(start, end)); } }
public void makeFieldsFrom(Frame frame) { if(frame == null) return; if(md.isTypeInitializer()) { cf.setStaticFinalFields(frame); } else if(md.isConstructor()) { cf.mergeConstructor(md, frame, this); } } }
@Override public Void visitMethodDeclaration(final MethodDeclaration node, final Void _) { final MethodDefinition oldInitializer = _currentInitializerMethod; final MethodDefinition oldConstructor = _currentConstructor; final MethodDefinition method = node.getUserData(Keys.METHOD_DEFINITION); if (method != null && method.isTypeInitializer()) { _currentConstructor = null; _currentInitializerMethod = method; } else { _currentConstructor = method != null && method.isConstructor() ? method : null; _currentInitializerMethod = null; } try { return super.visitMethodDeclaration(node, _); } finally { _currentConstructor = oldConstructor; _currentInitializerMethod = oldInitializer; } }
@Override public Void visitMethodDeclaration(final MethodDeclaration node, final Void p) { final MethodDefinition oldInitializer = _currentInitializerMethod; final MethodDefinition oldConstructor = _currentConstructor; final MethodDefinition method = node.getUserData(Keys.METHOD_DEFINITION); if (method != null && method.isTypeInitializer()) { _currentConstructor = null; _currentInitializerMethod = method; } else { _currentConstructor = method != null && method.isConstructor() ? method : null; _currentInitializerMethod = null; } try { return super.visitMethodDeclaration(node, p); } finally { _currentConstructor = oldConstructor; _currentInitializerMethod = oldInitializer; } }
@Override public Void visitMethodDeclaration(final MethodDeclaration node, final Void _) { final MethodDefinition oldInitializer = _currentInitializerMethod; final MethodDefinition oldConstructor = _currentConstructor; final MethodDefinition method = node.getUserData(Keys.METHOD_DEFINITION); if (method != null && method.isTypeInitializer()) { _currentConstructor = null; _currentInitializerMethod = method; } else { _currentConstructor = method != null && method.isConstructor() ? method : null; _currentInitializerMethod = null; } try { return super.visitMethodDeclaration(node, _); } finally { _currentConstructor = oldConstructor; _currentInitializerMethod = oldInitializer; } }
} else if(md.isTypeInitializer()) { cf.fields.forEach((mi, fd) -> { if(fd.isStatic())
@AstVisitor(nodes=AstNodes.EXPRESSIONS) public void visit(Expression node, MethodContext mc, MethodDefinition md) { if(node.getCode() == AstCode.InitObject) { MethodReference mr = (MethodReference) node.getOperand(); if(mr.getDeclaringType().getInternalName().equals("java/lang/String")) { int priority = 0; if(md.isTypeInitializer()) { // Static field initializer: only one object is created // not a big performance problem and probably intended Set<Expression> usages = Inf.BACKLINK.findUsages(node); if(usages.size() == 1 && usages.iterator().next().getCode() == AstCode.PutStatic) { priority = 15; node = usages.iterator().next(); } } if(mr.getSignature().equals("()V")) { mc.report("StringConstructorEmpty", priority, node); } else if(mr.getSignature().equals("(Ljava/lang/String;)V")) { mc.report("StringConstructor", priority, node); } } } else if(node.getCode() == AstCode.InvokeVirtual) { MethodReference mr = (MethodReference) node.getOperand(); if(mr.getDeclaringType().getInternalName().equals("java/lang/String") && mr.getName().equals("toString")) { mc.report("StringToString", 0, node.getArguments().get(0), Roles.CALLED_METHOD.create(mr)); } } } }
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); } } }
.getDeclaringType().getInternalName() + ";")); int priority = 0; if(md.isTypeInitializer()) {
@Override public Void visitMethodDeclaration(final MethodDeclaration node, final Void _) { final MethodDefinition method = node.getUserData(Keys.METHOD_DEFINITION); if (method != null) { if (AstBuilder.isMemberHidden(method, context)) { node.remove(); return null; } if (method.isTypeInitializer()) { if (node.getBody().getStatements().isEmpty()) { node.remove(); return null; } } } return super.visitMethodDeclaration(node, _); }
@Override public Void visitMethodDeclaration(final MethodDeclaration node, final Void p) { final MethodDefinition method = node.getUserData(Keys.METHOD_DEFINITION); if (method != null) { if (AstBuilder.isMemberHidden(method, context)) { node.remove(); return null; } if (method.isTypeInitializer()) { if (node.getBody().getStatements().isEmpty()) { node.remove(); return null; } } } return super.visitMethodDeclaration(node, p); }
@Override public Void visitMethodDeclaration(final MethodDeclaration node, final Void _) { final MethodDefinition method = node.getUserData(Keys.METHOD_DEFINITION); if (method != null) { if (AstBuilder.isMemberHidden(method, context)) { node.remove(); return null; } if (method.isTypeInitializer()) { if (node.getBody().getStatements().isEmpty()) { node.remove(); return null; } } } return super.visitMethodDeclaration(node, _); }
@AstVisitor(nodes=AstNodes.EXPRESSIONS) public void visitCall(MethodContext mc, Expression expr, MethodDefinition md, NodeChain nc, TypeDefinition td) { if(expr.getCode() == AstCode.InvokeVirtual) { Expression target = expr.getArguments().get(0); if(target.getCode() != AstCode.GetStatic) { target = Exprs.getChild(expr, 0); } if(target.getCode() == AstCode.GetStatic) { FieldReference fr = (FieldReference) target.getOperand(); if(md.isTypeInitializer() && td.isEquivalentTo(fr.getDeclaringType())) return; MethodReference mr = (MethodReference) expr.getOperand(); String methodName = mr.getName(); if(methodName.startsWith("get")) return; if(nc.isSynchronized() || Flags.testAny(md.getFlags(), Flags.SYNCHRONIZED)) return; if(!isNotThreadSafe(mr.getDeclaringType())) return; int priority = 0; if(Methods.isMain(md)) priority += 30; if(!methodName.startsWith("set") && !DANGEROUS_METHODS.contains(methodName)) priority += 20; mc.report("StaticNotThreadSafeFieldInvoke", priority, expr, Roles.FIELD.create(fr)); } } } }
private void writeMethodHeader(final MethodDefinition method, final ITextOutput output) { if (method.isTypeInitializer()) { output.writeKeyword("static"); return; if (!method.isTypeInitializer()) { DecompilerHelpers.writeType(output, method.getReturnType(), NameSyntax.TYPE_NAME); output.write(' ');
private void writeMethodHeader(final MethodDefinition method, final ITextOutput output) { if (method.isTypeInitializer()) { output.writeKeyword("static"); return; if (!method.isTypeInitializer()) { DecompilerHelpers.writeType(output, method.getReturnType(), NameSyntax.TYPE_NAME); output.write(' ');
currentMethod != null && currentType.isEnum() && currentMethod.isTypeInitializer()) {
currentMethod != null && currentType.isEnum() && currentMethod.isTypeInitializer()) {
currentMethod != null && currentType.isEnum() && currentMethod.isTypeInitializer()) {
final MethodDefinition methodDefinition = staticInitializer.getUserData(Keys.METHOD_DEFINITION); if (methodDefinition == null || !methodDefinition.isTypeInitializer()) { return;
final MethodDefinition methodDefinition = staticInitializer.getUserData(Keys.METHOD_DEFINITION); if (methodDefinition == null || !methodDefinition.isTypeInitializer()) { return;