diff --git a/src/ast.zig b/src/ast.zig index 99a8650..36cabe0 100644 --- a/src/ast.zig +++ b/src/ast.zig @@ -541,8 +541,14 @@ pub const JniMethodDecl = struct { is_static: bool = false, // true for `static name :: ...` }; +pub const JniFieldDecl = struct { + name: []const u8, + field_type: *Node, // type_expr node +}; + pub const JniClassMember = union(enum) { method: JniMethodDecl, + field: JniFieldDecl, extends: []const u8, // sx-side alias name (right of `#extends`) implements: []const u8, // sx-side alias name (right of `#implements`) }; diff --git a/src/parser.zig b/src/parser.zig index 2efd1cc..e6d4282 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -1071,13 +1071,28 @@ pub const Parser = struct { self.advance(); // consume `static` } + // Field: name: Type; (instance field — JNI Get/SetField) // Method: name :: (args...) -> Ret; - // (Fields, #desc override land in later steps.) if (self.current.tag != .identifier) { - return self.fail("expected method name in '#jni_class' body"); + return self.fail("expected member name in '#jni_class' body"); } - const method_name = self.tokenSlice(self.current); + const member_name = self.tokenSlice(self.current); self.advance(); + + if (self.current.tag == .colon) { + if (is_static) { + return self.fail("static fields not yet supported in '#jni_class' body"); + } + self.advance(); // consume `:` + const field_type = try self.parseTypeExpr(); + try self.expect(.semicolon); + try members.append(self.allocator, .{ .field = .{ + .name = member_name, + .field_type = field_type, + } }); + continue; + } + try self.expect(.colon_colon); try self.expect(.l_paren); @@ -1109,7 +1124,7 @@ pub const Parser = struct { try self.expect(.semicolon); try members.append(self.allocator, .{ .method = .{ - .name = method_name, + .name = member_name, .params = try param_types.toOwnedSlice(self.allocator), .param_names = try param_names.toOwnedSlice(self.allocator), .return_type = return_type, diff --git a/tests/expected/ffi-jni-class-05-field.exit b/tests/expected/ffi-jni-class-05-field.exit index d00491f..573541a 100644 --- a/tests/expected/ffi-jni-class-05-field.exit +++ b/tests/expected/ffi-jni-class-05-field.exit @@ -1 +1 @@ -1 +0 diff --git a/tests/expected/ffi-jni-class-05-field.txt b/tests/expected/ffi-jni-class-05-field.txt index ebca0b9..2ef3b99 100644 --- a/tests/expected/ffi-jni-class-05-field.txt +++ b/tests/expected/ffi-jni-class-05-field.txt @@ -1 +1 @@ -/Users/agra/projects/sx/examples/ffi-jni-class-05-field.sx:12:6: error: expected '::' +parse-only ok