Skip to content

Commit

Permalink
fix: invalid Python code generated for constructor calls (#981)
Browse files Browse the repository at this point in the history
Closes #980

### Summary of Changes

No longer add an empty receiver parameter to the code that is generated
for constructor calls.
  • Loading branch information
lars-reimann authored Apr 3, 2024
1 parent b59d6f0 commit c7d006f
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ import {
getParameters,
getPlaceholderByName,
getStatements,
isStatic,
Parameter,
streamBlockLambdaResults,
} from '../helpers/nodeProperties.js';
Expand Down Expand Up @@ -1017,7 +1018,7 @@ export class SafeDsPythonGenerator {
(parameter) => this.nodeMapper.callToParameterValue(expression, parameter)!,
);
// For a static function, the thisParam would be the class containing the function. We do not need to generate it in this case
const generateThisParam = !isSdsFunction(callable) || (!callable.isStatic && thisParam);
const generateThisParam = thisParam && isSdsFunction(callable) && !isStatic(callable);
const containsOptionalArgs = sortedArgs.some((arg) =>
Parameter.isOptional(this.nodeMapper.argumentToParameter(arg)),
);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Imports ----------------------------------------------------------------------

import safeds_runner
from typing import Any, Callable, TypeVar

# Type variables ---------------------------------------------------------------

__gen_T = TypeVar("__gen_T")

# Utils ------------------------------------------------------------------------

def __gen_null_safe_call(receiver: Any, callable: Callable[[], __gen_T]) -> __gen_T | None:
return callable() if receiver is not None else None

# Segments ---------------------------------------------------------------------

def segment_a(a):
__gen_yield_result = (a) * (2)
return __gen_yield_result

# Pipelines --------------------------------------------------------------------

def test():
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.g", lambda *_ : g(1, param2=2), [1, 2], []))
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.g", lambda *_ : g(2, param2=1), [2, 1], []))
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.h", lambda *_ : h(1, param_2=2), [1, 2], []))
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.h", lambda *_ : h(2, param_2=1), [2, 1], []))
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.h", h, [2, 0], []))
'abc'.i()
'abc'.j(123)
k(456, 1.23)
__gen_null_safe_call(f, lambda: f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.g", lambda *_ : g(1, param2=2), [1, 2], [])))
__gen_null_safe_call(f, lambda: f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.g", lambda *_ : g(2, param2=1), [2, 1], [])))
__gen_null_safe_call(f, lambda: f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.h", lambda *_ : h(1, param_2=2), [1, 2], [])))
__gen_null_safe_call(f, lambda: f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.h", lambda *_ : h(2, param_2=1), [2, 1], [])))
__gen_null_safe_call(f, lambda: f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.h", h, [2, 0], [])))
__gen_null_safe_call(i, lambda: 'abc'.i())
__gen_null_safe_call(j, lambda: 'abc'.j(123))
__gen_null_safe_call(k, lambda: k(456, 1.23))
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.readFile", readFile, [], [safeds_runner.file_mtime('a.txt')]))
f(l(lambda a: segment_a(a)))
f(l(lambda a: (3) * (segment_a(a))))
f(l(lambda a: safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.m", m, [(3) * (segment_a(a))], [])))
f(l(lambda a: (3) * (safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.m", m, [safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.m", m, [(3) * (segment_a(a))], [])], []))))
def __gen_block_lambda_0(a):
__gen_block_lambda_result_result = segment_a(a)
return __gen_block_lambda_result_result
f(l(__gen_block_lambda_0))
def __gen_block_lambda_1(a):
__gen_block_lambda_result_result = safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.m", m, [segment_a(a)], [])
return __gen_block_lambda_result_result
f(l(__gen_block_lambda_1))
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.l", l, [lambda a: (3) * (a)], []))
def __gen_block_lambda_2(a):
__gen_block_lambda_result_result = (3) * (safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.m", m, [a], []))
return __gen_block_lambda_result_result
f(safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.main.l", l, [__gen_block_lambda_2], []))

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package tests.generator.callWithRunnerIntegration
package tests.generator.runnerIntegration.expressions.calls.main

@Impure([ImpurityReason.Other]) fun f(param: Any?)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Imports ----------------------------------------------------------------------

import safeds_runner

# Pipelines --------------------------------------------------------------------

def test():
a = safeds_runner.memoized_call("tests.generator.runnerIntegration.expressions.calls.ofClasses.MyClass", MyClass, [0], [])
safeds_runner.save_placeholder('a', a)

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .gen_input import test

if __name__ == '__main__':
test()
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Related to https://github.com/Safe-DS/DSL/issues/980

package tests.generator.runnerIntegration.expressions.calls.ofClasses

class MyClass(p: Int)

pipeline test {
val a = MyClass(0);
}

0 comments on commit c7d006f

Please sign in to comment.