Git Product home page Git Product logo

rd's Introduction

RD

official JetBrains project Maven Central

Reactive Distributed communication framework for .NET, Kotlin and C++ (experimental). Inspired by JetBrains Rider IDE.

Structure

The framework contains several libraries for single process usage and cross-process communication.

Lifetimes

JetBrains Core library for graceful disposal, concurrency and reactive programming. For single-process usage.

RdFramework

JetBrains Networking library for reactive distributed communication

RdFramework.Reflection

Plugin for RdFramework used for defining models using regular C#

RdGen

Rd Generator: generates stubs (Kotlin/C#/C++) classes by Kotlin DSL models

How to build

Firstly decide which languages will be involved in the protocol. It may be Kotlin and C#, Rider uses them for instance. Or C++ only, who knows. After that prepare the environment and build needed assemblies. Choose separate or common build based on needs.

Separate build

.NET

Open solution in JetBrains Rider: https://github.com/JetBrains/rd/tree/HEAD/rd-net/Rd.sln

Requirements

  • .NET Framework >= 3.5

Console build instructions

  • dotnet build rd-net/Rd.sln

Kotlin

Open the project in IntelliJ IDEA: https://github.com/JetBrains/rd

Requirements

  • Gradle 6.2.2
  • Kotlin 1.3.61

Console build instructions

  • ./gradlew :build -x test

C++ (experimental)

Open the project in CLion: https://github.com/JetBrains/rd/tree/HEAD/rd-cpp

Requirements

  • git
  • cmake
  • Visual Studio 2015+ or
  • clang 6.0+

Console build instructions

  • cd rd-cpp
  • ./build.cmd

or

  • gradle :rd-cpp:build -x test

Build everything

  • ./gradlew build

Build NuGet packages instructions

To build packages locally please use: rd-kt/rd-gen/pack.sh

* Right now it works only on Linux. Please use Docker for Windows or macOS.

Run tests (Kotlin part only)

On a local computer

Don't forget to set TEAMCITY_VERSION=1 (temporary measure for now) before running any tests.

$ ./gradlew build

In a Docker container

$ docker build . -t rd && docker rm rd && docker run -it --name rd rd

To run particular tests (e.g. :rd-gen:test):

$ docker build . -t rd && docker rm rd && docker run -it --name rd rd --entrypoint ./gradlew :rd-gen:test

To extract test results afterwards:

$ docker cp rd:/rd/rd-kt/rd-gen/build/reports/ T:\Temp\reports

How to generate models (stubs)

Generate models in each language you have chosen. For this purpose project :rd-gen must be built.

Instruction

See https://www.jetbrains.com/help/resharper/sdk/Rider.html#protocol-extension for more details.

More examples of models

See com.jetbrains.rd.generator.test.cases.generator.demo.DemoModel and com.jetbrains.rd.generator.test.cases.generator.example.ExampleModel

How to connect processes

Generally, it depends on the architecture. But in standard Client-Server architecture through localhost connection framework's classes are suitable.

C#

JetBrains.Rd.Impl.Server and *.Client respectively

Kotlin

com.jetbrains.rd.framework.Server and *.Client respectively

C++

rd::SocketWire::Server and *.Client respectively

Examples of connections

Look at cross tests

  • com.jetbrains.rd.framework.test.cross at Kotlin side
  • Test.RdCross at C# side
  • rd::cross at C++ side

License

Rd is licensed under the Apache 2.0 license. Rd distributions may include third-party software licensed separately; see THIRD-PARTY-NOTICES for details.

rd's People

Contributors

aloraman avatar andreyg avatar controlflow avatar decoyrs avatar denis417 avatar denofevil avatar epeshk avatar estrizhok avatar fornever avatar iliya-usov avatar ivanpashchenko avatar k15tfu avatar knah avatar korifey avatar krasnotsvetov avatar mfilippov avatar mirasrael avatar nerzhulart avatar nicklyu avatar operasfantom avatar pavelyatcheniy avatar seclerp avatar sergeyqx avatar serjic avatar shalupov avatar slavam2605 avatar ulex avatar vlomshakov avatar yole avatar yvvan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rd's Issues

Lifetimes are awesome!!!

When seen that first time just fall in love =) Use lifetimes in maui application, wanted use signals (cause it force to use lifetime to advice), but had to switch back to Rx.NET just because observables can be completed. So I integrated lifetimes to observables and for now it looks so:

    _someObservable.Subscribe(lifetime, action);

or

    _someObservable.Subscribe(action).DisposeWith(lifetime);

So now its a charm to manage disposable cause before it was a pain (you know)

private IDisposable? _sub;

private void Foo()
{
    _sub?.Dispose(); 
    _sub = _someObservable.Subscribe(action)
}

public void Dispose()
{
    _sub?.Dispose()
}

And thats only when one disposable =), also SequentialLifetimes useful too.
No issues just wanted to say thanks for ur work!

Serializers.register() throws exception when models have same names

If you define a model with name already defined in another plugin you get an exception from

val id = serializer.id
val existing = marshallers[id]
if (existing != null) {
require(existing.fqn == serializer.fqn) { "Can't register ${serializer.fqn} with id: $id, already registered: ${serializer.fqn}" }

because serializer.id has default value based on model name
val id : RdId
get() = RdId(_type.simpleName.getPlatformIndependentHash())

I had to rename my model

Viewable list of immutable lists generate same IDs

If I have a class with the following member: list("children", immutableList(SomeModel)) and then I add immutable lists to this viewable list, I get such exceptions:

java.lang.IllegalStateException: Value com.jetbrains.rd.platform.codeWithMe.protocol.SecureWireOverStreamTransport$advise$wrapper$1@230e006f already exist for key 972796847982467169
	at com.jetbrains.rd.util.CollectionExKt$blockingPutUnique$1.invoke(CollectionEx.kt:37)
	at com.jetbrains.rd.util.CollectionExKt$blockingPutUnique$1.invoke(CollectionEx.kt)
	at com.jetbrains.rd.util.lifetime.LifetimeDefinition.executeIfAlive(RLifetime.kt:401)
	at com.jetbrains.rd.util.CollectionExKt.blockingPutUnique(CollectionEx.kt:35)
	at com.jetbrains.rd.framework.MessageBroker.adviseOn(MessageBroker.kt:142)
	at com.jetbrains.rd.platform.codeWithMe.protocol.SecureWireOverStreamTransport.advise(SecureWireOverStreamTransport.kt:81)
	at com.jetbrains.rd.framework.base.ExtWire.advise(RdExtBase.kt:175)
	at com.jetbrains.rd.framework.impl.RdCall.init(RdTask.kt:201)
	at com.jetbrains.rd.framework.base.RdBindableBase$bind$4.invoke(RdBindableBase.kt:80)
	at com.jetbrains.rd.framework.base.RdBindableBase$bind$4.invoke(RdBindableBase.kt:18)
	at com.jetbrains.rd.util.reactive.Signal$Companion.priorityAdviseSection(Signal.kt:14)
	at com.jetbrains.rd.framework.base.RdBindableBase.bind(RdBindableBase.kt:79)
	at com.jetbrains.rd.framework.base.IRdBindableKt.bindPolymorphic(IRdBindable.kt:55)
	at com.jetbrains.rd.framework.base.RdBindableBase.init(RdBindableBase.kt:115)
	at com.jetbrains.rd.framework.base.RdBindableBase$bind$4.invoke(RdBindableBase.kt:80)
	at com.jetbrains.rd.framework.base.RdBindableBase$bind$4.invoke(RdBindableBase.kt:18)
	at com.jetbrains.rd.util.reactive.Signal$Companion.priorityAdviseSection(Signal.kt:14)
	at com.jetbrains.rd.framework.base.RdBindableBase.bind(RdBindableBase.kt:79)
	at com.jetbrains.rd.framework.base.IRdBindableKt.bindPolymorphic(IRdBindable.kt:59)
	at com.jetbrains.rd.framework.impl.RdList$init$2.invoke(RdList.kt:74)
	at com.jetbrains.rd.framework.impl.RdList$init$2.invoke(RdList.kt:19)
	at com.jetbrains.rd.util.reactive.IViewableList$view$2.invoke(ViewableCollections.kt:227)
	at com.jetbrains.rd.util.reactive.IViewableList$view$2.invoke(ViewableCollections.kt:152)
	at com.jetbrains.rd.util.reactive.IViewableList$adviseAddRemove$1.invoke(ViewableCollections.kt:187)
	at com.jetbrains.rd.util.reactive.IViewableList$adviseAddRemove$1.invoke(ViewableCollections.kt:152)
	at com.jetbrains.rd.util.reactive.Signal.fire(Signal.kt:31)
	at com.jetbrains.rd.util.reactive.ViewableList.add(ViewableList.kt:25)
	at com.jetbrains.rd.framework.impl.RdList.onWireReceived(RdList.kt:96)
	at com.jetbrains.rd.platform.codeWithMe.protocol.SecureWireOverStreamTransport$advise$wrapper$1.onWireReceived(SecureWireOverStreamTransport.kt:77)
	at com.jetbrains.rd.framework.MessageBroker$invoke$2$2.invoke(MessageBroker.kt:56)
	at com.jetbrains.rd.framework.MessageBroker$invoke$2$2.invoke(MessageBroker.kt:11)
	at com.jetbrains.rd.framework.impl.ProtocolContexts.readMessageContextAndInvoke(ProtocolContexts.kt:151)
	at com.jetbrains.rd.framework.MessageBroker$invoke$2.invoke(MessageBroker.kt:55)
	at com.jetbrains.rd.framework.MessageBroker$invoke$2.invoke(MessageBroker.kt:11)
	at com.jetbrains.rdclient.protocol.RdDispatcher.flushAll(RdDispatcher.kt:96)
	at com.jetbrains.rdclient.protocol.RdDispatcher.access$flushAll(RdDispatcher.kt:17)
	at com.jetbrains.rdclient.protocol.RdDispatcher$flushAllRunnable$1.run(RdDispatcher.kt:22)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:218)
	at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:200)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:783)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:320)
	at com.intellij.codeWithMe.ClientId$Companion.withClientId(ClientId.kt:135)
	at com.intellij.codeWithMe.ClientId.withClientId(ClientId.kt)
	at com.intellij.openapi.application.impl.FlushQueue.doRun$$$capture(FlushQueue.java:81)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189)
	at java.desktop/java.awt.event.InvocationEvent.dispatch$$$capture(InvocationEvent.java:313)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:898)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:775)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:439)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:438)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:783)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:486)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Generator fails when `./build/rdgen/.rdgen` doesn't exist

>> Generating: 2 filtered generators
Invoke CSharp50Generator(defaultFlowTransform=Reversed, defaultNamespace='JetBrains.Rider.Model', folder=/Users/eugene/Developer/resharper-fsharp/ReSharper.FSharp/src/FSharp.ProjectModelBase/src/Protocol) on root `IdeRoot`, clearFolder=false
Invoke Kotlin11Generator(flowTransform=AsIs, defaultNamespace='com.jetbrains.rider.model', folder=/Users/eugene/Developer/resharper-fsharp/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/protocol) on root `IdeRoot`, clearFolder=false
Generation finished in 423 ms
Storing hash into 'build/rdgen/.rdgen'

> Task :rdgen FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':rdgen'.
> java.io.FileNotFoundException: build/rdgen/.rdgen (No such file or directory)

A workaround is creating an empty ./build/rdgen/.rdgen file.

Is there some additional information I can provide?

eugene@Eugenes-MacBook:rider-fsharp$ java --version
java 12.0.2 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2+10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)

Inheritor of openstruct is deserealized to it's base struct

I have the following model:

object BuildModel: Ext(IdeRoot) {
  val buildEventModel = openstruct {
    field("id", string)
    field("message", string)
  }

  val startBuildEventModel = structdef extends buildEventModel {
    field("buildDescriptor", buildDescriptorModel)
  }

  val buildDescriptorModel = structdef {
    field("id", string)
    field("title", string)
    field("workingDir", string)
    field("startTime", long)
  }

  init {
    signal("buildEvent", buildEventModel).async
  }
}

I push a StartBuildEventModel to the signal from one side and I get a BuildEventModel on the other side.

IReadonlyProperty<R> Select<T, R> (.net)

MappedProperty ะฟั€ะธ Advise ะฝะต ัะพะฑะปัŽะดะฐะตั‚ ะฟะพะฒะตะดะตะฝะธะต IReadonlyProperty, ะฐ ะธะผะตะฝะฝะพ ะฝะต ะฒั‹ะทั‹ะฒะฐะตั‚ handler, ะตัะปะธ ะทะฝะฐั‡ะตะฝะธะต ัƒะถะต ะตัั‚ัŒ.

var test = new ViewableProperty<string>("Hello");
test.Select(x => x + " world!").Advise(Lifetime.Eternal, Debug.Log);
test.Advise(Lifetime.Eternal, Debug.Log);

ะ ะตะทัƒะปัŒั‚ะฐั‚: ะฒั‹ะฒะพะดะธั‚ัŒัั ั‚ะพะปัŒะบะพ "Hello"
ะžะถะธะดะฐะตั‚ัั: ะฒั‹ะฒะพะดัั‚ัŒัั ะบะฐะบ "Hello", ั‚ะฐะบ ะธ "Hello world!"

Empty constructor for models with fields with default constructor

Empty constructor for RdWrapper is expected using this model

val RdContent = classdef {
    property("myProperty", string)
    field("myField", string).default("Default")
}

val RdWrapper = classdef {
    field("content", RdContent)
}

but RdContent should be explicitly passed as argument: RdWrapper(RdContent()).

RdWrapper should have empty constructor because myProperty is property and myField has default value.

Make Signal thread-safe

Current Signal implementation use a thread-unsafe LifetimedList as a backend. There are some exception-protecting mechanisms in LifetimedLists, which significantly reduce the probability of exception during Advise/Fire, but they can't protect in all cases. Since it is allowed to use arbitrary schedulers for RdSignal, reliable thread-safe solution is required here.

Sample test to violate existing implementation:

[Test]
public async Task TestSignalStress()
{
  var sig = new Signal<bool>();
  using (var run = new LifetimeDefinition())
  {
    var lt = run.Lifetime;
    var sw = Stopwatch.StartNew();
    var fireTask = Task.Run(() =>
    {
      while (sw.ElapsedMilliseconds < 500 && lt.IsAlive) 
        sig.Fire(true);
    }, lt);

    Parallel.For(0, 100000, i =>
    {
      using (var ld = new LifetimeDefinition())
        sig.Advise(ld.Lifetime, x => { });
    });

    await fireTask;
  }
}

Community support/help chanel?

I'm glad to find out that RD is open source. But there is almost no documentation. Can you give your advice on what is the best way to get some more info and/or help?
Is there some sort of community support to encourage adoption of RD? Is there a means like Slack channel, forum etc?

I want to evaluate JetBrains RD as a potential basis for integrating JetBrains MPS with our in-house created .NET modelling environment. Our use case seems quite similar to Rider, the context n which RD was created.

QueueProcessorTest.test1 is flaky

I have observed com.jetbrains.rd.util.test.cases.QueueProcessorTest.test1 failure on Linux. Here's the stack trace, test logs + stdout are attached below (see file rd-kt/rd-core/build/reports/tests/test/index.html in the archive).

org.opentest4j.AssertionFailedError: expected: <[1]> but was: <[1, 2, 3]>
	at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
	at org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62)
	at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182)
	at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:177)
	at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1124)
	at com.jetbrains.rd.util.test.cases.QueueProcessorTest.test1(QueueProcessorTest.kt:34)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:205)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:201)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:829)

tests-log.Linux.zip

global.json in rd-net is not found with .NET 7.0.202 SDK

Current root global.json file cannot be parsed when .NET 7.0.202 SDK is installed. As a result:

  • It is not used and .NET 7.0.202 itself is used by default for dotnet build rd-net/Rd.sln
  • Building Rd.sln with .NET 7.0.202 causes a bunch of the following errors:
error NU1605: Warning As Error: Detected package downgrade:
Microsoft.NETFramework.ReferenceAssemblies.net472 from 1.0.3 to 1.0.2. Reference the package directly from the project
to select a different version.

dotnet --info output in rd-net directory:

PS C:\repos\rd-master\rd-net> dotnet --info
.NET SDK:
 Version:   7.0.202
 Commit:    6c74320bc3

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.22000
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\7.0.202\

Host:
  Version:      7.0.4
  Architecture: x64
  Commit:       0a396acafe

.NET SDKs installed:
  6.0.406 [C:\Program Files\dotnet\sdk]
  7.0.101 [C:\Program Files\dotnet\sdk]
  7.0.202 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.14 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.14 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 6.0.14 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

Proposed solution:
Change the global.json file content as follows:

{
  "sdk": {
    "version": "6.0.100",
    "rollForward": "major"
  }
}

With such file the solution is build successfully

Support types that present contiguous region of memory

While working with large amount of text data such as logs, I have to use tasks of string frequently. Moreover, these tasks takes substring of large string as parameter. So, I have to create new instance of string on each invokation just for passing to the model. Would be better to use such clases as CharSequence in Kotiln and Memory in C# in terms of perfomance? Anyway, framework doesn't support that types at the moment

Need stacktraces for error "Can't wait for executeIfAlive for more than 500 ms."

I am getting this error during the tests: Can't wait for executeIfAlive for more than 500 ms.
frontend.log

I think it is from this code:

log.error { "Can't wait for executeIfAlive for more than $waitForExecutingInTerminationTimeout ms. Keep termination." }

Need to add stacktrace to that error in the log.

https://jetbrains.slack.com/archives/GH9S2GGRG/p1589581429434400

ViewableProperty<T>.Value equality

Hi! What are the reasons for using a Object.Equals(a,b) instead of using EqualityComparer<T>.Default in ViewableProperty<T>.Value setter? Using EqualityComparer<T>.Default is more efficient and flexible

Avoid duplicates in case of reconnection

Test.RdFramework.SocketWireTest.TestDisconnect test may fail because it expects to receive 1, 2, 3, 4, 5, 6 in RdSignal on server side, but due to asynchronous acknowledgement some values may be duplicated when connection dropped before server acknowledge received values.

Maybe it is expected behavior for RdSignal, but not sure that for RdProperty too. Currently, test fails even with RdProperty (but not with RdList, so I added the similar test with RdList)

Gradle plugin fails on Windows/Linux with Gradle 6.6

It was working on Gradle 6.5

Error:

> Task :jetbrains-rider:generateAwsProjectModel
Reading hash from D:\aws-toolkit-jetbrains\jetbrains-rider\build\rdgen\.rdgen
Hashes are different at key 'file: C:\Users\<user>\.gradle\caches\modules-2\files-2.1\com.jetbrains.rd\rd-gen\0.193.146\38e03009032d0ea8ff19183cb90afdca3e6f09e3\rd-gen-0.193.146.jar', oldHash: 2020-05-19_09:12:06.2
80, newHash:
Temporary folder created: C:\Users\<user>\AppData\Local\Temp\rdgen-16595563179377353196
Searching for Kotlin compiler
Compiling sources from 'D:\aws-toolkit-jetbrains\jetbrains-rider\protocol\model\project' to 'C:\Users\<user>\AppData\Local\Temp\rdgen-16595563179377353196'
User classpath: 'D:\aws-toolkit-jetbrains\jetbrains-rider\build\riderRD-2019.3.4\lib\rd\rider-model.jar'
Rdgen default classpath: 'C:\Users\<user>\.gradle\caches\jars-8\c0a48cb2f5b7c3e7dd64ce031908edd4\rd-gen-0.193.146.jar;C:\Users\<user>\.gradle\caches\jars-8\b286736391573ccfb4d4a500279a066b\kotlin-stdlib-jdk8-1.3.
70.jar;C:\Users\<user>\.gradle\caches\jars-8\1e6c5a27e924f3498df588a40253ce5a\kotlin-stdlib-jdk7-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\1be4573a90e903c998485b49504b2e84\kotlin-reflect-1.3.50.jar;C:\User
s\<user>\.gradle\caches\jars-8\a87785aaeadbb9423aaef6ceba52a690\kotlin-stdlib-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\6318226462ad1e7ffc43ccf52d56b099\kotlin-stdlib-common-1.3.70.jar;C:\Users\<user>\.g
radle\caches\jars-8\a4fe510e7beb8b97871b47d87c0bd50b\kotlin-compiler-embeddable-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\dde97575a599bd3e140dd938a7aed4fa\kotlin-reflect-1.3.72.jar;C:\Users\<user>\.gradle\
caches\jars-8\6e1c96bc5e566162587181c85dab9756\kotlin-scripting-jvm-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\b7970a59300ebc4e2f7887783c16e693\kotlin-scripting-common-1.3.70.jar;C:\Users\<user>\.gradle\cac
hes\jars-8\768cf1021ee3bdc425b9b2ae1289f2f1\kotlin-stdlib-jdk8-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\421b0c68a25f5d684ea66be525dfcf66\kotlin-stdlib-jdk7-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8
\70d15c94187de212f9a927dc262ddd63\kotlin-stdlib-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\18e6bc6874baa1a066bce674522f54bf\kotlin-stdlib-common-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\b2c292c88723
c40ac5c567f0ca5e67c6\kotlin-script-runtime-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\65abeebf44db8fc52a0efcfb702739ec\kotlin-compiler-1.3.50.jar;C:\Users\<user>\.gradle\caches\jars-8\e6f0c38292333779074fe9
18cc0ffc34\kotlin-script-runtime-1.3.50.jar'
Resulting kotlinc classpath: 'D:\aws-toolkit-jetbrains\jetbrains-rider\build\riderRD-2019.3.4\lib\rd\rider-model.jar;C:\Users\<user>\.gradle\caches\jars-8\c0a48cb2f5b7c3e7dd64ce031908edd4\rd-gen-0.193.146.jar;C:\Us
ers\<user>\.gradle\caches\jars-8\b286736391573ccfb4d4a500279a066b\kotlin-stdlib-jdk8-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\1e6c5a27e924f3498df588a40253ce5a\kotlin-stdlib-jdk7-1.3.70.jar;C:\Users\alfred
br\.gradle\caches\jars-8\1be4573a90e903c998485b49504b2e84\kotlin-reflect-1.3.50.jar;C:\Users\<user>\.gradle\caches\jars-8\a87785aaeadbb9423aaef6ceba52a690\kotlin-stdlib-1.3.70.jar;C:\Users\<user>\.gradle\caches\j
ars-8\6318226462ad1e7ffc43ccf52d56b099\kotlin-stdlib-common-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\a4fe510e7beb8b97871b47d87c0bd50b\kotlin-compiler-embeddable-1.3.70.jar;C:\Users\<user>\.gradle\caches\j
ars-8\dde97575a599bd3e140dd938a7aed4fa\kotlin-reflect-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\6e1c96bc5e566162587181c85dab9756\kotlin-scripting-jvm-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\b7970a
59300ebc4e2f7887783c16e693\kotlin-scripting-common-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\768cf1021ee3bdc425b9b2ae1289f2f1\kotlin-stdlib-jdk8-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\421b0c68a25
f5d684ea66be525dfcf66\kotlin-stdlib-jdk7-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\70d15c94187de212f9a927dc262ddd63\kotlin-stdlib-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\18e6bc6874baa1a066bce67452
2f54bf\kotlin-stdlib-common-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\b2c292c88723c40ac5c567f0ca5e67c6\kotlin-script-runtime-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\65abeebf44db8fc52a0efcfb702739e
c\kotlin-compiler-1.3.50.jar;C:\Users\<user>\.gradle\caches\jars-8\e6f0c38292333779074fe918cc0ffc34\kotlin-script-runtime-1.3.50.jar'
kotlinc -cp D:\aws-toolkit-jetbrains\jetbrains-rider\build\riderRD-2019.3.4\lib\rd\rider-model.jar;C:\Users\<user>\.gradle\caches\jars-8\c0a48cb2f5b7c3e7dd64ce031908edd4\rd-gen-0.193.146.jar;C:\Users\<user>\.grad
le\caches\jars-8\b286736391573ccfb4d4a500279a066b\kotlin-stdlib-jdk8-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\1e6c5a27e924f3498df588a40253ce5a\kotlin-stdlib-jdk7-1.3.70.jar;C:\Users\<user>\.gradle\caches\
jars-8\1be4573a90e903c998485b49504b2e84\kotlin-reflect-1.3.50.jar;C:\Users\<user>\.gradle\caches\jars-8\a87785aaeadbb9423aaef6ceba52a690\kotlin-stdlib-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\6318226462ad
1e7ffc43ccf52d56b099\kotlin-stdlib-common-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\a4fe510e7beb8b97871b47d87c0bd50b\kotlin-compiler-embeddable-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\dde97575a599
bd3e140dd938a7aed4fa\kotlin-reflect-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\6e1c96bc5e566162587181c85dab9756\kotlin-scripting-jvm-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\b7970a59300ebc4e2f788778
3c16e693\kotlin-scripting-common-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\768cf1021ee3bdc425b9b2ae1289f2f1\kotlin-stdlib-jdk8-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\421b0c68a25f5d684ea66be525dfc
f66\kotlin-stdlib-jdk7-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\70d15c94187de212f9a927dc262ddd63\kotlin-stdlib-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\18e6bc6874baa1a066bce674522f54bf\kotlin-stdl
ib-common-1.3.72.jar;C:\Users\<user>\.gradle\caches\jars-8\b2c292c88723c40ac5c567f0ca5e67c6\kotlin-script-runtime-1.3.70.jar;C:\Users\<user>\.gradle\caches\jars-8\65abeebf44db8fc52a0efcfb702739ec\kotlin-compiler-
1.3.50.jar;C:\Users\<user>\.gradle\caches\jars-8\e6f0c38292333779074fe918cc0ffc34\kotlin-script-runtime-1.3.50.jar -d C:\Users\<user>\AppData\Local\Temp\rdgen-16595563179377353196 -jvm-target 1.8 D:\aws-toolkit-j
etbrains\jetbrains-rider\protocol\model\project
warning: unable to find kotlin-stdlib.jar in the Kotlin home directory. Pass either '-no-stdlib' to prevent adding it to the classpath, or the correct '-kotlin-home'
warning: unable to find kotlin-script-runtime.jar in the Kotlin home directory. Pass either '-no-stdlib' to prevent adding it to the classpath, or the correct '-kotlin-home'
warning: unable to find kotlin-reflect.jar in the Kotlin home directory. Pass either '-no-reflect' or '-no-stdlib' to prevent adding it to the classpath, or the correct '-kotlin-home'
exception: java.lang.NoClassDefFoundError: javaslang/?
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoImpl.<clinit>(DataFlowInfoImpl.kt:341)
        at org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory.<clinit>(DataFlowInfo.kt:104)
        at org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo$Companion.<clinit>(DataFlowInfo.kt:98)
        at org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo.<clinit>(DataFlowInfo.kt)
        at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer.analyzeDeclarations$default(LazyTopDownAnalyzer.kt:60)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:112)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:82)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:554)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:81)
        at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:545)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:176)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:163)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:51)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:85)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:43)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:82)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:50)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at com.jetbrains.rd.generator.nova.RdGen.compile0(RdGen.kt:106)
        at com.jetbrains.rd.generator.nova.RdGen.compileDsl(RdGen.kt:146)
        at com.jetbrains.rd.generator.nova.RdGen.run(RdGen.kt:284)
        at com.jetbrains.rd.generator.gradle.RdgenTask.run(RdgenPlugin.kt:116)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:570)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:555)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:538)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:279)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:268)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at java.base/java.util.Optional.orElseGet(Optional.java:369)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at java.base/java.util.Optional.map(Optional.java:265)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at java.base/java.util.Optional.orElseGet(Optional.java:369)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:195)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:187)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: javaslang.?
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 157 more

Compilation finished in 3515 ms
Compilation failed. Return code: 2(INTERNAL_ERROR).

Usage: java -cp [CLASSPATH] com.jetbrains.rd.generator.nova.MainKt [OPTION]...
RD Generator, v1.07. Search for inheritors of 'com.jetbrains.rd.generator.nova.Toplevel' and generate sources according generators: inheritors of 'com.jetbrains.rd.generator.nova.IGenerator'.

Options:
  -s, --source=<source>     Folders with dsl .kt files. If not present, scan classpath for inheritors of 'com.jetbrains.rd.generator.nova.Toplevel'
  -h, --hash-folder=<hash-folder>Folder to store hash file '.rdgen' for incremental generation; default: C:\Users\<user>\.gradle\daemon\6.6
      --compiled=<compiled> Folder for compiled dsl. Temporary folder is created if option is not specified.
  -c, --compiler-classpath=<compiler-classpath>Classpath for kotlin compiler. You must specify it if you referenced something from your dsl
  -f, --force               Suppress incremental generation.
  -x, --clear               Clear output folder before generation (if it is not incremental)
  -p, --packages=<packages> Java package names to search toplevels, delimited by ','. Example: com.jetbrains.rd.model.nova; default: com,org
      --filter=<filter>     Filter generators by searching regular expression inside generator class simple name (case insensitive). Example: kotlin|csharp|cpp
  -v, --verbose             Verbose output

I tried switching to kotlin-compler-embedded as a dependency but that did not help.

I also tried a custom Gradle task that uses project.javaexec and custom configuration to model the Rdgen dependency to invoke Rdgen as a CLI in order to isolate the classpath from Gradle, but it looks like the generators block was never modeled as a CLI argument.

Add constants

Would be really cool to Code Complete shared values from within languages supported by Rd Protocol

Support for pairs

Model from Rider for inspiration :)

classdef("TextControlTuple") {
    field("id", TextControlId)
    field("textControl", LastFocusedTextControl)
}

JetBrains.Lifetimes: System.ArrayTypeMismatchException

I am tried JetBrains.Lifetimes + Microsoft.Extensions.DependencyInjection for learn

I pass lifetime(struct) to the constructor of the objects being created by container and got strange error when I use .Bracket

it works 2 times correctly, and the third time an error.

System.ArrayTypeMismatchException: 'Attempted to access an element as a type incompatible with the array.'

Image 7

within JetBrains.Lifetimes (LifetimeDefinition.cs)

Image 5

Of course, I understand that lifetime is struct and it is not very correct to use it with IoC in this way, but I would like to understand the cause of the error.
Even if the IoC breaks the structure, but after all, lifetime only keeps a reference to the definition, to which the container has nothing to do.

I was unable to write test code with reproducible error, but I shrink project where it still reproduces

netcore 3.1, JetBrains.Lifetimes 2020.2.3 (or this repo), win 10 x64, WPF, vs2019

Help !! Support types that present contiguous region of memory

While working with large amount of text data such as logs, I have to use tasks of string frequently. Moreover, these tasks takes substring of large string as parameter. So, I have to create new instance of string on each invokation just for passing to the model. Would be better to use such clases as CharSequence in Kotiln and Memory in C# in terms of perfomance? Anyway, framework doesn't support that types at the moment..

www.mcdvoice.com

Weird code in rd-cpp SocketWire.cpp read_package()

In \src\rd_framework_cpp\src\main\wire\SocketWire.cpp
method int32_t SocketWire::Base::read_package() const
returns true in one case and ignores the status of send_ack(seqn);.
Need to compare with rd-net and handle accordingly

Inlined FrameworkMarshallers.create spawns more classes in Metaspace than you could imagine

object FrameworkMarshallers {
    inline fun <reified T : Any> create(crossinline reader: (AbstractBuffer) -> T, crossinline writer: (AbstractBuffer, T) -> Unit, predefinedId: Int? = null): UniversalMarshaller<T> {
        return UniversalMarshaller(T::class, { _, stream -> reader(stream) }, { _, stream, v -> writer(stream, v) }, predefinedId)
    }

Check this:

 { _, stream -> reader(stream) }

This means that for every callsite of FrameworkMarshallers.create there will be separate class created. Our JVM classloading logs for IntelliJ IDA shows clearly:

[1.35760] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$39
[1.35764] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$40 (2724 bytes)
[1.35772] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$40
[1.35778] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$41 (2583 bytes)
[1.35786] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$41
[1.35790] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$42 (2726 bytes)
[1.35797] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$42
[1.35803] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$43 (2585 bytes)
[1.35810] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$43
[1.35814] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$44 (2728 bytes)
[1.35820] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$44
[1.35826] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$45 (2581 bytes)
[1.35832] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$45
[1.35836] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$46 (2724 bytes)
[1.35844] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$46
[1.35849] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$47 (2587 bytes)
[1.35856] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$47
[1.35859] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$48 (2730 bytes)
[1.35866] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$48
[1.35900] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$49 (2667 bytes)
[1.35907] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$49
[1.35911] Loading class: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$50 (2794 bytes)
[1.35917] Class prepared: com/jetbrains/rd/framework/FrameworkMarshallers$special$$inlined$create$50

Fusion might be a good alternative to this :)

Hi guys, sorry for spamming here, but some of my friends send me links to this repository when I show them Fusion: https://github.com/servicetitan/Stl.Fusion - and honestly, I didn't dig deeply into rd, but it looks like at least a part of the goals are similar.

So just FYI, there is a fancy alternative to this framework. It's truly free (MIT license) & you can always reach its author if you'll end up using it. The framework is built mostly with web apps in mind, but nothing nothing prevents to use it anywhere.

Options like getting a live (online) presentation with Q/A are open as well :)

Kotlin: Mutable collections have methods to change them and not notify the protocol

Currently, there are some methods in mutable Rd collections (all implementors of IMutableViewableMap, IMutableViewableList, and IMutableViewableSet) that will modify the collections but won't trigger the accompanying action (such as taking a cookie, writing the value to the protocol etc.).

This is caused by two issues:

  1. Interface delegation (i.e. IMutableViewableMap<K, V> by map clause in the RdMap's inheritance list) will just call all the methods from the base object without wrapping them, if they aren't overridden in the implementing class. So, this delegation should be removed.
  2. Mutable collections in Kotlin expose members that allow indirect mutation of the collection: say, Map::entries: MutableCollection<Map.Entry>, or iterator: MutableIterator, or even MutableMap.MutableEntry.

Particularly problematic methods in this regard are variations of MutableList::addAll and MutableMap::putAll (soon to be fixed), but I'm not sure about a systematic solution, yet.

Need a way to define different termination timeout for nested lifetimes

We've tried to use Lifetime's async-features in dotMemory and DPA instead of our own implementation of AsyncLifetime and faced the problem: 500ms of current default timeout isn't enough for DM/DPA activities. While DM is standalone product we can solve this by globally overriding LifetimeDefinition.WaitForExecutingInTerminationTimeoutMs. But for DPA this way looks unacceptable because DPA works side-by-side with Rider/R#. So we need a way to define different termination timeout for nested lifetimes (associated with DPA components, for example).

Square complexity in Signal when using AdviseOnce pattern

If we call CurrentClientLifetime N times and then terminate lifetime of LocalCodeWithMeClientManager which removes a client we get a N^2 calls of ValueLifetime.ClearValueIfNotAlive

    public static Lifetime CurrentClientLifetime(this ICodeWithMeClientManager manager)
    {
      var clientId = ClientId.Current;
      var lifetimeDefinition = Lifetime.Define(Lifetime.Eternal, $"Lifetime of {clientId}");
      Log.Assert(manager.Clients.Contains(clientId), $"Client manager doesn't know about {clientId}");
      var lifetime = lifetimeDefinition.Lifetime;
      manager.Clients.Advise(lifetime, (addRemove, triggeredId) =>
      {
        if (addRemove == AddRemove.Remove && triggeredId == clientId)
        {
          lifetimeDefinition.Terminate();
        }
      });
      return lifetime;
    }
....
  public class LocalCodeWithMeClientManager : ICodeWithMeClientManager
  {
    public LocalCodeWithMeClientManager(Lifetime lifetime)
    {
      Clients.Add(ClientId.LocalId);
      lifetime.OnTermination(() => Clients.Remove(ClientId.LocalId));
    }

    public IViewableSet<ClientId> Clients { get; } = new ViewableSet<ClientId>();
  }

image
image

Possibility to generate model in several directories simultaneously

GradleGenerationSpec::directory in RdGenPlugin parses to single file name, which passed to generator. It doesn't allow to generate model to several output directories at the same time not to calling fun generator more than once. Even in this case rd-gen works repeatedly

Improving rd-cpp

This issue is a topic starter for a problem of distribution and integration of rd-cpp.
We have had multiple attempts to pack rd-cpp into dll's for easier distribution (and packing into nuget, easy my ass) to be able to use it inside RiderLink project (plugin for Unreal Engine).

We had next number of issues:

  1. Breaking ABI in STL between minor versions of toolchain (I'm looking at you, MSVC). Every breakage means adding new version of rd-cpp distribution;
  2. Need to pack both Release and Debug dll's (so all versions need to multiply by 2);
  3. Different toolchains not compatible between each other (again, need to multiply by N number of supported toolchains, so MSVC, Clang, GCC?)
    NUMBER_OF_BUILDS = NumberOfBrokenABIsNumOfToolchains2.
    If I recall correctly, dll's for 1 version of toolchain could eat up to 200 MBs which is insane.
    Personal opinion, it's a dead end.

If we're accpeting the state that we're not able to distribute rd-cpp in dll's, we need to be able to share it as a source package.
What are the requirements in this case:

  1. Option to add rd-cpp as a submodule w/o dependencies rd-kt, rd-net, rd-xxx
  2. Minimal CMakeLists.txt to add rd-cpp w/o tests
  3. Make it compatible with -no-exceptions and -no-rtti projects
  4. Add option to use custom allocators
    Optionals:
  5. Conan/vcxpkg integration

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.