typegen: add support for generics
This commit is contained in:
		
							parent
							
								
									4bedd19610
								
							
						
					
					
						commit
						768096e5cf
					
				
					 4 changed files with 48 additions and 28 deletions
				
			
		
							
								
								
									
										8
									
								
								flake.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								flake.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -22,11 +22,11 @@
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1716289830,
 | 
					        "lastModified": 1716510487,
 | 
				
			||||||
        "narHash": "sha256-kPxodbNTnCLtJ6MFih9LPULXh5l3st63t9isWIwvYSQ=",
 | 
					        "narHash": "sha256-kdQ4CjAl9H7VSfo+vWfQZynBpqCeNovIgnHg6iQ+3hs=",
 | 
				
			||||||
        "ref": "refs/heads/master",
 | 
					        "ref": "refs/heads/master",
 | 
				
			||||||
        "rev": "af45502913e0bb857755b2fa7e3ef991fff033ba",
 | 
					        "rev": "5016dbf0d4c9e12f7e3d5f872b3063785d20b2bf",
 | 
				
			||||||
        "revCount": 179,
 | 
					        "revCount": 184,
 | 
				
			||||||
        "type": "git",
 | 
					        "type": "git",
 | 
				
			||||||
        "url": "https://git.outfoxxed.me/outfoxxed/quickshell"
 | 
					        "url": "https://git.outfoxxed.me/outfoxxed/quickshell"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,7 +155,7 @@ impl Parser {
 | 
				
			||||||
			let class = class?;
 | 
								let class = class?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let comment = class.name("comment").map(|m| m.as_str());
 | 
								let comment = class.name("comment").map(|m| m.as_str());
 | 
				
			||||||
			let name = class.name("name").unwrap().as_str();
 | 
								let mut name = class.name("name").unwrap().as_str();
 | 
				
			||||||
			let mut superclass = class.name("super").map(|m| m.as_str());
 | 
								let mut superclass = class.name("super").map(|m| m.as_str());
 | 
				
			||||||
			let body = class.name("body").unwrap().as_str();
 | 
								let body = class.name("body").unwrap().as_str();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -189,6 +189,10 @@ impl Parser {
 | 
				
			||||||
									"QSDOC_BASECLASS must have the base class as an argument",
 | 
														"QSDOC_BASECLASS must have the base class as an argument",
 | 
				
			||||||
								))
 | 
													))
 | 
				
			||||||
							},
 | 
												},
 | 
				
			||||||
 | 
												"QSDOC_CNAME" => {
 | 
				
			||||||
 | 
													name = args
 | 
				
			||||||
 | 
														.expect("QSDOC_CNAME must specify the cname as an argument");
 | 
				
			||||||
 | 
												},
 | 
				
			||||||
							"Q_OBJECT" => classtype = Some(ClassType::Object),
 | 
												"Q_OBJECT" => classtype = Some(ClassType::Object),
 | 
				
			||||||
							"Q_GADGET" => classtype = Some(ClassType::Gadget),
 | 
												"Q_GADGET" => classtype = Some(ClassType::Gadget),
 | 
				
			||||||
							"QML_ELEMENT" | "QSDOC_ELEMENT" => qml_name = Some(name),
 | 
												"QML_ELEMENT" | "QSDOC_ELEMENT" => qml_name = Some(name),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,7 +56,11 @@ pub fn resolve_types(
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fn qmlparamtype(ctype: &str, typespec: &TypeSpec) -> outform::Type {
 | 
							fn qmlparamtype(mut ctype: &str, typespec: &TypeSpec) -> outform::Type {
 | 
				
			||||||
 | 
								if ctype.ends_with('*') {
 | 
				
			||||||
 | 
									ctype = &ctype[0..ctype.len() - 1];
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let qtype = typespec
 | 
								let qtype = typespec
 | 
				
			||||||
				.typemap
 | 
									.typemap
 | 
				
			||||||
				.iter()
 | 
									.iter()
 | 
				
			||||||
| 
						 | 
					@ -79,7 +83,7 @@ pub fn resolve_types(
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fn solveprop(prop: &Property, typespec: &TypeSpec) -> outform::Property {
 | 
							fn solveprop(prop: &Property, typespec: &TypeSpec) -> outform::Property {
 | 
				
			||||||
			let mut ctype = &prop.type_[..];
 | 
								let ctype = &prop.type_[..];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let flags = {
 | 
								let flags = {
 | 
				
			||||||
				let mut flags = Vec::new();
 | 
									let mut flags = Vec::new();
 | 
				
			||||||
| 
						 | 
					@ -112,32 +116,24 @@ pub fn resolve_types(
 | 
				
			||||||
					flags,
 | 
										flags,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				None => {
 | 
									None => {
 | 
				
			||||||
					let mut list = false;
 | 
										let (ctype, of) = match ctype.split_once('<') {
 | 
				
			||||||
 | 
											None => (ctype, None),
 | 
				
			||||||
					if ctype.starts_with("QQmlListProperty<") {
 | 
											Some((ctype, mut remaining)) => {
 | 
				
			||||||
						ctype = &ctype[17..ctype.len() - 1];
 | 
												if remaining.ends_with('*') {
 | 
				
			||||||
						list = true;
 | 
													remaining = &remaining[0..remaining.len() - 1];
 | 
				
			||||||
					} else if ctype.starts_with("QList<") {
 | 
					 | 
				
			||||||
						ctype = &ctype[6..ctype.len() - 1];
 | 
					 | 
				
			||||||
						list = true;
 | 
					 | 
				
			||||||
					} else if ctype.starts_with("QVector<") {
 | 
					 | 
				
			||||||
						ctype = &ctype[8..ctype.len() - 1];
 | 
					 | 
				
			||||||
						list = true;
 | 
					 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if ctype.ends_with('*') {
 | 
												// closing `>`
 | 
				
			||||||
						ctype = &ctype[0..ctype.len() - 1];
 | 
												remaining = &remaining[0..remaining.len() - 1];
 | 
				
			||||||
					}
 | 
					
 | 
				
			||||||
 | 
												(ctype, Some(remaining))
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					let mut type_ = qmlparamtype(ctype, typespec);
 | 
										let mut type_ = qmlparamtype(ctype, typespec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if list {
 | 
										if let Some(of) = of {
 | 
				
			||||||
						type_ = outform::Type {
 | 
											type_.of = Some(Box::new(qmlparamtype(of, typespec)));
 | 
				
			||||||
							type_: outform::TypeSource::Qt,
 | 
					 | 
				
			||||||
							module: "qml".to_string(),
 | 
					 | 
				
			||||||
							name: "list".to_string(),
 | 
					 | 
				
			||||||
							of: Some(Box::new(type_)),
 | 
					 | 
				
			||||||
						};
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					outform::Property {
 | 
										outform::Property {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,11 @@
 | 
				
			||||||
			"cname": "quint32",
 | 
								"cname": "quint32",
 | 
				
			||||||
			"module": null
 | 
								"module": null
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"name": "int",
 | 
				
			||||||
 | 
								"cname": "qsizetype",
 | 
				
			||||||
 | 
								"module": null
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name": "real",
 | 
								"name": "real",
 | 
				
			||||||
			"cname": "qreal",
 | 
								"cname": "qreal",
 | 
				
			||||||
| 
						 | 
					@ -60,6 +65,21 @@
 | 
				
			||||||
			"cname": "QObject",
 | 
								"cname": "QObject",
 | 
				
			||||||
			"module": "qml.QtQml"
 | 
								"module": "qml.QtQml"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"name": "list",
 | 
				
			||||||
 | 
								"cname": "QQmlListProperty",
 | 
				
			||||||
 | 
								"module": null
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"name": "list",
 | 
				
			||||||
 | 
								"cname": "QList",
 | 
				
			||||||
 | 
								"module": null
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"name": "list",
 | 
				
			||||||
 | 
								"cname": "QVector",
 | 
				
			||||||
 | 
								"module": null
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name": "Component",
 | 
								"name": "Component",
 | 
				
			||||||
			"cname": "QQmlComponent",
 | 
								"cname": "QQmlComponent",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue