Skip to content

Commit a06a333

Browse files
committed
Move code depending on codegen-full to its own file
1 parent d4e9589 commit a06a333

File tree

5 files changed

+186
-179
lines changed

5 files changed

+186
-179
lines changed

godot-codegen/src/central_generator.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ use std::collections::HashMap;
1010
use std::path::Path;
1111

1212
use crate::api_parser::*;
13-
use crate::class_generator::{is_builtin_method_excluded, is_class_excluded, is_method_excluded};
1413
use crate::util::{
1514
option_as_slice, to_pascal_case, to_rust_type, to_snake_case, ClassCodegenLevel,
1615
};
17-
use crate::{ident, special_cases, util, Context, SubmitFn, TyName};
16+
use crate::{codegen_special_cases, ident, special_cases, util, Context, SubmitFn, TyName};
1817

1918
struct CentralItems {
2019
opaque_types: [Vec<TokenStream>; 2],
@@ -561,7 +560,7 @@ fn make_class_method_table(
561560
let mut class_sname_decls = Vec::new();
562561
for class in api.classes.iter() {
563562
if special_cases::is_class_deleted(&TyName::from_godot(&class.name))
564-
|| is_class_excluded(&class.name)
563+
|| codegen_special_cases::is_class_excluded(&class.name)
565564
|| util::get_api_level(class) != api_level
566565
{
567566
continue;
@@ -632,7 +631,7 @@ fn populate_class_methods(
632631
let class_name_str = class.name.as_str();
633632

634633
for method in option_as_slice(&class.methods) {
635-
if is_method_excluded(method, false, ctx) {
634+
if codegen_special_cases::is_method_excluded(method, false, ctx) {
636635
continue;
637636
}
638637

@@ -653,7 +652,7 @@ fn populate_builtin_methods(
653652
type_name: &TypeNames,
654653
) {
655654
for method in option_as_slice(&builtin_class.methods) {
656-
if is_builtin_method_excluded(method) {
655+
if codegen_special_cases::is_builtin_method_excluded(method) {
657656
continue;
658657
}
659658

godot-codegen/src/class_generator.rs

Lines changed: 11 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,17 @@ use proc_macro2::{Ident, Literal, TokenStream};
1010
use quote::{format_ident, quote, ToTokens};
1111
use std::path::Path;
1212

13+
use crate::api_parser::*;
1314
use crate::central_generator::{collect_builtin_types, BuiltinTypeInfo};
1415
use crate::context::NotificationEnum;
15-
use crate::special_cases::is_class_deleted;
1616
use crate::util::{
1717
ident, make_string_name, option_as_slice, parse_native_structures_format, safe_ident,
1818
to_pascal_case, to_rust_expr, to_rust_type, to_rust_type_abi, to_snake_case,
1919
NativeStructuresField,
2020
};
21-
use crate::{api_parser::*, SubmitFn};
2221
use crate::{
23-
special_cases, util, Context, GeneratedBuiltin, GeneratedBuiltinModule, GeneratedClass,
24-
GeneratedClassModule, ModName, RustTy, TyName,
22+
codegen_special_cases, special_cases, util, Context, GeneratedBuiltin, GeneratedBuiltinModule,
23+
GeneratedClass, GeneratedClassModule, ModName, RustTy, SubmitFn, TyName,
2524
};
2625

2726
// ----------------------------------------------------------------------------------------------------------------------------------------------
@@ -238,12 +237,9 @@ pub(crate) fn generate_class_files(
238237
let class_name = TyName::from_godot(&class.name);
239238
let module_name = ModName::from_godot(&class.name);
240239

241-
#[cfg(not(feature = "codegen-full"))]
242-
if !crate::SELECTED_CLASSES.contains(&class_name.godot_ty.as_str()) {
243-
continue;
244-
}
245-
246-
if special_cases::is_class_deleted(&class_name) {
240+
if special_cases::is_class_deleted(&class_name)
241+
|| codegen_special_cases::is_class_excluded(class_name.godot_ty.as_str())
242+
{
247243
continue;
248244
}
249245

@@ -1074,107 +1070,14 @@ fn make_special_builtin_methods(class_name: &TyName, _ctx: &Context) -> TokenStr
10741070
}
10751071
}
10761072

1077-
pub(crate) fn is_builtin_method_excluded(method: &BuiltinClassMethod) -> bool {
1078-
// Builtin class methods that need varcall are not currently available in GDExtension.
1079-
// See https://github.com/godot-rust/gdext/issues/382.
1080-
method.is_vararg
1081-
}
1082-
1083-
#[cfg(not(feature = "codegen-full"))]
1084-
pub(crate) fn is_class_excluded(class: &str) -> bool {
1085-
!crate::SELECTED_CLASSES.contains(&class)
1086-
}
1087-
1088-
#[cfg(feature = "codegen-full")]
1089-
pub(crate) fn is_class_excluded(_class: &str) -> bool {
1090-
false
1091-
}
1092-
1093-
#[cfg(not(feature = "codegen-full"))]
1094-
fn is_type_excluded(ty: &str, ctx: &mut Context) -> bool {
1095-
fn is_rust_type_excluded(ty: &RustTy) -> bool {
1096-
match ty {
1097-
RustTy::BuiltinIdent(_) => false,
1098-
RustTy::BuiltinArray(_) => false,
1099-
RustTy::RawPointer { inner, .. } => is_rust_type_excluded(&inner),
1100-
RustTy::EngineArray { elem_class, .. } => is_class_excluded(elem_class.as_str()),
1101-
RustTy::EngineEnum {
1102-
surrounding_class, ..
1103-
} => match surrounding_class.as_ref() {
1104-
None => false,
1105-
Some(class) => is_class_excluded(class.as_str()),
1106-
},
1107-
RustTy::EngineClass { class, .. } => is_class_excluded(&class),
1108-
}
1109-
}
1110-
is_rust_type_excluded(&to_rust_type(ty, None, ctx))
1111-
}
1112-
1113-
pub(crate) fn is_method_excluded(
1114-
method: &ClassMethod,
1115-
is_virtual_impl: bool,
1116-
ctx: &mut Context,
1117-
) -> bool {
1118-
let is_arg_or_return_excluded = |ty: &str, _ctx: &mut Context| {
1119-
let class_deleted = is_class_deleted(&TyName::from_godot(ty));
1120-
1121-
#[cfg(not(feature = "codegen-full"))]
1122-
{
1123-
class_deleted || is_type_excluded(ty, _ctx)
1124-
}
1125-
#[cfg(feature = "codegen-full")]
1126-
{
1127-
class_deleted
1128-
}
1129-
};
1130-
1131-
// Exclude if return type contains an excluded type.
1132-
if method.return_value.as_ref().map_or(false, |ret| {
1133-
is_arg_or_return_excluded(ret.type_.as_str(), ctx)
1134-
}) {
1135-
return true;
1136-
}
1137-
1138-
// Exclude if any argument contains an excluded type.
1139-
if method.arguments.as_ref().map_or(false, |args| {
1140-
args.iter()
1141-
.any(|arg| is_arg_or_return_excluded(arg.type_.as_str(), ctx))
1142-
}) {
1143-
return true;
1144-
}
1145-
1146-
// Virtual methods are not part of the class API itself, but exposed as an accompanying trait.
1147-
if !is_virtual_impl && method.name.starts_with('_') {
1148-
return true;
1149-
}
1150-
1151-
false
1152-
}
1153-
1154-
#[cfg(feature = "codegen-full")]
1155-
fn is_function_excluded(_function: &UtilityFunction, _ctx: &mut Context) -> bool {
1156-
false
1157-
}
1158-
1159-
#[cfg(not(feature = "codegen-full"))]
1160-
fn is_function_excluded(function: &UtilityFunction, ctx: &mut Context) -> bool {
1161-
function
1162-
.return_type
1163-
.as_ref()
1164-
.map_or(false, |ret| is_type_excluded(ret.as_str(), ctx))
1165-
|| function.arguments.as_ref().map_or(false, |args| {
1166-
args.iter()
1167-
.any(|arg| is_type_excluded(arg.type_.as_str(), ctx))
1168-
})
1169-
}
1170-
11711073
fn make_method_definition(
11721074
method: &ClassMethod,
11731075
class_name: &TyName,
11741076
get_method_table: &Ident,
11751077
ctx: &mut Context,
11761078
) -> FnDefinition {
1177-
if is_method_excluded(method, false, ctx) || special_cases::is_deleted(class_name, &method.name)
1079+
if codegen_special_cases::is_method_excluded(method, false, ctx)
1080+
|| special_cases::is_deleted(class_name, &method.name)
11781081
{
11791082
return FnDefinition::none();
11801083
}
@@ -1249,7 +1152,7 @@ fn make_builtin_method_definition(
12491152
type_info: &BuiltinTypeInfo,
12501153
ctx: &mut Context,
12511154
) -> FnDefinition {
1252-
if is_builtin_method_excluded(method) {
1155+
if codegen_special_cases::is_builtin_method_excluded(method) {
12531156
return FnDefinition::none();
12541157
}
12551158

@@ -1302,7 +1205,7 @@ pub(crate) fn make_utility_function_definition(
13021205
function: &UtilityFunction,
13031206
ctx: &mut Context,
13041207
) -> TokenStream {
1305-
if is_function_excluded(function, ctx) {
1208+
if codegen_special_cases::is_function_excluded(function, ctx) {
13061209
return TokenStream::new();
13071210
}
13081211

@@ -2049,7 +1952,7 @@ fn make_all_virtual_methods(
20491952
all_virtuals
20501953
.into_iter()
20511954
.filter_map(|method| {
2052-
if is_method_excluded(&method, true, ctx) {
1955+
if codegen_special_cases::is_method_excluded(&method, true, ctx) {
20531956
None
20541957
} else {
20551958
Some(make_virtual_method(&method, ctx))
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
/*
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this
4+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
5+
*/
6+
7+
//! Codegen-dependent exclusions. Can be removed if feature `codegen-full` is removed.
8+
9+
use crate::api_parser::{BuiltinClassMethod, ClassMethod, UtilityFunction};
10+
use crate::context::Context;
11+
use crate::{special_cases, TyName};
12+
13+
pub(crate) fn is_builtin_method_excluded(method: &BuiltinClassMethod) -> bool {
14+
// Builtin class methods that need varcall are not currently available in GDExtension.
15+
// See https://github.com/godot-rust/gdext/issues/382.
16+
method.is_vararg
17+
}
18+
19+
#[cfg(not(feature = "codegen-full"))]
20+
pub(crate) fn is_class_excluded(class: &str) -> bool {
21+
!SELECTED_CLASSES.contains(&class)
22+
}
23+
24+
#[cfg(feature = "codegen-full")]
25+
pub(crate) fn is_class_excluded(_class: &str) -> bool {
26+
false
27+
}
28+
29+
#[cfg(not(feature = "codegen-full"))]
30+
fn is_type_excluded(ty: &str, ctx: &mut Context) -> bool {
31+
fn is_rust_type_excluded(ty: &RustTy) -> bool {
32+
match ty {
33+
RustTy::BuiltinIdent(_) => false,
34+
RustTy::BuiltinArray(_) => false,
35+
RustTy::RawPointer { inner, .. } => is_rust_type_excluded(&inner),
36+
RustTy::EngineArray { elem_class, .. } => is_class_excluded(elem_class.as_str()),
37+
RustTy::EngineEnum {
38+
surrounding_class, ..
39+
} => match surrounding_class.as_ref() {
40+
None => false,
41+
Some(class) => is_class_excluded(class.as_str()),
42+
},
43+
RustTy::EngineClass { class, .. } => is_class_excluded(&class),
44+
}
45+
}
46+
is_rust_type_excluded(&to_rust_type(ty, None, ctx))
47+
}
48+
49+
pub(crate) fn is_method_excluded(
50+
method: &ClassMethod,
51+
is_virtual_impl: bool,
52+
ctx: &mut Context,
53+
) -> bool {
54+
let is_arg_or_return_excluded = |ty: &str, _ctx: &mut Context| {
55+
let class_deleted = special_cases::is_class_deleted(&TyName::from_godot(ty));
56+
57+
#[cfg(not(feature = "codegen-full"))]
58+
{
59+
class_deleted || is_type_excluded(ty, _ctx)
60+
}
61+
#[cfg(feature = "codegen-full")]
62+
{
63+
class_deleted
64+
}
65+
};
66+
67+
// Exclude if return type contains an excluded type.
68+
if method.return_value.as_ref().map_or(false, |ret| {
69+
is_arg_or_return_excluded(ret.type_.as_str(), ctx)
70+
}) {
71+
return true;
72+
}
73+
74+
// Exclude if any argument contains an excluded type.
75+
if method.arguments.as_ref().map_or(false, |args| {
76+
args.iter()
77+
.any(|arg| is_arg_or_return_excluded(arg.type_.as_str(), ctx))
78+
}) {
79+
return true;
80+
}
81+
82+
// Virtual methods are not part of the class API itself, but exposed as an accompanying trait.
83+
if !is_virtual_impl && method.name.starts_with('_') {
84+
return true;
85+
}
86+
87+
false
88+
}
89+
90+
#[cfg(feature = "codegen-full")]
91+
pub(crate) fn is_function_excluded(_function: &UtilityFunction, _ctx: &mut Context) -> bool {
92+
false
93+
}
94+
95+
#[cfg(not(feature = "codegen-full"))]
96+
pub(crate) fn is_function_excluded(function: &UtilityFunction, ctx: &mut Context) -> bool {
97+
function
98+
.return_type
99+
.as_ref()
100+
.map_or(false, |ret| is_type_excluded(ret.as_str(), ctx))
101+
|| function.arguments.as_ref().map_or(false, |args| {
102+
args.iter()
103+
.any(|arg| is_type_excluded(arg.type_.as_str(), ctx))
104+
})
105+
}
106+
107+
// ----------------------------------------------------------------------------------------------------------------------------------------------
108+
// Allowed-classes
109+
110+
// Classes for minimal config
111+
#[cfg(not(feature = "codegen-full"))]
112+
const SELECTED_CLASSES: &[&str] = &[
113+
"AnimatedSprite2D",
114+
"ArrayMesh",
115+
"Area2D",
116+
"AudioStreamPlayer",
117+
"BaseButton",
118+
"Button",
119+
"BoxMesh",
120+
"Camera2D",
121+
"Camera3D",
122+
"CanvasItem",
123+
"CanvasLayer",
124+
"ClassDB",
125+
"CollisionObject2D",
126+
"CollisionShape2D",
127+
"Control",
128+
"Engine",
129+
"FileAccess",
130+
"HTTPRequest",
131+
"Image",
132+
"ImageTextureLayered",
133+
"Input",
134+
"InputEvent",
135+
"InputEventAction",
136+
"Label",
137+
"MainLoop",
138+
"Marker2D",
139+
"Mesh",
140+
"Node",
141+
"Node2D",
142+
"Node3D",
143+
"Node3DGizmo",
144+
"Object",
145+
"OS",
146+
"PackedScene",
147+
"PathFollow2D",
148+
"PhysicsBody2D",
149+
"PrimitiveMesh",
150+
"RefCounted",
151+
"RenderingServer",
152+
"Resource",
153+
"ResourceFormatLoader",
154+
"ResourceLoader",
155+
"RigidBody2D",
156+
"SceneTree",
157+
"Sprite2D",
158+
"SpriteFrames",
159+
"TextServer",
160+
"TextServerExtension",
161+
"Texture",
162+
"Texture2DArray",
163+
"TextureLayered",
164+
"Time",
165+
"Timer",
166+
"Window",
167+
"Viewport",
168+
];

0 commit comments

Comments
 (0)