@@ -593,6 +593,11 @@ class ClangGenerator {
593
593
}
594
594
}
595
595
596
+ if node.type.qualType.endsWith('*') and op == Token.Add {
597
+ // Pointer math
598
+ return Node.Call(Node.Dot(left, 'offsetItems'), [right], [])
599
+ }
600
+
596
601
if op == Token.LogicalAnd or op == Token.LogicalOr {
597
602
left = nodeToBoolean(node.inner[0])
598
603
right = nodeToBoolean(node.inner[1])
@@ -601,6 +606,13 @@ class ClangGenerator {
601
606
return Node.Binop(left, op, right)
602
607
case CompoundAssignOperator:
603
608
var op = Lexer.tokenize(Buffer.from(node.opcode), "CLANG").token[0] as! Token
609
+ if node.type.qualType.endsWith('*') and op == Token.Add {
610
+ // Pointer math
611
+ let left = nodeToNode(node.inner[0])
612
+ let right = nodeToNode(node.inner[1])
613
+ return Node.Binop(left, Token.Assign, Node.Call(Node.Dot(left, 'offsetItems'), [right], []))
614
+ }
615
+
604
616
return Node.AssignOp(nodeToNode(node.inner[0]), op, nodeToNode(node.inner[1]))
605
617
case IntegerLiteral:
606
618
// TODO type
@@ -716,9 +728,19 @@ class ClangGenerator {
716
728
case '-': return Node.Unop(Token.Subtract, postfix: false, expr)
717
729
case '++':
718
730
// TODO mutatedNode(expr)
731
+ if node.type.qualType.endsWith('*') {
732
+ // Pointer math
733
+ return Node.Binop(expr, Token.Assign, Node.Call(Node.Dot(expr, 'offsetItems'), [Node.Int(1)], []))
734
+ }
735
+
719
736
return Node.Unop(Token.Increment, postfix: true, expr)
720
737
case '--':
721
738
// TODO mutatedNode(expr)
739
+ if node.type.qualType.endsWith('*') {
740
+ // Pointer math
741
+ return Node.Binop(expr, Token.Assign, Node.Call(Node.Dot(expr, 'offsetItemsBack'), [Node.Int(-1)], []))
742
+ }
743
+
722
744
return Node.Unop(Token.Decrement, postfix: true, expr)
723
745
case '*': return Node.Index(expr, Node.Int(0))
724
746
case '&': return expr
@@ -850,6 +872,11 @@ class ClangGenerator {
850
872
return nodeToNode(node.inner[0])
851
873
}
852
874
875
+ // Literally
876
+ if node.castKind == "NoOp" {
877
+ return nodeToNode(node.inner[0])
878
+ }
879
+
853
880
let e = nodeToNode(node.inner[0])
854
881
let to = typeToType(node.type)
855
882
@@ -1019,6 +1046,8 @@ class ClangGenerator {
1019
1046
case Parenthesis(value):
1020
1047
switch value {
1021
1048
case Ident(_): value
1049
+ case Call(_): value
1050
+ case Dot(_): value
1022
1051
case _: expr
1023
1052
}
1024
1053
case _: expr
0 commit comments