private void calculateLayout(ResourceTypeDescriptor typeDescriptor, Map<MethodReference, PropertyDescriptor> layout) { Map<String, Integer> propertyIndexes = new HashMap<>(); List<String> propertyNames = new ArrayList<>(typeDescriptor.getPropertyTypes().keySet()); for (int i = 0; i < propertyNames.size(); ++i) { propertyIndexes.put(propertyNames.get(i), i); } Method[] methods = new Method[typeDescriptor.getPropertyTypes().size()]; for (Method method : typeDescriptor.getMethods().keySet()) { ResourceMethodDescriptor methodDescriptor = typeDescriptor.getMethods().get(method); if (methodDescriptor.getType() == ResourceAccessorType.SETTER) { continue; } String propertyName = methodDescriptor.getPropertyName(); int index = propertyIndexes.get(propertyName); methods[index] = method; } int currentOffset = 0; for (Method method : methods) { MethodReference methodRef = MethodReference.parse(method); ValueType propertyType = methodRef.getReturnType(); int size = WasmClassGenerator.getTypeSize(propertyType); currentOffset = BinaryWriter.align(currentOffset, size); PropertyDescriptor propertyDescriptor = new PropertyDescriptor(); propertyDescriptor.offset = currentOffset; propertyDescriptor.type = propertyType; layout.put(methodRef, propertyDescriptor); currentOffset += size; } }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { ClassReader cls = context.getClassSource().get(methodRef.getClassName()); MethodReader method = cls.getMethod(methodRef.getDescriptor()); AnnotationReader refAnnot = method.getAnnotations().get(MetadataProviderRef.class.getName()); methodRef = MethodReference.parse(refAnnot.getValue("value").getString()); MetadataGenerator generator = MetadataUtils.createMetadataGenerator(context.getClassLoader(), method, new CallLocation(methodRef), context.getDiagnostics()); if (generator == null) { return; } DefaultMetadataGeneratorContext metadataContext = new DefaultMetadataGeneratorContext(context.getClassSource(), context.getClassLoader(), context.getProperties(), context); // Generate resource loader Resource resource = generator.generateMetadata(metadataContext, methodRef); writer.append("return "); ResourceWriterHelper.write(writer, resource); writer.append(';').softNewLine(); } }
public MethodReference parseReferenceCached(String value) { MethodReference result = referenceParseCache.get(value); if (result == null) { result = getCached(MethodReference.parse(value)); referenceParseCache.put(value, result); } return result; }
private void calculateLayout(ResourceTypeDescriptor typeDescriptor, Map<MethodReference, PropertyDescriptor> layout) { Map<String, Integer> propertyIndexes = new HashMap<>(); List<String> propertyNames = new ArrayList<>(typeDescriptor.getPropertyTypes().keySet()); for (int i = 0; i < propertyNames.size(); ++i) { propertyIndexes.put(propertyNames.get(i), i); } Method[] methods = new Method[typeDescriptor.getPropertyTypes().size()]; for (Method method : typeDescriptor.getMethods().keySet()) { ResourceMethodDescriptor methodDescriptor = typeDescriptor.getMethods().get(method); if (methodDescriptor.getType() == ResourceAccessorType.SETTER) { continue; } String propertyName = methodDescriptor.getPropertyName(); int index = propertyIndexes.get(propertyName); methods[index] = method; } int currentOffset = 0; for (Method method : methods) { MethodReference methodRef = MethodReference.parse(method); ValueType propertyType = methodRef.getReturnType(); int size = WasmClassGenerator.getTypeSize(propertyType); currentOffset = BinaryWriter.align(currentOffset, size); PropertyDescriptor propertyDescriptor = new PropertyDescriptor(); propertyDescriptor.offset = currentOffset; propertyDescriptor.type = propertyType; layout.put(methodRef, propertyDescriptor); currentOffset += size; } }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { ClassReader cls = context.getClassSource().get(methodRef.getClassName()); MethodReader method = cls.getMethod(methodRef.getDescriptor()); AnnotationReader refAnnot = method.getAnnotations().get(MetadataProviderRef.class.getName()); methodRef = MethodReference.parse(refAnnot.getValue("value").getString()); MetadataGenerator generator = MetadataUtils.createMetadataGenerator(context.getClassLoader(), method, new CallLocation(methodRef), context.getDiagnostics()); if (generator == null) { return; } DefaultMetadataGeneratorContext metadataContext = new DefaultMetadataGeneratorContext(context.getClassSource(), context.getClassLoader(), context.getProperties(), context); // Generate resource loader Resource resource = generator.generateMetadata(metadataContext, methodRef); writer.append("return "); ResourceWriterHelper.write(writer, resource); writer.append(';').softNewLine(); } }