Skip to content

Commit 8afcbb9

Browse files
committed
Added support for sizeof operator on expressions, and changed shorthand generics syntax to use '#' instead of '-'
1 parent 0a21672 commit 8afcbb9

File tree

9 files changed

+41
-19
lines changed

9 files changed

+41
-19
lines changed

Diff for: src/ast/expr/kind.rs

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub enum ExprKind {
3434
StaticMemberValue(Box<StaticMemberValue>),
3535
StaticMemberCall(Box<StaticMemberCall>),
3636
SizeOf(Box<Type>),
37+
SizeOfValue(Box<Expr>),
3738
InterpreterSyscall(Box<InterpreterSyscall>),
3839
}
3940

Diff for: src/lexer/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ impl<T: Text + Send> Lexer<T> {
522522
fn feed_short_generic(&mut self) -> FeedResult<Token> {
523523
self.state = State::Idle;
524524

525-
if let Ok(source) = self.characters.eat_remember('-') {
525+
if let Ok(source) = self.characters.eat_remember('#') {
526526
FeedResult::Has(TokenKind::ShortGeneric.at(source))
527527
} else {
528528
self.feed_idle()

Diff for: src/parser/parse_expr/primary/mod.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,15 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
159159
.at(source));
160160
};
161161

162-
let TypeArg::Type(ty) = arg else {
162+
let expr = if let TypeArg::Type(ty) = arg {
163+
ExprKind::SizeOf(Box::new(ty)).at(source)
164+
} else if let TypeArg::Expr(value) = arg {
165+
ExprKind::SizeOfValue(Box::new(value)).at(source)
166+
} else {
163167
return Err(ParseErrorKind::Other {
164-
message: "Cannot get size of non-type value".into(),
168+
message:
169+
"Cannot get size of compile-time value that isn't type or expression"
170+
.into(),
165171
}
166172
.at(source));
167173
};
@@ -173,7 +179,7 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
173179
.at(source));
174180
};
175181

176-
return Ok(ExprKind::SizeOf(Box::new(ty)).at(source));
182+
return Ok(expr);
177183
}
178184

179185
return Err(ParseErrorKind::Other {

Diff for: src/parser/parse_type.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
9393
Ok(if self.input.peek().could_start_type() {
9494
TypeArg::Type(self.parse_type(None::<&str>, Some("for compile time argument"))?)
9595
} else {
96-
TypeArg::Expr(self.parse_expr_primary()?)
96+
TypeArg::Expr(self.parse_expr_primary_base()?)
9797
})
9898
}
9999

Diff for: src/resolve/expr/mod.rs

+15
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,21 @@ pub fn resolve_expr(
383383
asg::ExprKind::SizeOf(Box::new(ty)).at(source),
384384
))
385385
}
386+
ast::ExprKind::SizeOfValue(value) => {
387+
let ty = resolve_expr(
388+
ctx,
389+
value,
390+
preferred_type,
391+
initialized,
392+
ResolveExprMode::RequireValue,
393+
)?
394+
.ty;
395+
396+
Ok(TypedExpr::new(
397+
asg::TypeKind::Integer(IntegerBits::Bits64, IntegerSign::Unsigned).at(source),
398+
asg::ExprKind::SizeOf(Box::new(ty)).at(source),
399+
))
400+
}
386401
ast::ExprKind::InterpreterSyscall(info) => {
387402
let ast::InterpreterSyscall {
388403
kind,

Diff for: src/token.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ impl Display for TokenKind {
232232
TokenKind::StaticMember => f.write_str("'::'"),
233233
TokenKind::Extend => f.write_str("'..'"),
234234
TokenKind::FatArrow => f.write_str("'=>'"),
235-
TokenKind::ShortGeneric => f.write_str("short generic '-'"),
235+
TokenKind::ShortGeneric => f.write_str("short generic '#'"),
236236
}
237237
}
238238
}

Diff for: tests/success/generics_shorthand/main.adept

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
pragma => adept("3.0")
33

44
#[foreign]
5-
func printf(format ptr-char, ...) int
5+
func printf(format ptr#char, ...) int
66

77
func main {
8-
message ptr-char = c"Hello from generics shorthand example!"
8+
message ptr#char = c"Hello from generics shorthand example!"
99
printf(c"%s\n", message)
1010
}
1111

Diff for: tests/success/null/main.adept

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
pragma => adept("3.0")
33

44
#[foreign]
5-
func printf(format ptr-char, ...) int
5+
func printf(format ptr#char, ...) int
66

77
func main {
8-
message ptr<char> = null
8+
message ptr#char = null
99
printf(c"message\t= %010p\n", message)
1010
printf(c"null\t= %010p\n", null)
1111
}

Diff for: tests/success/sizeof/main.adept

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
pragma => adept("3.0")
33

44
#[foreign]
5-
func printf(format ptr-char, ...) int
5+
func printf(format ptr#char, ...) int
66

7-
struct FullName (firstname ptr-char, lastname ptr-char)
7+
struct FullName (firstname ptr#char, lastname ptr#char)
88

99
func main {
10-
printf(c"sizeof-char = %d\n", sizeof-char.int())
11-
printf(c"sizeof-short = %d\n", sizeof-char.int())
12-
printf(c"sizeof-int = %d\n", sizeof-int.int())
13-
printf(c"sizeof-long = %d\n", sizeof-long.int())
14-
printf(c"sizeof-longlong = %d\n", sizeof-longlong.int())
15-
printf(c"sizeof-ptr-char = %d\n", sizeof-ptr-char.int())
16-
printf(c"sizeof-double = %d\n", sizeof-double.int())
10+
printf(c"sizeof#char = %d\n", sizeof#char.int())
11+
printf(c"sizeof#short = %d\n", sizeof#short.int())
12+
printf(c"sizeof#int = %d\n", sizeof#int.int())
13+
printf(c"sizeof#long = %d\n", sizeof#long.int())
14+
printf(c"sizeof#longlong = %d\n", sizeof#longlong.int())
15+
printf(c"sizeof#ptr#char = %d\n", sizeof#ptr#char.int())
16+
printf(c"sizeof#double = %d\n", sizeof#double.int())
1717

1818
// This syntax is also accepted
1919
printf(c"sizeof<FullName> = %d\n", sizeof<FullName>.int())

0 commit comments

Comments
 (0)