Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TypeScript generator cleanups #1457

Merged
merged 5 commits into from
Nov 8, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions org.lflang/src/org/lflang/CommonExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@ fun <T> Iterable<T>.joinWithCommasLn(
transform: (T) -> CharSequence = { it.toString() }
): String = joinWithCommas(prefix, postfix, skipLines = true, trailing, transform)

fun <T> Iterable<T>.joinWithLn(
oowekyala marked this conversation as resolved.
Show resolved Hide resolved
prefix: CharSequence = "",
postfix: CharSequence = "",
transform: (T) -> CharSequence
): String = joinToString(separator = "\n", prefix = prefix, postfix = postfix, transform = transform)

/**
* Join this list with commas, surrounding it with angled brackets (`<...>`).
* If this list is empty, returns an empty string.
Expand Down
164 changes: 0 additions & 164 deletions org.lflang/src/org/lflang/generator/ExpressionGenerator.java

This file was deleted.

46 changes: 43 additions & 3 deletions org.lflang/src/org/lflang/generator/GeneratorUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@ package org.lflang.generator

import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
import org.lflang.ErrorReporter
import org.lflang.InferredType
import org.lflang.isInitWithBraces
import org.lflang.lf.Expression
import org.lflang.lf.Instantiation
import org.lflang.lf.LfFactory
import org.lflang.lf.Parameter
import org.lflang.lf.StateVar
import org.lflang.toPath
import org.lflang.toUnixString
import org.lflang.toTextTokenBased
import org.lflang.lf.Instantiation
import org.lflang.toUnixString

/** A transparent type alias to document when a string contains target code. */
typealias TargetCode = String
Expand Down Expand Up @@ -42,3 +47,38 @@ fun EObject.locationInfo(): LocationInfo {
lfText = toTextTokenBased() ?: ""
)
}


oowekyala marked this conversation as resolved.
Show resolved Hide resolved
fun TargetTypes.getTargetInitializer(sv: StateVar): TargetCode =
this.getTargetInitializer(sv.init, sv.type, sv.braces.isNotEmpty())

fun TargetTypes.getTargetInitializer(sv: Parameter): TargetCode =
this.getTargetInitializer(sv.init, sv.type, sv.isInitWithBraces)

/**
* Returns the target code for the [getActualValue] of the
* param for this instantiation.
*/
fun TargetTypes.getTargetInitializer(param: Parameter, inst: Instantiation): TargetCode {
val init = inst.getActualValue(param)
return getTargetInitializer(init, param.type, param.isInitWithBraces)
}

/**
* Returns the actual value of a parameter for the given instantiation.
lhstrh marked this conversation as resolved.
Show resolved Hide resolved
* The value is defaulted to the default value for the parameter if
* there is no explicit assignment. If there is no default value, the
* source code is invalid (param is required)
*/
fun Instantiation.getActualValue(param: Parameter): List<Expression> =
parameters.firstOrNull { it.lhs == param }?.rhs
?: param.init
?: throw InvalidLfSourceException(this, "No value for parameter ${param.name}")


fun TargetTypes.getTargetTimeExpr(v: Expression): TargetCode =
this.getTargetExpr(v, InferredType.time())

/** If this is null, returns the literal 0. */
lhstrh marked this conversation as resolved.
Show resolved Hide resolved
fun Expression?.orZero(): Expression =
this ?: LfFactory.eINSTANCE.createLiteral().apply { literal = "0" }
9 changes: 6 additions & 3 deletions org.lflang/src/org/lflang/generator/TargetTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import org.lflang.ASTUtils;
import org.lflang.InferredType;
import org.lflang.TimeUnit;
import org.lflang.TimeValue;
import org.lflang.lf.Action;
import org.lflang.lf.Code;
Expand Down Expand Up @@ -64,6 +63,10 @@ public interface TargetTypes {
String getTargetVariableSizeListType(String baseType);


default String getTargetParamRef(ParameterReference expr, InferredType typeOrNull) {
return escapeIdentifier(expr.getParameter().getName());
}

/**
* Return an "undefined" type which is used as a default
* when a type cannot be inferred.
Expand Down Expand Up @@ -232,7 +235,7 @@ default String getTargetExpr(Expression expr, InferredType type) {
if (ASTUtils.isZero(expr) && type != null && type.isTime) {
return getTargetTimeExpr(TimeValue.ZERO);
} else if (expr instanceof ParameterReference) {
return escapeIdentifier(((ParameterReference) expr).getParameter().getName());
return getTargetParamRef((ParameterReference) expr, type);
} else if (expr instanceof Time) {
return getTargetTimeExpr((Time) expr);
} else if (expr instanceof Literal) {
Expand All @@ -249,6 +252,6 @@ default String getTargetExpr(Expression expr, InferredType type) {
* target code.
*/
default String getTargetTimeExpr(Time t) {
return getTargetTimeExpr(new TimeValue(t.getInterval(), TimeUnit.fromName(t.getUnit())));
return getTargetTimeExpr(ASTUtils.toTimeValue(t));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import org.lflang.generator.PrependOperator
import org.lflang.isBank
import org.lflang.isMultiport
import org.lflang.hasMultipleConnections
import org.lflang.joinWithLn
import org.lflang.lf.*

/**
Expand Down Expand Up @@ -175,9 +176,9 @@ class CppAssembleMethodGenerator(private val reactor: Reactor) {
"""
|// connection $idx
|std::vector<$portType> __lf_left_ports_$idx;
${" |"..c.leftPorts.joinToString("\n") { addAllPortsToVector(it, "__lf_left_ports_$idx") }}
${" |"..c.leftPorts.joinWithLn { addAllPortsToVector(it, "__lf_left_ports_$idx") }}
|std::vector<$portType> __lf_right_ports_$idx;
${" |"..c.rightPorts.joinToString("\n") { addAllPortsToVector(it, "__lf_right_ports_$idx") }}
${" |"..c.rightPorts.joinWithLn { addAllPortsToVector(it, "__lf_right_ports_$idx") }}
|lfutil::bind_multiple_ports(__lf_left_ports_$idx, __lf_right_ports_$idx, ${c.isIterated});
""".trimMargin()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class CppInstanceGenerator(
}

fun generateConstructorInitializers() =
reactor.instantiations.filter { it.isBank }.joinToString("\n") { generateConstructorInitializer(it) }
reactor.instantiations.filter { it.isBank }.joinWithLn { generateConstructorInitializer(it) }

/** Generate constructor initializers for all reactor instantiations */
fun generateInitializers(): String =
Expand Down
5 changes: 3 additions & 2 deletions org.lflang/src/org/lflang/generator/cpp/CppPortGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ package org.lflang.generator.cpp

import org.lflang.inferredType
import org.lflang.isMultiport
import org.lflang.joinWithLn
import org.lflang.lf.Input
import org.lflang.lf.Output
import org.lflang.lf.Port
Expand Down Expand Up @@ -89,8 +90,8 @@ class CppPortGenerator(private val reactor: Reactor) {
}

fun generateConstructorInitializers() =
reactor.inputs.filter { it.isMultiport }.joinToString("\n") { generateConstructorInitializer(it) } +
reactor.outputs.filter { it.isMultiport }.joinToString("\n") { generateConstructorInitializer(it) }
reactor.inputs.filter { it.isMultiport }.joinWithLn { generateConstructorInitializer(it) } +
reactor.outputs.filter { it.isMultiport }.joinWithLn { generateConstructorInitializer(it) }

fun generateDeclarations() =
reactor.inputs.joinToString("\n", "// input ports\n", postfix = "\n") { generateDeclaration(it) } +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ package org.lflang.generator.cpp

import org.lflang.generator.PrependOperator
import org.lflang.isBank
import org.lflang.joinWithLn
import org.lflang.label
import org.lflang.lf.*
import org.lflang.priority
Expand Down Expand Up @@ -193,15 +194,15 @@ class CppReactionGenerator(
}

private fun generateViews(r: Reaction) =
r.allReferencedContainers.joinToString("\n") { generateViewForContainer(r, it) }
r.allReferencedContainers.joinWithLn { generateViewForContainer(r, it) }

private fun generateViewInitializers(r: Reaction) =
r.allReferencedContainers.filterNot { it.isBank }
.joinToString("\n") { ", ${r.getViewInstanceName(it)}(${it.name}.get()) " }
.joinWithLn { ", ${r.getViewInstanceName(it)}(${it.name}.get()) " }

private fun generateViewConstructorInitializers(r: Reaction) =
r.allReferencedContainers.filter { it.isBank }
.joinToString("\n") {
.joinWithLn {
val viewInstance = r.getViewInstanceName(it)
"""
$viewInstance.reserve(${it.name}.size());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.lflang.generator.cpp

import org.lflang.generator.PrependOperator
import org.lflang.joinWithLn
import org.lflang.toUnixString
import java.nio.file.Path

Expand Down Expand Up @@ -30,7 +31,7 @@ class CppRos2PackageGenerator(generator: CppGenerator, private val nodeName: Str
| <buildtool_depend>ament_cmake</buildtool_depend>
| <buildtool_depend>ament_cmake_auto</buildtool_depend>
|
${" |"..dependencies.joinToString("\n") { "<depend>$it</depend>" } }
${" |"..dependencies.joinWithLn { "<depend>$it</depend>" } }
|
| <test_depend>ament_lint_auto</test_depend>
| <test_depend>ament_lint_common</test_depend>
Expand Down Expand Up @@ -71,7 +72,7 @@ class CppRos2PackageGenerator(generator: CppGenerator, private val nodeName: Str
|
|ament_auto_add_library($S{LF_MAIN_TARGET} SHARED
| src/$nodeName.cc
${" | "..sources.joinToString("\n") { "src/$it" }}
${" | "..sources.joinWithLn { "src/$it" }}
|)
|ament_target_dependencies($S{LF_MAIN_TARGET} ${dependencies.joinToString(" ")})
|target_include_directories($S{LF_MAIN_TARGET} PUBLIC
Expand All @@ -94,7 +95,7 @@ class CppRos2PackageGenerator(generator: CppGenerator, private val nodeName: Str
|
|ament_auto_package()
|
${" |"..(includeFiles?.joinToString("\n") { "include(\"$it\")" } ?: "")}
${" |"..(includeFiles?.joinWithLn { "include(\"$it\")" } ?: "")}
""".trimMargin()
}
}
Expand All @@ -109,4 +110,4 @@ class CppRos2PackageGenerator(generator: CppGenerator, private val nodeName: Str
|ros2 run ${fileConfig.name} ${fileConfig.name}_exe
""".trimMargin()
}
}
}
Loading