@Override public JDeclaredType translate(JDeclaredType type) { if (!type.isExternal()) { return type; } String typeName = type.getName(); JDeclaredType newType = searchForTypeByBinary(typeName); if (newType == null) { assert errorsFound; return type; } assert !newType.isExternal(); return newType; } @Override
private void mapApi(JDeclaredType type) { assert !type.isExternal(); for (JField field : type.getFields()) { String sig = type.getName() + '.' + field.getSignature();
@Override public JMethod translate(JMethod method) { if (!method.isExternal()) { return method; } JDeclaredType enclosingType = method.getEnclosingType(); String sig = enclosingType.getName() + '.' + method.getSignature(); JMethod newMethod = methodMap.get(sig); if (newMethod != null) { return newMethod; } enclosingType = translate(enclosingType); if (enclosingType.isExternal()) { assert errorsFound; return method; } mapApi(enclosingType); // Now the method should be there. method = methodMap.get(sig); if (method == null) { // TODO: error logging throw new NoSuchMethodError(sig); } assert !method.isExternal(); return method; } @Override
private void instantiate(JDeclaredType type) { if (type.isExternal()) { assert errorsFound; return;
private void resolveType(JDeclaredType type) { assert !type.isExternal(); if (type instanceof JClassType && type.getSuperClass() != null) { ((JClassType) type).setSuperClass(translate(type.getSuperClass())); } List<JInterfaceType> resolvedInterfaces = new ArrayList<JInterfaceType>(); for (JInterfaceType intf : type.getImplements()) { resolvedInterfaces.add((JInterfaceType) translate(intf)); } List<JNode> resolvedRescues = new ArrayList<JNode>(); for (JNode node : type.getArtificialRescues()) { if (node instanceof JType) { node = translate((JType) node); } else if (node instanceof JField) { node = translate((JField) node); } else if (node instanceof JMethod) { node = translate((JMethod) node); } else { assert false : "Unknown artificial rescue node."; } resolvedRescues.add(node); } type.resolve(resolvedInterfaces, resolvedRescues); }
@Override public void endVisit(JFieldRef x, Context ctx) { JField field = translate(x.getField()); flowInto(field); x.resolve(field); // Should not have an overridden type at this point. assert x.getType() == x.getField().getType(); assert !x.getEnclosingType().isExternal(); }
@Override public JField translate(JField field) { if (!field.isExternal()) { return field; } JDeclaredType enclosingType = field.getEnclosingType(); String sig = enclosingType.getName() + '.' + field.getSignature(); JField newField = fieldMap.get(sig); if (newField != null) { return newField; } enclosingType = translate(enclosingType); if (enclosingType.isExternal()) { assert errorsFound; return field; } mapApi(enclosingType); // Now the field should be there. field = fieldMap.get(sig); if (field == null) { // TODO: error logging throw new NoSuchFieldError(sig); } assert !field.isExternal(); return field; } @Override
@Override public void endVisit(JNewInstance x, Context ctx) { flowInto(x.getTarget()); assert !x.getEnclosingType().isExternal() : "External type, "+x.getEnclosingType()+", set to enclose "+x.getTarget() +" for "+x.getTarget().getEnclosingType().toSource(); }
protected boolean visit(TypeDeclaration x) { JDeclaredType type = (JDeclaredType) typeMap.get(x.binding); assert !type.isExternal(); classStack.push(curClass); curClass = new ClassInfo(type, x);
private void staticInitialize(JDeclaredType type) { if (type.isExternal()) { assert errorsFound; return; } JMethod clinit = type.getMethods().get(0); if (!liveFieldsAndMethods.contains(clinit)) { flowInto(clinit); if (type.getSuperClass() != null) { staticInitialize(type.getSuperClass()); } for (JNode node : type.getArtificialRescues()) { if (node instanceof JType) { if (node instanceof JDeclaredType) { instantiate((JDeclaredType) node); } } else if (node instanceof JField) { JField field = (JField) node; flowInto(field); if (!field.isFinal()) { field.setVolatile(); } } else if (node instanceof JMethod) { flowInto((JMethod) node); } else { assert false : "Unknown artificial rescue node."; } } } }
Set<String> alreadyNamedVariables = new HashSet<String>(); JDeclaredType enclosingType = (JDeclaredType) typeMap.get(declaringClass); assert !enclosingType.isExternal(); JMethod method; boolean isNested = isNested(declaringClass);