java-gobject-introspection r43 - in trunk: src/org/gnome/gir/compiler src/org/gnome/gir/gobject src/org/gnome/gir/repository stub-examples



Author: walters
Date: Mon Sep  8 22:24:32 2008
New Revision: 43
URL: http://svn.gnome.org/viewvc/java-gobject-introspection?rev=43&view=rev

Log:
Generate property getters and setters.


Modified:
   trunk/src/org/gnome/gir/compiler/CodeFactory.java
   trunk/src/org/gnome/gir/gobject/GObject.java
   trunk/src/org/gnome/gir/gobject/GParamFlags.java
   trunk/src/org/gnome/gir/repository/BaseInfo.java
   trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
   trunk/src/org/gnome/gir/repository/InterfaceInfo.java
   trunk/src/org/gnome/gir/repository/ObjectInfo.java
   trunk/src/org/gnome/gir/repository/PropertyInfo.java
   trunk/stub-examples/Test.java

Modified: trunk/src/org/gnome/gir/compiler/CodeFactory.java
==============================================================================
--- trunk/src/org/gnome/gir/compiler/CodeFactory.java	(original)
+++ trunk/src/org/gnome/gir/compiler/CodeFactory.java	Mon Sep  8 22:24:32 2008
@@ -44,6 +44,7 @@
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -61,6 +62,7 @@
 import org.gnome.gir.gobject.GErrorException;
 import org.gnome.gir.gobject.GList;
 import org.gnome.gir.gobject.GObjectAPI;
+import org.gnome.gir.gobject.GParamFlags;
 import org.gnome.gir.gobject.GSList;
 import org.gnome.gir.gobject.GType;
 import org.gnome.gir.repository.ArgInfo;
@@ -76,6 +78,7 @@
 import org.gnome.gir.repository.FunctionInfoFlags;
 import org.gnome.gir.repository.InterfaceInfo;
 import org.gnome.gir.repository.ObjectInfo;
+import org.gnome.gir.repository.PropertyInfo;
 import org.gnome.gir.repository.RegisteredTypeInfo;
 import org.gnome.gir.repository.Repository;
 import org.gnome.gir.repository.SignalInfo;
@@ -588,6 +591,8 @@
 	}	
 	
 	private String ucaseToCamel(String ucase) {
+		// So this function works on signal/property names too
+		ucase = ucase.replace('-', '_');
 		String[] components = ucase.split("_");
 		for (int i = 1; i < components.length; i++) {
 			if (components[i].length() > 0)
@@ -869,6 +874,71 @@
 		mv.visitMaxs(2, 2);
 		mv.visitEnd();	
 	}
+	
+	private void writeProperties(ClassCompilation compilation, PropertyInfo[] props, Set<String> sigs) {
+		for (PropertyInfo prop : props) {
+			Type type = toJava(prop.getType());
+			if (type == null)
+				continue;
+			int propFlags = prop.getFlags();
+			if ((propFlags & GParamFlags.READABLE) != 0) {
+				String getterName = "get" + ucaseToPascal(prop.getName());
+				String descriptor = Type.getMethodDescriptor(type, new Type[] {});
+				String signature = getUniqueSignature(getterName, type, Arrays.asList(new Type[] {}));
+				if (sigs.contains(signature)) {
+					logger.warning("Getter " + getterName + " duplicates signature: " 
+								+ signature);
+					continue;
+				}
+				sigs.add(signature);				
+				MethodVisitor mv = compilation.writer.visitMethod(ACC_PUBLIC, getterName, 
+					descriptor, null, null);
+				mv.visitCode();
+				Label l0 = new Label();
+				mv.visitLabel(l0);
+				mv.visitVarInsn(ALOAD, 0);
+				mv.visitLdcInsn(prop.getName());
+				mv.visitMethodInsn(INVOKEVIRTUAL, compilation.internalName, "get", 
+						"(Ljava/lang/String;)" + type.getDescriptor());
+				mv.visitTypeInsn(CHECKCAST, type.getInternalName());
+				mv.visitInsn(ARETURN);
+				Label l1 = new Label();
+				mv.visitLabel(l1);
+				mv.visitLocalVariable("this", "L" + compilation.internalName +";", null, l0, l1, 0);
+				mv.visitMaxs(2, 1);				
+				mv.visitEnd();
+			}
+			if ((propFlags & GParamFlags.WRITABLE) != 0 &&
+					(propFlags & GParamFlags.CONSTRUCT_ONLY) == 0) {
+				String setterName = "set" + ucaseToPascal(prop.getName());
+				String descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { type });
+				String signature = getUniqueSignature(setterName, Type.VOID_TYPE, Arrays.asList(new Type[] { type }));
+				if (sigs.contains(signature)) {
+					logger.warning("Setter " + setterName + " duplicates signature: " 
+								+ signature);
+					continue;
+				}
+				sigs.add(signature);
+				MethodVisitor mv = compilation.writer.visitMethod(ACC_PUBLIC, setterName, 
+					descriptor, null, null);
+				mv.visitCode();
+				Label l0 = new Label();
+				mv.visitLabel(l0);
+				mv.visitVarInsn(ALOAD, 0);
+				mv.visitLdcInsn(prop.getName());
+				mv.visitVarInsn(ALOAD, 1);
+				mv.visitMethodInsn(INVOKEVIRTUAL, compilation.internalName, "set", 
+						"(Ljava/lang/String;Ljava/lang/Object;)" + type.getDescriptor());
+				mv.visitInsn(RETURN);
+				Label l1 = new Label();
+				mv.visitLabel(l1);
+				mv.visitLocalVariable("this", "L" + compilation.internalName + ";", null, l0, l1, 0);
+				mv.visitLocalVariable("arg", type.getDescriptor(), null, l0, l1, 1);				
+				mv.visitMaxs(3, 2);				
+				mv.visitEnd();
+			};
+		}		
+	}
 		
 	private void compile(ObjectInfo info) {
 		StubClassCompilation compilation = getCompilation(info);
@@ -982,8 +1052,12 @@
 				// Insert the object as first parameter
 				ctx.argTypes.add(0, typeFromInfo(iface));				
 				compileSignal(compilation, ctx, sig, false, true);
-			}			
+			}
+			writeProperties(compilation, iface.getProperties(), sigs);
 		}
+		
+		writeProperties(compilation, info.getProperties(), sigs);
+		
 		compilation.close();	
 	}
 	
@@ -1065,7 +1139,18 @@
 			return null;
 		}	
 		return new CallableCompilationContext(returnType, argInfos, args, false);
-	}	
+	}
+	
+	private String getUniqueSignature(String name, Type returnType, List<Type> args) {
+		StringBuilder builder = new StringBuilder(name);
+		builder.append("(");
+		for (Type arg: args)
+			builder.append(arg.getDescriptor());
+		builder.append(")");
+		builder.append(returnType.getDescriptor());
+		String signature = builder.toString();
+		return signature;
+	}
 	
 	private CallableCompilationContext tryCompileCallable(FunctionInfo fi, Set<String> seenSignatures) {
 		Type returnType = getCallableReturn(fi);
@@ -1082,13 +1167,8 @@
 			logger.warning("Skipping function with unhandled arg signature: " + fi.getSymbol());
 			return null;
 		}
-		StringBuilder builder = new StringBuilder(fi.getName());
-		builder.append("(");
-		for (Type arg: args)
-			builder.append(arg.getDescriptor());
-		builder.append(")");
-		builder.append(returnType.getDescriptor());
-		String signature = builder.toString();
+		String name = ucaseToCamel(fi.getName());
+		String signature = getUniqueSignature(name, returnType, args);
 		if (seenSignatures.contains(signature)) {
 			logger.warning("Function " + fi.getSymbol() + " duplicates signature: " 
 						+ signature);

Modified: trunk/src/org/gnome/gir/gobject/GObject.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GObject.java	(original)
+++ trunk/src/org/gnome/gir/gobject/GObject.java	Mon Sep  8 22:24:32 2008
@@ -76,6 +76,13 @@
     private Map<Long,Callback> signalHandlers = new HashMap<Long, Callback>();
     
     /**
+     * A tagging interface to mark classes which are GObject property bags.
+     * @author walters
+     *
+     */
+    public static interface GProperties {};
+    
+    /**
      * A tagging interface used in the code generator - if a method returns an interface,
      * we have it extend this interface so we know it's a GObject. 
      * @author walters

Modified: trunk/src/org/gnome/gir/gobject/GParamFlags.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GParamFlags.java	(original)
+++ trunk/src/org/gnome/gir/gobject/GParamFlags.java	Mon Sep  8 22:24:32 2008
@@ -1,16 +1,13 @@
 package org.gnome.gir.gobject;
 
-public enum GParamFlags implements NativeEnum {
-	READABLE,
-	WRITABLE,
-	CONSTRUCT,
-	CONSTRUCT_ONLY,
-	LAX_VALIDATION,
-	STATIC_NAME,
-	STATIC_NICK,
-	STATIC_BLURB;
+public interface GParamFlags {
+	public static final int READABLE = 1 << 0;
+	public static final int WRITABLE = 1 << 1;
+	public static final int CONSTRUCT = 1 << 2;
+	public static final int CONSTRUCT_ONLY = 1 << 3;
+	public static final int LAX_VALIDATION = 1 << 4;
+	public static final int STATIC_NAME = 1 << 5;
+	public static final int STATIC_NICK = 1 << 6;
+	public static final int STATIC_BLURB = 1 << 7;
 	
-	public int getNative() {
-		return 1 << this.ordinal();
-	};
 }

Modified: trunk/src/org/gnome/gir/repository/BaseInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/BaseInfo.java	(original)
+++ trunk/src/org/gnome/gir/repository/BaseInfo.java	Mon Sep  8 22:24:32 2008
@@ -37,6 +37,8 @@
 			return new InterfaceInfo(init);
 		if (itype == InfoType.CALLBACK.ordinal())
 			return new CallbackInfo(init);
+		if (itype == InfoType.PROPERTY.ordinal())
+			return new PropertyInfo(init);		
 		return new BaseInfo(new Initializer(ptr));
 	}
 

Modified: trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java	(original)
+++ trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java	Mon Sep  8 22:24:32 2008
@@ -27,7 +27,6 @@
 
 import java.util.HashMap;
 
-import org.gnome.gir.gobject.GParamFlags;
 import org.gnome.gir.gobject.GType;
 import org.gnome.gir.gobject.GTypeMapper;
 import org.gnome.gir.gobject.ZeroTerminatedArray;
@@ -191,7 +190,7 @@
 	ConstantInfo       g_interface_info_get_constant        (InterfaceInfo info,
 								     int        n);
 	
-	GParamFlags          g_property_info_get_flags                (PropertyInfo         info);
+	int          g_property_info_get_flags                (PropertyInfo         info);
 	TypeInfo            g_property_info_get_type                 (PropertyInfo         info);
 	
 	int                  g_signal_info_get_flags                  (SignalInfo           info);

Modified: trunk/src/org/gnome/gir/repository/InterfaceInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/InterfaceInfo.java	(original)
+++ trunk/src/org/gnome/gir/repository/InterfaceInfo.java	Mon Sep  8 22:24:32 2008
@@ -36,7 +36,7 @@
 		for (int i = 0; i < n; i++)
 			ret[i] = GIntrospectionAPI.gi.g_interface_info_get_signal(this, i);
 		return ret;
-	}		
+	}
 	
 	public VFuncInfo[] getVFuncs() {
 		int n = GIntrospectionAPI.gi.g_interface_info_get_n_vfuncs(this);

Modified: trunk/src/org/gnome/gir/repository/ObjectInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/ObjectInfo.java	(original)
+++ trunk/src/org/gnome/gir/repository/ObjectInfo.java	Mon Sep  8 22:24:32 2008
@@ -44,6 +44,14 @@
 		return ret;
 	}
 	
+	public PropertyInfo[] getProperties() {
+		int n = GIntrospectionAPI.gi.g_object_info_get_n_properties(this);
+		PropertyInfo[] ret= new PropertyInfo[n];
+		for (int i = 0; i < n; i++)
+			ret[i] = GIntrospectionAPI.gi.g_object_info_get_property(this, i);
+		return ret;
+	}	
+	
 	public InterfaceInfo[] getInterfaces() {
 		int n = GIntrospectionAPI.gi.g_object_info_get_n_interfaces(this);
 		InterfaceInfo[] ret= new InterfaceInfo[n];

Modified: trunk/src/org/gnome/gir/repository/PropertyInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/PropertyInfo.java	(original)
+++ trunk/src/org/gnome/gir/repository/PropertyInfo.java	Mon Sep  8 22:24:32 2008
@@ -1,10 +1,17 @@
 package org.gnome.gir.repository;
 
-import com.sun.jna.Pointer;
-import com.sun.jna.PointerType;
 
-public class PropertyInfo extends PointerType {
-	protected PropertyInfo(Pointer pointer) {
-		super(pointer);
+public class PropertyInfo extends BaseInfo {
+
+	protected PropertyInfo(Initializer init) {
+		super(init);
+	}
+
+	public int getFlags() {
+		return GIntrospectionAPI.gi.g_property_info_get_flags(this);
+	}
+	
+	public TypeInfo getType() {
+		return GIntrospectionAPI.gi.g_property_info_get_type(this);
 	}
 }

Modified: trunk/stub-examples/Test.java
==============================================================================
--- trunk/stub-examples/Test.java	(original)
+++ trunk/stub-examples/Test.java	Mon Sep  8 22:24:32 2008
@@ -20,7 +20,15 @@
 import com.sun.jna.ptr.PointerByReference;
 
 public class Test extends GObject implements TestIface {
+
+	public String getFoo() {
+		return (String) get("foo");
+	}
 	
+	public void setFoo(String arg) {
+		set("foo", arg);
+	}
+
 	public void foo(String x, Double y, Integer z) throws GErrorException {
 		PointerByReference error = new PointerByReference(null);
 		Function target = Internals.library.getFunction("gtk_foo_bar");



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]