/******************************************************************************* * Copyright (c) 2008, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.tools.internal; import java.lang.reflect.*; import java.util.*; public class EmbedMetaData extends JNIGenerator { TreeMap<Integer, String> inserts; @Override public void generate(JNIClass clazz) { inserts = new TreeMap<>(); String data = ((AbstractItem)clazz).flatten(); if (data != null && data.length() != 0) { String doc = "/** @jniclass " + data + " */" + delimiter; inserts.put(Integer.valueOf(((ASTClass)clazz).start), doc); } JNIField[] fields = clazz.getDeclaredFields(); generate(fields); JNIMethod[] methods = clazz.getDeclaredMethods(); generate(methods); if (inserts.size() == 0) return; String sourcePath = ((ASTClass)clazz).sourcePath; String source = JNIGenerator.loadFile(sourcePath); Set<Integer> set = inserts.keySet(); List<Integer> keys = new ArrayList<>(); keys.addAll(set); Collections.reverse(keys); StringBuffer buffer = new StringBuffer(source); for (Iterator<Integer> iterator = keys.iterator(); iterator.hasNext();) { Integer index = iterator.next(); String doc = inserts.get(index); buffer.insert(index.intValue(), doc); } try { output(buffer.toString().getBytes(), sourcePath); } catch (Exception e) { e.printStackTrace(); } inserts = null; } public void generate(JNIField[] fields) { for (int i = 0; i < fields.length; i++) { JNIField field = fields[i]; int mods = field.getModifiers(); if ((mods & Modifier.PUBLIC) == 0) continue; if ((mods & Modifier.FINAL) != 0) continue; if ((mods & Modifier.STATIC) != 0) continue; generate(field); } } public void generate(JNIField field) { //wrap cast with parentheses field.setCast(field.getCast()); String data = ((AbstractItem)field).flatten(); if (data != null && data.length() != 0) { String doc = "/** @field " + data + " */" + delimiter + "\t"; inserts.put(Integer.valueOf(((ASTField)field).start), doc); } } public void generate(JNIMethod[] methods) { for (int i = 0; i < methods.length; i++) { JNIMethod method = methods[i]; if ((method.getModifiers() & Modifier.NATIVE) == 0) continue; generate(method); } } public void generate(JNIMethod method) { List<String> tags = new ArrayList<>(); String data = ((AbstractItem)method).flatten(); if (data != null && data.length() != 0) { tags.add("@method " + data); } JNIParameter[] params = method.getParameters(); for (int i = 0; i < params.length; i++) { ASTParameter param = (ASTParameter)params[i]; //wrap cast with parentheses param.setCast(param.getCast()); data = ((AbstractItem)param).flatten(); if (data != null && data.length() != 0) { tags.add("@param " + param.getName() + " " + data); } } if (tags.size() == 0) return; if (tags.size() == 1) { String doc = "/** " + tags.get(0) + " */" + delimiter; inserts.put(Integer.valueOf(((ASTMethod)method).start), doc); } else { StringBuffer buffer = new StringBuffer(); buffer.append("/**"); buffer.append(delimiter); for (Iterator<String> iterator = tags.iterator(); iterator.hasNext();) { String tag = iterator.next(); buffer.append(" * "); buffer.append(tag); buffer.append(delimiter); } buffer.append(" */"); buffer.append(delimiter); inserts.put(Integer.valueOf(((ASTMethod)method).start), buffer.toString()); } } }