Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
typon-compiler
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
typon
typon-compiler
Commits
e7c1d806
Commit
e7c1d806
authored
Aug 11, 2023
by
Tom Niget
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use dot macro
parent
3ea27887
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
59 additions
and
21 deletions
+59
-21
trans/tests/usertype.py
trans/tests/usertype.py
+1
-0
trans/transpiler/phases/emit_cpp/block.py
trans/transpiler/phases/emit_cpp/block.py
+9
-1
trans/transpiler/phases/emit_cpp/class_.py
trans/transpiler/phases/emit_cpp/class_.py
+18
-8
trans/transpiler/phases/emit_cpp/expr.py
trans/transpiler/phases/emit_cpp/expr.py
+31
-12
No files found.
trans/tests/usertype.py
View file @
e7c1d806
...
...
@@ -21,4 +21,5 @@ if __name__ == "__main__":
print
(
x
.
name
)
print
(
x
.
age
)
x
.
afficher
()
y
.
afficher
(
x
)
trans/transpiler/phases/emit_cpp/block.py
View file @
e7c1d806
...
...
@@ -56,6 +56,8 @@ class BlockVisitor(NodeVisitor):
yield
f"}}
{
node
.
name
}
;"
def
visit_func_new
(
self
,
node
:
ast
.
FunctionDef
,
emission
:
FunctionEmissionKind
,
skip_first_arg
:
bool
=
False
)
->
Iterable
[
str
]:
if
emission
==
FunctionEmissionKind
.
METHOD
:
yield
"template <typename Self>"
yield
from
self
.
visit
(
node
.
type
.
return_type
)
if
emission
==
FunctionEmissionKind
.
DEFINITION
:
yield
f"
{
node
.
name
}
_inner::"
...
...
@@ -68,6 +70,9 @@ class BlockVisitor(NodeVisitor):
for
i
,
(
arg
,
argty
,
default
)
in
enumerate
(
args_iter
):
if
i
!=
0
:
yield
", "
if
emission
==
FunctionEmissionKind
.
METHOD
and
i
==
0
:
yield
"Self"
else
:
yield
from
self
.
visit
(
argty
)
yield
arg
.
arg
if
emission
==
FunctionEmissionKind
.
DECLARATION
and
default
:
...
...
@@ -75,6 +80,9 @@ class BlockVisitor(NodeVisitor):
yield
from
self
.
expr
().
visit
(
default
)
yield
")"
if
emission
==
FunctionEmissionKind
.
METHOD
:
yield
"const"
inner_scope
=
node
.
inner_scope
if
emission
==
FunctionEmissionKind
.
DECLARATION
:
...
...
trans/transpiler/phases/emit_cpp/class_.py
View file @
e7c1d806
...
...
@@ -19,7 +19,7 @@ class ClassVisitor(NodeVisitor):
yield
from
inner
.
visit
(
stmt
)
yield
"template<typename... T> type(T&&... args) {"
yield
"__init__(std::forward<T>(args)...);"
yield
"__init__(
this,
std::forward<T>(args)...);"
yield
"}"
yield
"type() {}"
yield
"type(const type&) = delete;"
...
...
@@ -62,11 +62,16 @@ class ClassInnerVisitor(NodeVisitor):
yield
";"
def
visit_FunctionDef
(
self
,
node
:
ast
.
FunctionDef
)
->
Iterable
[
str
]:
yield
"struct {"
yield
"type* self;"
# yield "struct {"
# yield "type* self;"
# from transpiler.phases.emit_cpp.block import BlockVisitor
# yield from BlockVisitor(self.scope).visit_func_new(node, FunctionEmissionKind.METHOD, True)
# yield f"}} {node.name} {{ this }};"
yield
f"struct
{
node
.
name
}
_m_s : function {{"
from
transpiler.phases.emit_cpp.block
import
BlockVisitor
yield
from
BlockVisitor
(
self
.
scope
).
visit_func_new
(
node
,
FunctionEmissionKind
.
METHOD
,
True
)
yield
f"}}
{
node
.
name
}
{{ this }};"
yield
from
BlockVisitor
(
self
.
scope
).
visit_func_new
(
node
,
FunctionEmissionKind
.
METHOD
)
yield
f"}} static constexpr
{
node
.
name
}
{{}};"
yield
""
@
dataclass
class
ClassOuterVisitor
(
NodeVisitor
):
...
...
@@ -77,8 +82,13 @@ class ClassOuterVisitor(NodeVisitor):
def
visit_FunctionDef
(
self
,
node
:
ast
.
FunctionDef
)
->
Iterable
[
str
]:
yield
"struct {"
yield
"template<typename... T>"
yield
"auto operator()(
type&
self, T&&... args) {"
yield
f"return
self.
{
node
.
name
}
(std::forward<T>(args)...);"
yield
"template<typename
Self, typename
... T>"
yield
"auto operator()(
Self
self, T&&... args) {"
yield
f"return
dotp(self,
{
node
.
name
}
)
(std::forward<T>(args)...);"
yield
"}"
yield
f"}}
{
node
.
name
}
;"
yield
""
# yield "struct : function {"
# from transpiler.phases.emit_cpp.block import BlockVisitor
# yield from BlockVisitor(self.scope).visit_func_new(node, FunctionEmissionKind.METHOD)
# yield f"}} static constexpr {node.name} {{}};"
trans/transpiler/phases/emit_cpp/expr.py
View file @
e7c1d806
...
...
@@ -3,8 +3,8 @@ import ast
from
dataclasses
import
dataclass
,
field
from
typing
import
List
,
Iterable
from
transpiler.phases.typing.types
import
UserType
from
transpiler.utils
import
compare_ast
from
transpiler.phases.typing.types
import
UserType
,
FunctionType
from
transpiler.utils
import
compare_ast
,
linenodata
from
transpiler.consts
import
SYMBOLS
,
PRECEDENCE_LEVELS
from
transpiler.phases.emit_cpp
import
CoroutineMode
,
join
,
NodeVisitor
from
transpiler.phases.typing.scope
import
Scope
,
VarKind
...
...
@@ -92,13 +92,21 @@ class ExpressionVisitor(NodeVisitor):
yield
res
def
visit_Compare
(
self
,
node
:
ast
.
Compare
)
->
Iterable
[
str
]:
def
make_lnd
(
op1
,
op2
):
return
{
"lineno"
:
op1
.
lineno
,
"col_offset"
:
op1
.
col_offset
,
"end_lineno"
:
op2
.
end_lineno
,
"end_col_offset"
:
op2
.
end_col_offset
}
operands
=
[
node
.
left
,
*
node
.
comparators
]
with
self
.
prec_ctx
(
"&&"
):
yield
from
self
.
visit_binary_operation
(
node
.
ops
[
0
],
operands
[
0
],
operands
[
1
])
yield
from
self
.
visit_binary_operation
(
node
.
ops
[
0
],
operands
[
0
],
operands
[
1
]
,
make_lnd
(
operands
[
0
],
operands
[
1
])
)
for
(
left
,
right
),
op
in
zip
(
zip
(
operands
[
1
:],
operands
[
2
:]),
node
.
ops
[
1
:]):
# TODO: cleaner code
yield
" && "
yield
from
self
.
visit_binary_operation
(
op
,
left
,
right
)
yield
from
self
.
visit_binary_operation
(
op
,
left
,
right
,
make_lnd
(
left
,
right
)
)
def
visit_Call
(
self
,
node
:
ast
.
Call
)
->
Iterable
[
str
]:
# TODO
...
...
@@ -158,11 +166,11 @@ class ExpressionVisitor(NodeVisitor):
yield
"}"
def
visit_BinOp
(
self
,
node
:
ast
.
BinOp
)
->
Iterable
[
str
]:
yield
from
self
.
visit_binary_operation
(
node
.
op
,
node
.
left
,
node
.
right
)
yield
from
self
.
visit_binary_operation
(
node
.
op
,
node
.
left
,
node
.
right
,
linenodata
(
node
)
)
def
visit_binary_operation
(
self
,
op
,
left
:
ast
.
AST
,
right
:
ast
.
AST
)
->
Iterable
[
str
]:
def
visit_binary_operation
(
self
,
op
,
left
:
ast
.
AST
,
right
:
ast
.
AST
,
lnd
:
dict
)
->
Iterable
[
str
]:
if
type
(
op
)
==
ast
.
In
:
call
=
ast
.
Call
(
ast
.
Attribute
(
right
,
"__contains__"
),
[
left
],
[]
)
call
=
ast
.
Call
(
ast
.
Attribute
(
right
,
"__contains__"
,
**
lnd
),
[
left
],
[],
**
lnd
)
call
.
is_await
=
False
yield
from
self
.
visit_Call
(
call
)
return
...
...
@@ -180,6 +188,17 @@ class ExpressionVisitor(NodeVisitor):
yield
")"
def
visit_Attribute
(
self
,
node
:
ast
.
Attribute
)
->
Iterable
[
str
]:
if
isinstance
(
node
.
type
,
FunctionType
):
if
node
.
value
.
type
.
resolve
().
is_reference
:
yield
"dotp"
else
:
yield
"dot"
yield
"("
yield
from
self
.
visit
(
node
.
value
)
yield
", "
yield
self
.
fix_name
(
node
.
attr
)
yield
")"
else
:
yield
from
self
.
prec
(
"."
).
visit
(
node
.
value
)
if
node
.
value
.
type
.
resolve
().
is_reference
:
yield
"->"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment